SearchOptionModal.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { useTranslation } from 'next-i18next';
  2. import { type FC, useCallback } from 'react';
  3. import { Modal, ModalBody, ModalHeader } from 'reactstrap';
  4. type Props = {
  5. isOpen: boolean;
  6. includeUserPages: boolean;
  7. includeTrashPages: boolean;
  8. onClose?: () => void;
  9. onIncludeUserPagesSwitched?: (isChecked: boolean) => void;
  10. onIncludeTrashPagesSwitched?: (isChecked: boolean) => void;
  11. };
  12. const SearchOptionModal: FC<Props> = (props: Props) => {
  13. const { t } = useTranslation('');
  14. const {
  15. isOpen,
  16. includeUserPages,
  17. includeTrashPages,
  18. onClose,
  19. onIncludeUserPagesSwitched,
  20. onIncludeTrashPagesSwitched,
  21. } = props;
  22. // Memoize event handlers
  23. const onCloseModal = useCallback(() => {
  24. if (onClose != null) {
  25. onClose();
  26. }
  27. }, [onClose]);
  28. const includeUserPagesChangeHandler = useCallback(
  29. (isChecked: boolean) => {
  30. if (onIncludeUserPagesSwitched != null) {
  31. onIncludeUserPagesSwitched(isChecked);
  32. }
  33. },
  34. [onIncludeUserPagesSwitched],
  35. );
  36. const includeTrashPagesChangeHandler = useCallback(
  37. (isChecked: boolean) => {
  38. if (onIncludeTrashPagesSwitched != null) {
  39. onIncludeTrashPagesSwitched(isChecked);
  40. }
  41. },
  42. [onIncludeTrashPagesSwitched],
  43. );
  44. return (
  45. <Modal size="lg" isOpen={isOpen} toggle={onCloseModal} autoFocus={false}>
  46. <ModalHeader tag="h4" toggle={onCloseModal}>
  47. Search Option
  48. </ModalHeader>
  49. <ModalBody>
  50. <div className="d-flex p-2">
  51. <div className="me-3">
  52. <label className="form-label px-3 py-2 mb-0 d-flex align-items-center">
  53. <input
  54. className="me-2"
  55. type="checkbox"
  56. onChange={useCallback(
  57. (e) => includeUserPagesChangeHandler(e.target.checked),
  58. [includeUserPagesChangeHandler],
  59. )}
  60. checked={includeUserPages}
  61. />
  62. {t('Include Subordinated Target Page', { target: '/user' })}
  63. </label>
  64. </div>
  65. <div className="">
  66. <label className="form-label px-3 py-2 mb-0 d-flex align-items-center">
  67. <input
  68. className="me-2"
  69. type="checkbox"
  70. onChange={useCallback(
  71. (e) => includeTrashPagesChangeHandler(e.target.checked),
  72. [includeTrashPagesChangeHandler],
  73. )}
  74. checked={includeTrashPages}
  75. />
  76. {t('Include Subordinated Target Page', { target: '/trash' })}
  77. </label>
  78. </div>
  79. </div>
  80. </ModalBody>
  81. </Modal>
  82. );
  83. };
  84. export default SearchOptionModal;