PageSelectModal.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import type { FC } from 'react';
  2. import { useState, useCallback } from 'react';
  3. import nodePath from 'path';
  4. import { useTranslation } from 'next-i18next';
  5. import {
  6. Modal, ModalHeader, ModalBody, ModalFooter, Button,
  7. } from 'reactstrap';
  8. import type { IPageForItem } from '~/interfaces/page';
  9. import { useTargetAndAncestors, useIsGuestUser, useIsReadOnlyUser } from '~/stores/context';
  10. import { usePageSelectModal } from '~/stores/modal';
  11. import { useCurrentPagePath, useCurrentPageId, useSWRxCurrentPage } from '~/stores/page';
  12. import { ItemsTree } from '../ItemsTree';
  13. import { usePagePathRenameHandler } from '../PageEditor/page-path-rename-utils';
  14. import { TreeItemForModal } from './TreeItemForModal';
  15. export const PageSelectModal: FC = () => {
  16. const {
  17. data: PageSelectModalData,
  18. close: closeModal,
  19. } = usePageSelectModal();
  20. const isOpened = PageSelectModalData?.isOpened ?? false;
  21. const [clickedParentPagePath, setClickedParentPagePath] = useState<string | null>(null);
  22. const { t } = useTranslation();
  23. const { data: isGuestUser } = useIsGuestUser();
  24. const { data: isReadOnlyUser } = useIsReadOnlyUser();
  25. const { data: currentPath } = useCurrentPagePath();
  26. const { data: targetId } = useCurrentPageId();
  27. const { data: targetAndAncestorsData } = useTargetAndAncestors();
  28. const { data: currentPage } = useSWRxCurrentPage();
  29. const pagePathRenameHandler = usePagePathRenameHandler(currentPage);
  30. const onClickTreeItem = useCallback((page: IPageForItem) => {
  31. const parentPagePath = page.path;
  32. if (parentPagePath == null) {
  33. return;
  34. }
  35. setClickedParentPagePath(parentPagePath);
  36. }, []);
  37. const onClickCancel = useCallback(() => {
  38. setClickedParentPagePath(null);
  39. closeModal();
  40. }, [closeModal]);
  41. const onClickDone = useCallback(() => {
  42. if (clickedParentPagePath != null) {
  43. const currentPageTitle = nodePath.basename(currentPage?.path ?? '') || '/';
  44. const newPagePath = nodePath.resolve(clickedParentPagePath, currentPageTitle);
  45. pagePathRenameHandler(newPagePath);
  46. }
  47. closeModal();
  48. }, [clickedParentPagePath, closeModal, currentPage?.path, pagePathRenameHandler]);
  49. const targetPathOrId = targetId || currentPath;
  50. const path = currentPath || '/';
  51. if (isGuestUser == null) {
  52. return null;
  53. }
  54. return (
  55. <Modal
  56. isOpen={isOpened}
  57. toggle={closeModal}
  58. centered
  59. size="sm"
  60. >
  61. <ModalHeader toggle={closeModal}>{t('page_select_modal.select_page_location')}</ModalHeader>
  62. <ModalBody>
  63. <ItemsTree
  64. CustomTreeItem={TreeItemForModal}
  65. isEnableActions={!isGuestUser}
  66. isReadOnlyUser={!!isReadOnlyUser}
  67. targetPath={path}
  68. targetPathOrId={targetPathOrId}
  69. targetAndAncestorsData={targetAndAncestorsData}
  70. onClickTreeItem={onClickTreeItem}
  71. />
  72. </ModalBody>
  73. <ModalFooter>
  74. <Button color="secondary" onClick={onClickCancel}>{t('Cancel')}</Button>
  75. <Button color="primary" onClick={onClickDone}>{t('Done')}</Button>
  76. </ModalFooter>
  77. </Modal>
  78. );
  79. };