SearchModal.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React, {
  2. useState, useCallback, useEffect,
  3. } from 'react';
  4. import Downshift from 'downshift';
  5. import { useRouter } from 'next/router';
  6. import { Modal, ModalBody } from 'reactstrap';
  7. import type { DownshiftItem } from '../interfaces/downshift';
  8. import { useSearchModal } from '../stores/search';
  9. import { SearchForm } from './SearchForm';
  10. import { SearchHelp } from './SearchHelp';
  11. import { SearchMethodMenuItem } from './SearchMethodMenuItem';
  12. import { SearchResultMenuItem } from './SearchResultMenuItem';
  13. const SearchModal = (): JSX.Element => {
  14. const [searchKeyword, setSearchKeyword] = useState('');
  15. const { data: searchModalData, close: closeSearchModal } = useSearchModal();
  16. const router = useRouter();
  17. const changeSearchTextHandler = useCallback((searchText: string) => {
  18. setSearchKeyword(searchText);
  19. }, []);
  20. const clickClearButtonHandler = useCallback(() => {
  21. setSearchKeyword('');
  22. }, []);
  23. const selectSearchMenuItemHandler = useCallback((url: string) => {
  24. closeSearchModal();
  25. router.push(url);
  26. }, [closeSearchModal, router]);
  27. useEffect(() => {
  28. if (!searchModalData?.isOpened) {
  29. setSearchKeyword('');
  30. }
  31. }, [searchModalData?.isOpened]);
  32. return (
  33. <Modal size="lg" isOpen={searchModalData?.isOpened ?? false} toggle={closeSearchModal}>
  34. <ModalBody>
  35. <Downshift
  36. onSelect={(selectedItem: DownshiftItem) => { selectSearchMenuItemHandler(selectedItem.url) }}
  37. >
  38. {({
  39. getInputProps,
  40. getItemProps,
  41. getMenuProps,
  42. highlightedIndex,
  43. }) => (
  44. <div>
  45. <SearchForm
  46. searchKeyword={searchKeyword}
  47. onChangeSearchText={changeSearchTextHandler}
  48. onClickClearButton={clickClearButtonHandler}
  49. getInputProps={getInputProps}
  50. />
  51. <ul {...getMenuProps()} className="list-unstyled">
  52. <div className="border-top mt-3 mb-3" />
  53. <SearchMethodMenuItem searchKeyword={searchKeyword} getItemProps={getItemProps} highlightedIndex={highlightedIndex} />
  54. <div className="border-top mt-3 mb-3" />
  55. <SearchResultMenuItem searchKeyword={searchKeyword} getItemProps={getItemProps} highlightedIndex={highlightedIndex} />
  56. </ul>
  57. </div>
  58. )}
  59. </Downshift>
  60. <SearchHelp />
  61. </ModalBody>
  62. </Modal>
  63. );
  64. };
  65. export default SearchModal;