PageTree.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import React, { FC, memo } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import {
  4. useCurrentPageId, useTargetAndAncestors, useIsGuestUser,
  5. } from '~/stores/context';
  6. import { useCurrentPagePath } from '~/stores/page';
  7. import { useSWRxV5MigrationStatus } from '~/stores/page-listing';
  8. import ItemsTree from './PageTree/ItemsTree';
  9. import { PrivateLegacyPagesLink } from './PageTree/PrivateLegacyPagesLink';
  10. import PageTreeContentSkeleton from './Skeleton/PageTreeContentSkeleton';
  11. const PageTreeHeader = () => {
  12. const { t } = useTranslation();
  13. return (
  14. <div className="grw-sidebar-content-header py-3 d-flex">
  15. <h3 className="mb-0">{t('Page Tree')}</h3>
  16. </div>
  17. );
  18. };
  19. const PageTree: FC = memo(() => {
  20. const { t } = useTranslation();
  21. const { data: isGuestUser } = useIsGuestUser();
  22. const { data: currentPath } = useCurrentPagePath();
  23. const { data: targetId } = useCurrentPageId();
  24. const { data: targetAndAncestorsData } = useTargetAndAncestors();
  25. const { data: migrationStatus } = useSWRxV5MigrationStatus();
  26. const targetPathOrId = targetId || currentPath;
  27. if (migrationStatus == null) {
  28. return (
  29. <div className="px-3">
  30. <PageTreeHeader />
  31. <PageTreeContentSkeleton />
  32. </div>
  33. );
  34. }
  35. if (!migrationStatus?.isV5Compatible) {
  36. // TODO : improve design
  37. // Story : https://redmine.weseek.co.jp/issues/83755
  38. return (
  39. <div className="px-3">
  40. <PageTreeHeader />
  41. <div className="mt-5 mx-2 text-center">
  42. <h3 className="text-gray">{t('v5_page_migration.page_tree_not_avaliable')}</h3>
  43. <a href="/admin">{t('v5_page_migration.go_to_settings')}</a>
  44. </div>
  45. </div>
  46. );
  47. }
  48. /*
  49. * dependencies
  50. */
  51. if (isGuestUser == null) {
  52. return null;
  53. }
  54. const path = currentPath || '/';
  55. return (
  56. <div className="px-3">
  57. <PageTreeHeader />
  58. <ItemsTree
  59. isEnableActions={!isGuestUser}
  60. targetPath={path}
  61. targetPathOrId={targetPathOrId}
  62. targetAndAncestorsData={targetAndAncestorsData}
  63. />
  64. {!isGuestUser && migrationStatus?.migratablePagesCount != null && migrationStatus.migratablePagesCount !== 0 && (
  65. <div className="grw-pagetree-footer border-top py-3 w-100">
  66. <div className="private-legacy-pages-link px-3 py-2">
  67. <PrivateLegacyPagesLink />
  68. </div>
  69. </div>
  70. )}
  71. </div>
  72. );
  73. });
  74. PageTree.displayName = 'PageTree';
  75. export default PageTree;