import React, { useState, useCallback, useEffect, } from 'react'; import Downshift, { type DownshiftState, type StateChangeOptions } from 'downshift'; import { useRouter } from 'next/router'; import { Modal, ModalBody } from 'reactstrap'; import type { DownshiftItem } from '../interfaces/downshift'; import { useSearchModal } from '../stores/search'; import { SearchForm } from './SearchForm'; import { SearchHelp } from './SearchHelp'; import { SearchMethodMenuItem } from './SearchMethodMenuItem'; import { SearchResultMenuItem } from './SearchResultMenuItem'; const SearchModal = (): JSX.Element => { const [searchKeyword, setSearchKeyword] = useState(''); const { data: searchModalData, close: closeSearchModal } = useSearchModal(); const router = useRouter(); const changeSearchTextHandler = useCallback((searchText: string) => { setSearchKeyword(searchText); }, []); const selectSearchMenuItemHandler = useCallback((selectedItem: DownshiftItem) => { router.push(selectedItem.url); closeSearchModal(); }, [closeSearchModal, router]); const submitHandler = useCallback(() => { router.push(`/_search?q=${searchKeyword}`); closeSearchModal(); }, [closeSearchModal, router, searchKeyword]); const stateReducer = (state: DownshiftState, changes: StateChangeOptions) => { // Do not update highlightedIndex on mouse hover if (changes.type === Downshift.stateChangeTypes.itemMouseEnter) { return { ...changes, highlightedIndex: state.highlightedIndex, }; } return changes; }; useEffect(() => { if (!searchModalData?.isOpened) { setSearchKeyword(''); } }, [searchModalData?.isOpened]); return ( {({ getRootProps, getInputProps, getItemProps, getMenuProps, highlightedIndex, }) => (
search
)}
); }; export default SearchModal;