SearchMethodMenuItem.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import React from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { useCurrentPagePath } from '~/stores/page';
  4. import type { GetItemProps } from '../interfaces/downshift';
  5. import { SearchMenuItem } from './SearchMenuItem';
  6. import styles from './SearchMethodMenuItem.module.scss';
  7. type Props = {
  8. activeIndex: number | null
  9. searchKeyword: string
  10. getItemProps: GetItemProps
  11. }
  12. export const SearchMethodMenuItem = (props: Props): JSX.Element => {
  13. const {
  14. activeIndex, searchKeyword, getItemProps,
  15. } = props;
  16. const { t } = useTranslation('commons');
  17. const { data: currentPagePath } = useCurrentPagePath();
  18. const shouldShowMenuItem = searchKeyword.trim().length > 0;
  19. return (
  20. <div className={`${styles['search-method-menu-item']} search-method-menu-item `}>
  21. { shouldShowMenuItem && (
  22. <div data-testid="search-all-menu-item">
  23. <SearchMenuItem
  24. index={0}
  25. isActive={activeIndex === 0}
  26. getItemProps={getItemProps}
  27. url={`/_search?q=${searchKeyword}`}
  28. >
  29. <span className="material-symbols-outlined fs-4 me-3">search</span>
  30. <span>{searchKeyword}</span>
  31. <div className="ms-auto">
  32. <span className="method-range-explain">{t('search_method_menu_item.search_in_all')}</span>
  33. </div>
  34. </SearchMenuItem>
  35. </div>
  36. )}
  37. <div data-testid="search-prefix-menu-item">
  38. <SearchMenuItem
  39. index={shouldShowMenuItem ? 1 : 0}
  40. isActive={activeIndex === (shouldShowMenuItem ? 1 : 0)}
  41. getItemProps={getItemProps}
  42. url={`/_search?q=prefix:${currentPagePath} ${searchKeyword}`}
  43. >
  44. <span className="material-symbols-outlined fs-4 me-3">search</span>
  45. <code>prefix: {currentPagePath}</code>
  46. <span className="ms-2">{searchKeyword}</span>
  47. <div className="ms-auto">
  48. <span className="method-range-explain">{t('search_method_menu_item.only_children_of_this_tree')}</span>
  49. </div>
  50. </SearchMenuItem>
  51. </div>
  52. { shouldShowMenuItem && (
  53. <SearchMenuItem
  54. index={2}
  55. isActive={activeIndex === 2}
  56. getItemProps={getItemProps}
  57. url={`/_search?q="${searchKeyword}"`}
  58. >
  59. <span className="material-symbols-outlined fs-4 me-2">search</span>
  60. <span>{`"${searchKeyword}"`}</span>
  61. <div className="ms-auto">
  62. <span className="method-range-explain">{t('search_method_menu_item.exact_mutch')}</span>
  63. </div>
  64. </SearchMenuItem>
  65. ) }
  66. </div>
  67. );
  68. };