PageTree.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import React, { FC, memo, useState } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { useSWRxV5MigrationStatus } from '~/stores/page-listing';
  4. import {
  5. useCurrentPagePath, useCurrentPageId, useTargetAndAncestors, useIsGuestUser, useNotFoundTargetPathOrId,
  6. } from '~/stores/context';
  7. import ItemsTree from './PageTree/ItemsTree';
  8. import PrivateLegacyPages from './PageTree/PrivateLegacyPages';
  9. import { IPageForPageDeleteModal } from '../PageDeleteModal';
  10. const PageTree: FC = memo(() => {
  11. const { t } = useTranslation();
  12. const { data: isGuestUser } = useIsGuestUser();
  13. const { data: currentPath } = useCurrentPagePath();
  14. const { data: targetId } = useCurrentPageId();
  15. const { data: targetAndAncestorsData } = useTargetAndAncestors();
  16. const { data: notFoundTargetPathOrId } = useNotFoundTargetPathOrId();
  17. const { data: migrationStatus } = useSWRxV5MigrationStatus();
  18. // for delete modal
  19. const [isDeleteModalOpen, setDeleteModalOpen] = useState(false);
  20. const [pagesToDelete, setPagesToDelete] = useState<IPageForPageDeleteModal[]>([]);
  21. const targetPathOrId = targetId || notFoundTargetPathOrId;
  22. if (migrationStatus == null) {
  23. return (
  24. <>
  25. <div className="grw-sidebar-content-header p-3">
  26. <h3 className="mb-0">{t('Page Tree')}</h3>
  27. </div>
  28. <div className="mt-5 mx-2 text-center">
  29. <h3 className="text-gray">Page Tree now loading...</h3>
  30. </div>
  31. </>
  32. );
  33. }
  34. if (!migrationStatus?.isV5Compatible) {
  35. // TODO : improve design
  36. // Story : https://redmine.weseek.co.jp/issues/83755
  37. return (
  38. <>
  39. <div className="grw-sidebar-content-header p-3">
  40. <h3 className="mb-0">{t('Page Tree')}</h3>
  41. </div>
  42. <div className="mt-5 mx-2 text-center">
  43. <h3 className="text-gray">{t('admin:v5_page_migration.page_tree_not_avaliable')}</h3>
  44. <a href="/admin">{t('admin:v5_page_migration.go_to_settings')}</a>
  45. </div>
  46. </>
  47. );
  48. }
  49. /*
  50. * dependencies
  51. */
  52. if (isGuestUser == null) {
  53. return null;
  54. }
  55. const onClickDeleteByPage = (page: IPageForPageDeleteModal) => {
  56. setDeleteModalOpen(true);
  57. setPagesToDelete([page]);
  58. };
  59. const onCloseDelete = () => {
  60. setDeleteModalOpen(false);
  61. };
  62. const path = currentPath || '/';
  63. return (
  64. <>
  65. <div className="grw-sidebar-content-header p-3">
  66. <h3 className="mb-0">{t('Page Tree')}</h3>
  67. </div>
  68. <div className="grw-sidebar-content-body">
  69. <ItemsTree
  70. isEnableActions={!isGuestUser}
  71. targetPath={path}
  72. targetPathOrId={targetPathOrId}
  73. targetAndAncestorsData={targetAndAncestorsData}
  74. isDeleteModalOpen={isDeleteModalOpen}
  75. pagesToDelete={pagesToDelete}
  76. isAbleToDeleteCompletely={false} // TODO: pass isAbleToDeleteCompletely
  77. isDeleteCompletelyModal={false} // TODO: pass isDeleteCompletelyModal
  78. onCloseDelete={onCloseDelete}
  79. onClickDeleteByPage={onClickDeleteByPage}
  80. />
  81. </div>
  82. {!isGuestUser && migrationStatus?.migratablePagesCount != null && migrationStatus.migratablePagesCount !== 0 && (
  83. <div className="grw-pagetree-footer border-top p-3 w-100">
  84. <PrivateLegacyPages />
  85. </div>
  86. )}
  87. </>
  88. );
  89. });
  90. export default PageTree;