/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ /* eslint-disable react-hooks/exhaustive-deps */ import './search.scss'; import $ from 'jquery'; import React, { useEffect, useMemo, useState } from 'react'; import { AutocompleteState, createAutocomplete } from '@algolia/autocomplete-core'; import { EuiFieldText, EuiTextArea } from '@elastic/eui'; import DSLService from 'public/services/requests/dsl'; import { IQueryBarProps } from './search'; import { uiSettingsService } from '../../../../common/utils'; import { AutocompleteItem } from '../../../../common/constants/autocomplete'; interface AutocompleteProps extends IQueryBarProps { getSuggestions: ( base: string, query: string, dslService: DSLService, possibleCommands: Array<{ label: string }> ) => Promise; onItemSelect: any; isDisabled?: boolean; baseQuery: string; tabId: string; placeholder?: string; possibleCommands?: Array<{ label: string }>; append?: any; } export const Autocomplete = (props: AutocompleteProps) => { const { query, tempQuery, handleQueryChange, handleQuerySearch, dslService, getSuggestions, onItemSelect, isDisabled, baseQuery, tabId = '', placeholder = 'Enter PPL query', possibleCommands, append, } = props; const [autocompleteState, setAutocompleteState] = useState>({ collections: [], completion: null, context: {}, isOpen: false, query: tempQuery, activeItemId: null, status: 'idle', }); const appLogEvents = tabId.startsWith('application-analytics-tab'); const panelsFilter = tabId === 'panels-filter'; useEffect(() => { const searchBar = document.getElementById('autocomplete-textarea'); searchBar?.addEventListener('keydown', (e) => { const keyCode = e.which || e.keyCode; if (keyCode === 13 && e.shiftKey) { handleQuerySearch(); } return () => { $('#autocomplete-textarea').unbind('keydown'); }; }); }, []); const depArray = appLogEvents || panelsFilter ? [baseQuery, query, dslService, autocompleteState] : [baseQuery, query, dslService]; const autocomplete = useMemo(() => { return createAutocomplete< AutocompleteItem, React.BaseSyntheticEvent, React.MouseEvent, React.KeyboardEvent >({ openOnFocus: true, defaultActiveItemId: 0, onStateChange: ({ state }) => { setAutocompleteState({ ...state, }); handleQueryChange(state.query); }, initialState: { ...autocompleteState, query: query || '', }, getSources() { return [ { sourceId: 'querySuggestions', // eslint-disable-next-line no-shadow async getItems({ query }) { const suggestions = await getSuggestions( baseQuery, query, dslService, possibleCommands ); return suggestions; }, onSelect: ({ setQuery, item }) => { onItemSelect( { setQuery, item, }, dslService ); $('#autocomplete-textarea').blur(); $('#autocomplete-textarea').focus(); }, }, ]; }, }); }, depArray); const TextArea = panelsFilter ? EuiFieldText : EuiTextArea; return (