فهرست منبع

reorganize features/page-tree directory structure

Yuki Takei 4 ماه پیش
والد
کامیت
ad101adb5a
43فایلهای تغییر یافته به همراه88 افزوده شده و 104 حذف شده
  1. 1 1
      apps/app/src/client/components/ItemsTree/ItemsTree.tsx
  2. 1 1
      apps/app/src/client/components/ItemsTree/index.ts
  3. 1 1
      apps/app/src/client/components/Sidebar/PageTreeItem/CountBadgeForPageTreeItem.tsx
  4. 7 7
      apps/app/src/client/components/Sidebar/PageTreeItem/SimplifiedPageTreeItem.tsx
  5. 1 1
      apps/app/src/client/components/TreeItem/NewPageInput/NewPageInput.module.scss
  6. 2 2
      apps/app/src/client/components/TreeItem/NewPageInput/use-new-page-input.tsx
  7. 4 6
      apps/app/src/client/components/TreeItem/index.ts
  8. 0 5
      apps/app/src/features/page-tree/client/services/index.ts
  9. 0 0
      apps/app/src/features/page-tree/components/SimpleItemContent.module.scss
  10. 0 0
      apps/app/src/features/page-tree/components/SimpleItemContent.tsx
  11. 0 0
      apps/app/src/features/page-tree/components/SimplifiedItemsTree.spec.tsx
  12. 9 7
      apps/app/src/features/page-tree/components/SimplifiedItemsTree.tsx
  13. 0 0
      apps/app/src/features/page-tree/components/TreeItemLayout.module.scss
  14. 0 0
      apps/app/src/features/page-tree/components/TreeItemLayout.tsx
  15. 0 0
      apps/app/src/features/page-tree/components/TreeNameInput.module.scss
  16. 4 2
      apps/app/src/features/page-tree/components/TreeNameInput.tsx
  17. 0 0
      apps/app/src/features/page-tree/components/_tree-item-variables.scss
  18. 4 0
      apps/app/src/features/page-tree/components/index.ts
  19. 1 0
      apps/app/src/features/page-tree/constants/_inner-constants.ts
  20. 4 1
      apps/app/src/features/page-tree/constants/index.ts
  21. 5 0
      apps/app/src/features/page-tree/hooks/_inner/index.ts
  22. 0 0
      apps/app/src/features/page-tree/hooks/_inner/use-auto-expand-ancestors.spec.tsx
  23. 0 0
      apps/app/src/features/page-tree/hooks/_inner/use-auto-expand-ancestors.ts
  24. 3 5
      apps/app/src/features/page-tree/hooks/_inner/use-data-loader.integration.spec.tsx
  25. 3 3
      apps/app/src/features/page-tree/hooks/_inner/use-data-loader.spec.tsx
  26. 4 4
      apps/app/src/features/page-tree/hooks/_inner/use-data-loader.ts
  27. 1 1
      apps/app/src/features/page-tree/hooks/_inner/use-expand-parent-on-create.ts
  28. 7 3
      apps/app/src/features/page-tree/hooks/_inner/use-scroll-to-selected-item.ts
  29. 3 3
      apps/app/src/features/page-tree/hooks/_inner/use-tree-item-handlers.tsx
  30. 3 0
      apps/app/src/features/page-tree/hooks/index.ts
  31. 6 3
      apps/app/src/features/page-tree/hooks/use-page-create.tsx
  32. 1 2
      apps/app/src/features/page-tree/hooks/use-page-rename.tsx
  33. 0 0
      apps/app/src/features/page-tree/hooks/use-placeholder-rename-effect.ts
  34. 4 39
      apps/app/src/features/page-tree/index.ts
  35. 0 0
      apps/app/src/features/page-tree/interfaces/index.ts
  36. 1 0
      apps/app/src/features/page-tree/services/index.ts
  37. 0 0
      apps/app/src/features/page-tree/services/page-tree-children.ts
  38. 2 0
      apps/app/src/features/page-tree/states/_inner/index.ts
  39. 1 4
      apps/app/src/features/page-tree/states/_inner/page-tree-create.ts
  40. 0 0
      apps/app/src/features/page-tree/states/_inner/tree-rebuild.ts
  41. 2 0
      apps/app/src/features/page-tree/states/index.ts
  42. 0 0
      apps/app/src/features/page-tree/states/page-tree-desc-count-map.ts
  43. 3 3
      apps/app/src/features/page-tree/states/page-tree-update.ts

+ 1 - 1
apps/app/src/client/components/ItemsTree/ItemsTree.tsx

@@ -16,7 +16,7 @@ import { useGlobalSocket } from '~/states/socket-io';
 import { usePageDeleteModalActions } from '~/states/ui/modal/page-delete';
 import { usePageDeleteModalActions } from '~/states/ui/modal/page-delete';
 import type { IPageForPageDuplicateModal } from '~/states/ui/modal/page-duplicate';
 import type { IPageForPageDuplicateModal } from '~/states/ui/modal/page-duplicate';
 import { usePageDuplicateModalActions } from '~/states/ui/modal/page-duplicate';
 import { usePageDuplicateModalActions } from '~/states/ui/modal/page-duplicate';
-import { usePageTreeDescCountMapAction } from '~/features/page-tree';
+import { usePageTreeDescCountMapAction } from '~/features/page-tree/states';
 import { mutateAllPageInfo } from '~/stores/page';
 import { mutateAllPageInfo } from '~/stores/page';
 import {
 import {
   useSWRxRootPage, mutatePageTree, mutatePageList,
   useSWRxRootPage, mutatePageTree, mutatePageList,

+ 1 - 1
apps/app/src/client/components/ItemsTree/index.ts

@@ -1,5 +1,5 @@
 // Re-export from features/page-tree (new implementation)
 // Re-export from features/page-tree (new implementation)
-export { SimplifiedItemsTree } from '~/features/page-tree';
+export { SimplifiedItemsTree } from '~/features/page-tree/components';
 
 
 // Legacy exports (for old implementation - will be deprecated)
 // Legacy exports (for old implementation - will be deprecated)
 export { ItemNode } from '../TreeItem';
 export { ItemNode } from '../TreeItem';

+ 1 - 1
apps/app/src/client/components/Sidebar/PageTreeItem/CountBadgeForPageTreeItem.tsx

@@ -2,7 +2,7 @@ import type { JSX } from 'react';
 
 
 import CountBadge from '~/client/components/Common/CountBadge';
 import CountBadge from '~/client/components/Common/CountBadge';
 import type { TreeItemToolProps } from '~/client/components/TreeItem';
 import type { TreeItemToolProps } from '~/client/components/TreeItem';
-import { usePageTreeDescCountMap } from '~/features/page-tree';
+import { usePageTreeDescCountMap } from '~/features/page-tree/states';
 
 
 
 
 export const CountBadgeForPageTreeItem = (props: TreeItemToolProps): JSX.Element => {
 export const CountBadgeForPageTreeItem = (props: TreeItemToolProps): JSX.Element => {

+ 7 - 7
apps/app/src/client/components/Sidebar/PageTreeItem/SimplifiedPageTreeItem.tsx

@@ -11,11 +11,11 @@ import { useRouter } from 'next/router';
 
 
 import { toastSuccess } from '~/client/util/toastr';
 import { toastSuccess } from '~/client/util/toastr';
 import {
 import {
-  CREATING_PAGE_VIRTUAL_ID,
-  ROOT_PAGE_VIRTUAL_ID, usePageTreeInformationUpdate, usePageRename, usePageCreate,
+  usePageTreeInformationUpdate, usePageRename, usePageCreate,
   usePlaceholderRenameEffect,
   usePlaceholderRenameEffect,
-  NameInputAlternativeComponent,
+  CREATING_PAGE_VIRTUAL_ID,
 } from '~/features/page-tree';
 } from '~/features/page-tree';
+import { NameInputAlternativeComponent } from '~/features/page-tree/components';
 import type { IPageForItem } from '~/interfaces/page';
 import type { IPageForItem } from '~/interfaces/page';
 import type { OnDeletedFunction, OnDuplicatedFunction } from '~/interfaces/ui';
 import type { OnDeletedFunction, OnDuplicatedFunction } from '~/interfaces/ui';
 import { useCurrentPagePath, useFetchCurrentPage } from '~/states/page';
 import { useCurrentPagePath, useFetchCurrentPage } from '~/states/page';
@@ -70,8 +70,8 @@ export const SimplifiedPageTreeItem: FC<TreeItemProps> = ({
       mutatePageList();
       mutatePageList();
 
 
       // Notify headless-tree update
       // Notify headless-tree update
-      const parentId = itemData.parent != null ? getIdStringForRef(itemData.parent) : ROOT_PAGE_VIRTUAL_ID;
-      notifyUpdateItems([parentId]);
+      const parentIds = itemData.parent != null ? [getIdStringForRef(itemData.parent)] : undefined;
+      notifyUpdateItems(parentIds);
     };
     };
 
 
     openDuplicateModal(page, { onDuplicated: duplicatedHandler });
     openDuplicateModal(page, { onDuplicated: duplicatedHandler });
@@ -101,8 +101,8 @@ export const SimplifiedPageTreeItem: FC<TreeItemProps> = ({
       }
       }
 
 
       // Notify headless-tree update
       // Notify headless-tree update
-      const parentId = itemData.parent != null ? getIdStringForRef(itemData.parent) : ROOT_PAGE_VIRTUAL_ID;
-      notifyUpdateItems([parentId]);
+      const parentIds = itemData.parent != null ? [getIdStringForRef(itemData.parent)] : undefined;
+      notifyUpdateItems(parentIds);
     };
     };
 
 
     openDeleteModal([page], { onDeleted: onDeletedHandler });
     openDeleteModal([page], { onDeleted: onDeletedHandler });

+ 1 - 1
apps/app/src/client/components/TreeItem/NewPageInput/NewPageInput.module.scss

@@ -1,4 +1,4 @@
-@use '../../../../features/page-tree/client/components/tree-item-variables';
+@use '../../../../features/page-tree/components/tree-item-variables';
 
 
 .new-page-input-container {
 .new-page-input-container {
   width: calc(100% - tree-item-variables.$btn-triangle-min-width);
   width: calc(100% - tree-item-variables.$btn-triangle-min-width);

+ 2 - 2
apps/app/src/client/components/TreeItem/NewPageInput/use-new-page-input.tsx

@@ -16,11 +16,11 @@ import { useCreatePage } from '~/client/services/create-page';
 import { toastWarning, toastError, toastSuccess } from '~/client/util/toastr';
 import { toastWarning, toastError, toastSuccess } from '~/client/util/toastr';
 import type { InputValidationResult } from '~/client/util/use-input-validator';
 import type { InputValidationResult } from '~/client/util/use-input-validator';
 import { ValidationTarget, useInputValidator } from '~/client/util/use-input-validator';
 import { ValidationTarget, useInputValidator } from '~/client/util/use-input-validator';
-import { usePageTreeDescCountMap } from '~/features/page-tree';
+import { usePageTreeDescCountMap } from '~/features/page-tree/states';
 import { mutatePageTree, mutateRecentlyUpdated } from '~/stores/page-listing';
 import { mutatePageTree, mutateRecentlyUpdated } from '~/stores/page-listing';
 
 
 import { shouldCreateWipPage } from '../../../../utils/should-create-wip-page';
 import { shouldCreateWipPage } from '../../../../utils/should-create-wip-page';
-import type { TreeItemToolProps } from '../interfaces';
+import type { TreeItemToolProps } from '..';
 
 
 import { NewPageCreateButton } from './NewPageCreateButton';
 import { NewPageCreateButton } from './NewPageCreateButton';
 
 

+ 4 - 6
apps/app/src/client/components/TreeItem/index.ts

@@ -1,10 +1,8 @@
 // Re-export from features/page-tree (new implementation)
 // Re-export from features/page-tree (new implementation)
-export {
-  TreeItemLayout,
-  SimpleItemContent,
-  type TreeItemProps,
-  type TreeItemToolProps,
-} from '~/features/page-tree';
+// Components
+export { TreeItemLayout, SimpleItemContent } from '~/features/page-tree/components';
+// Interfaces
+export type { TreeItemProps, TreeItemToolProps } from '~/features/page-tree/interfaces';
 
 
 // Legacy exports (for old implementation - will be deprecated)
 // Legacy exports (for old implementation - will be deprecated)
 export * from './NewPageInput';
 export * from './NewPageInput';

+ 0 - 5
apps/app/src/features/page-tree/client/services/index.ts

@@ -1,5 +0,0 @@
-export {
-  type ChildrenData,
-  fetchAndCacheChildren,
-  invalidatePageTreeChildren,
-} from './page-tree-children';

+ 0 - 0
apps/app/src/features/page-tree/client/components/SimpleItemContent.module.scss → apps/app/src/features/page-tree/components/SimpleItemContent.module.scss


+ 0 - 0
apps/app/src/features/page-tree/client/components/SimpleItemContent.tsx → apps/app/src/features/page-tree/components/SimpleItemContent.tsx


+ 0 - 0
apps/app/src/features/page-tree/client/components/SimplifiedItemsTree.spec.tsx → apps/app/src/features/page-tree/components/SimplifiedItemsTree.spec.tsx


+ 9 - 7
apps/app/src/features/page-tree/client/components/SimplifiedItemsTree.tsx → apps/app/src/features/page-tree/components/SimplifiedItemsTree.tsx

@@ -12,18 +12,20 @@ import { useVirtualizer } from '@tanstack/react-virtual';
 import type { IPageForTreeItem } from '~/interfaces/page';
 import type { IPageForTreeItem } from '~/interfaces/page';
 import { useSWRxRootPage } from '~/stores/page-listing';
 import { useSWRxRootPage } from '~/stores/page-listing';
 
 
-import { ROOT_PAGE_VIRTUAL_ID } from '../../constants';
-import { useAutoExpandAncestors } from '../hooks/use-auto-expand-ancestors';
-import { useDataLoader } from '../hooks/use-data-loader';
-import { useExpandParentOnCreate } from '../hooks/use-expand-parent-on-create';
-import { useScrollToSelectedItem } from '../hooks/use-scroll-to-selected-item';
-import { useTreeItemHandlers } from '../hooks/use-tree-item-handlers';
+import { ROOT_PAGE_VIRTUAL_ID } from '../constants/_inner-constants';
+import {
+  useAutoExpandAncestors,
+  useDataLoader,
+  useExpandParentOnCreate,
+  useScrollToSelectedItem,
+  useTreeItemHandlers,
+} from '../hooks/_inner';
 import type { TreeItemProps } from '../interfaces';
 import type { TreeItemProps } from '../interfaces';
+import { useTriggerTreeRebuild } from '../states/_inner';
 import {
 import {
   usePageTreeInformationGeneration,
   usePageTreeInformationGeneration,
   usePageTreeRevalidationEffect,
   usePageTreeRevalidationEffect,
 } from '../states/page-tree-update';
 } from '../states/page-tree-update';
-import { useTriggerTreeRebuild } from '../states/tree-rebuild';
 
 
 // Stable features array to avoid recreating on every render
 // Stable features array to avoid recreating on every render
 const TREE_FEATURES = [
 const TREE_FEATURES = [

+ 0 - 0
apps/app/src/features/page-tree/client/components/TreeItemLayout.module.scss → apps/app/src/features/page-tree/components/TreeItemLayout.module.scss


+ 0 - 0
apps/app/src/features/page-tree/client/components/TreeItemLayout.tsx → apps/app/src/features/page-tree/components/TreeItemLayout.tsx


+ 0 - 0
apps/app/src/features/page-tree/client/components/TreeNameInput.module.scss → apps/app/src/features/page-tree/components/TreeNameInput.module.scss


+ 4 - 2
apps/app/src/features/page-tree/client/components/TreeNameInput.tsx → apps/app/src/features/page-tree/components/TreeNameInput.tsx

@@ -9,8 +9,8 @@ import {
   ValidationTarget,
   ValidationTarget,
 } from '~/client/util/use-input-validator';
 } from '~/client/util/use-input-validator';
 
 
+import { CREATING_PAGE_VIRTUAL_ID } from '../constants';
 import type { TreeItemToolProps } from '../interfaces';
 import type { TreeItemToolProps } from '../interfaces';
-import { CREATING_PAGE_VIRTUAL_ID } from '../states/page-tree-create';
 
 
 import styles from './TreeNameInput.module.scss';
 import styles from './TreeNameInput.module.scss';
 
 
@@ -86,7 +86,9 @@ export const TreeNameInput: FC<TreeNameInputProps> = ({
  * Alternative component for TreeItemLayout that renders TreeNameInput
  * Alternative component for TreeItemLayout that renders TreeNameInput
  * Used for both rename and create operations
  * Used for both rename and create operations
  */
  */
-export const NameInputAlternativeComponent: FC<TreeItemToolProps> = ({ item }) => {
+export const NameInputAlternativeComponent: FC<TreeItemToolProps> = ({
+  item,
+}) => {
   const { t } = useTranslation();
   const { t } = useTranslation();
   const inputValidator = useInputValidator(ValidationTarget.PAGE);
   const inputValidator = useInputValidator(ValidationTarget.PAGE);
 
 

+ 0 - 0
apps/app/src/features/page-tree/client/components/_tree-item-variables.scss → apps/app/src/features/page-tree/components/_tree-item-variables.scss


+ 4 - 0
apps/app/src/features/page-tree/components/index.ts

@@ -0,0 +1,4 @@
+export * from './SimpleItemContent';
+export * from './SimplifiedItemsTree';
+export * from './TreeItemLayout';
+export * from './TreeNameInput';

+ 1 - 0
apps/app/src/features/page-tree/constants/_inner-constants.ts

@@ -0,0 +1 @@
+export const ROOT_PAGE_VIRTUAL_ID = '__virtual_root__';

+ 4 - 1
apps/app/src/features/page-tree/constants/index.ts

@@ -1 +1,4 @@
-export const ROOT_PAGE_VIRTUAL_ID = '__virtual_root__';
+/**
+ * Virtual ID for the placeholder node during page creation
+ */
+export const CREATING_PAGE_VIRTUAL_ID = '__creating_page_placeholder__';

+ 5 - 0
apps/app/src/features/page-tree/hooks/_inner/index.ts

@@ -0,0 +1,5 @@
+export * from './use-auto-expand-ancestors';
+export * from './use-data-loader';
+export * from './use-expand-parent-on-create';
+export * from './use-scroll-to-selected-item';
+export * from './use-tree-item-handlers';

+ 0 - 0
apps/app/src/features/page-tree/client/hooks/use-auto-expand-ancestors.spec.tsx → apps/app/src/features/page-tree/hooks/_inner/use-auto-expand-ancestors.spec.tsx


+ 0 - 0
apps/app/src/features/page-tree/client/hooks/use-auto-expand-ancestors.ts → apps/app/src/features/page-tree/hooks/_inner/use-auto-expand-ancestors.ts


+ 3 - 5
apps/app/src/features/page-tree/client/hooks/use-data-loader.integration.spec.tsx → apps/app/src/features/page-tree/hooks/_inner/use-data-loader.integration.spec.tsx

@@ -20,12 +20,10 @@ import { createStore, Provider } from 'jotai';
 
 
 import type { IPageForTreeItem } from '~/interfaces/page';
 import type { IPageForTreeItem } from '~/interfaces/page';
 
 
-import { invalidatePageTreeChildren } from '../services';
+import { CREATING_PAGE_VIRTUAL_ID } from '../../constants';
+import { invalidatePageTreeChildren } from '../../services';
 // Re-import the actions hook to use real implementation
 // Re-import the actions hook to use real implementation
-import {
-  CREATING_PAGE_VIRTUAL_ID,
-  usePageTreeCreateActions,
-} from '../states/page-tree-create';
+import { usePageTreeCreateActions } from '../../states/_inner';
 import { useDataLoader } from './use-data-loader';
 import { useDataLoader } from './use-data-loader';
 
 
 /**
 /**

+ 3 - 3
apps/app/src/features/page-tree/client/hooks/use-data-loader.spec.tsx → apps/app/src/features/page-tree/hooks/_inner/use-data-loader.spec.tsx

@@ -2,9 +2,9 @@ import { renderHook } from '@testing-library/react';
 
 
 import type { IPageForTreeItem } from '~/interfaces/page';
 import type { IPageForTreeItem } from '~/interfaces/page';
 
 
-import { ROOT_PAGE_VIRTUAL_ID } from '../../constants';
-import { invalidatePageTreeChildren } from '../services';
-import { CREATING_PAGE_VIRTUAL_ID } from '../states/page-tree-create';
+import { CREATING_PAGE_VIRTUAL_ID } from '../../constants';
+import { ROOT_PAGE_VIRTUAL_ID } from '../../constants/_inner-constants';
+import { invalidatePageTreeChildren } from '../../services';
 import { useDataLoader } from './use-data-loader';
 import { useDataLoader } from './use-data-loader';
 
 
 /**
 /**

+ 4 - 4
apps/app/src/features/page-tree/client/hooks/use-data-loader.ts → apps/app/src/features/page-tree/hooks/_inner/use-data-loader.ts

@@ -4,14 +4,14 @@ import type { TreeDataLoader } from '@headless-tree/core';
 import { apiv3Get } from '~/client/util/apiv3-client';
 import { apiv3Get } from '~/client/util/apiv3-client';
 import type { IPageForTreeItem } from '~/interfaces/page';
 import type { IPageForTreeItem } from '~/interfaces/page';
 
 
-import { ROOT_PAGE_VIRTUAL_ID } from '../../constants';
-import { type ChildrenData, fetchAndCacheChildren } from '../services';
+import { CREATING_PAGE_VIRTUAL_ID } from '../../constants';
+import { ROOT_PAGE_VIRTUAL_ID } from '../../constants/_inner-constants';
+import { type ChildrenData, fetchAndCacheChildren } from '../../services';
 import {
 import {
-  CREATING_PAGE_VIRTUAL_ID,
   createPlaceholderPageData,
   createPlaceholderPageData,
   useCreatingParentId,
   useCreatingParentId,
   useCreatingParentPath,
   useCreatingParentPath,
-} from '../states/page-tree-create';
+} from '../../states/_inner';
 
 
 function constructRootPageForVirtualRoot(
 function constructRootPageForVirtualRoot(
   rootPageId: string,
   rootPageId: string,

+ 1 - 1
apps/app/src/features/page-tree/client/hooks/use-expand-parent-on-create.ts → apps/app/src/features/page-tree/hooks/_inner/use-expand-parent-on-create.ts

@@ -3,7 +3,7 @@ import type { TreeInstance } from '@headless-tree/core';
 
 
 import type { IPageForTreeItem } from '~/interfaces/page';
 import type { IPageForTreeItem } from '~/interfaces/page';
 
 
-import { invalidatePageTreeChildren } from '../services';
+import { invalidatePageTreeChildren } from '../../services';
 
 
 type UseExpandParentOnCreateParams = {
 type UseExpandParentOnCreateParams = {
   tree: TreeInstance<IPageForTreeItem>;
   tree: TreeInstance<IPageForTreeItem>;

+ 7 - 3
apps/app/src/features/page-tree/client/hooks/use-scroll-to-selected-item.ts → apps/app/src/features/page-tree/hooks/_inner/use-scroll-to-selected-item.ts

@@ -1,5 +1,4 @@
 import { useEffect } from 'react';
 import { useEffect } from 'react';
-
 import type { Virtualizer } from '@tanstack/react-virtual';
 import type { Virtualizer } from '@tanstack/react-virtual';
 
 
 import type { IPageForTreeItem } from '~/interfaces/page';
 import type { IPageForTreeItem } from '~/interfaces/page';
@@ -20,13 +19,18 @@ export const useScrollToSelectedItem = ({
 
 
     const selectedIndex = items.findIndex((item) => {
     const selectedIndex = items.findIndex((item) => {
       const itemData = item.getItemData();
       const itemData = item.getItemData();
-      return itemData._id === targetPathOrId || itemData.path === targetPathOrId;
+      return (
+        itemData._id === targetPathOrId || itemData.path === targetPathOrId
+      );
     });
     });
 
 
     if (selectedIndex !== -1) {
     if (selectedIndex !== -1) {
       // Use a small delay to ensure the virtualizer is ready
       // Use a small delay to ensure the virtualizer is ready
       setTimeout(() => {
       setTimeout(() => {
-        virtualizer.scrollToIndex(selectedIndex, { align: 'center', behavior: 'smooth' });
+        virtualizer.scrollToIndex(selectedIndex, {
+          align: 'center',
+          behavior: 'smooth',
+        });
       }, 100);
       }, 100);
     }
     }
   }, [targetPathOrId, items, virtualizer]);
   }, [targetPathOrId, items, virtualizer]);

+ 3 - 3
apps/app/src/features/page-tree/client/hooks/use-tree-item-handlers.tsx → apps/app/src/features/page-tree/hooks/_inner/use-tree-item-handlers.tsx

@@ -3,9 +3,9 @@ import type { ItemInstance, TreeConfig } from '@headless-tree/core';
 
 
 import type { IPageForTreeItem } from '~/interfaces/page';
 import type { IPageForTreeItem } from '~/interfaces/page';
 
 
-import { useCreatingParentId } from '../states/page-tree-create';
-import { usePageCreate } from './use-page-create';
-import { usePageRename } from './use-page-rename';
+import { useCreatingParentId } from '../../states/_inner';
+import { usePageCreate } from '../use-page-create';
+import { usePageRename } from '../use-page-rename';
 
 
 type UseTreeItemHandlersReturn = {
 type UseTreeItemHandlersReturn = {
   /**
   /**

+ 3 - 0
apps/app/src/features/page-tree/hooks/index.ts

@@ -0,0 +1,3 @@
+export * from './use-page-create';
+export * from './use-page-rename';
+export * from './use-placeholder-rename-effect';

+ 6 - 3
apps/app/src/features/page-tree/client/hooks/use-page-create.tsx → apps/app/src/features/page-tree/hooks/use-page-create.tsx

@@ -14,12 +14,12 @@ import type { IPageForItem } from '~/interfaces/page';
 import { mutatePageTree, mutateRecentlyUpdated } from '~/stores/page-listing';
 import { mutatePageTree, mutateRecentlyUpdated } from '~/stores/page-listing';
 import { shouldCreateWipPage } from '~/utils/should-create-wip-page';
 import { shouldCreateWipPage } from '~/utils/should-create-wip-page';
 
 
+import { CREATING_PAGE_VIRTUAL_ID } from '../constants';
 import type { TreeItemToolProps } from '../interfaces';
 import type { TreeItemToolProps } from '../interfaces';
 import {
 import {
-  CREATING_PAGE_VIRTUAL_ID,
   useCreatingParentId,
   useCreatingParentId,
   usePageTreeCreateActions,
   usePageTreeCreateActions,
-} from '../states/page-tree-create';
+} from '../states/_inner';
 import { usePageTreeInformationUpdate } from '../states/page-tree-update';
 import { usePageTreeInformationUpdate } from '../states/page-tree-update';
 
 
 // Inner component for CreateButton to properly use hooks
 // Inner component for CreateButton to properly use hooks
@@ -28,7 +28,10 @@ type CreateButtonInnerProps = {
   onStartCreating: (item: ItemInstance<IPageForItem>) => void;
   onStartCreating: (item: ItemInstance<IPageForItem>) => void;
 };
 };
 
 
-const CreateButtonInner: FC<CreateButtonInnerProps> = ({ item, onStartCreating }) => {
+const CreateButtonInner: FC<CreateButtonInnerProps> = ({
+  item,
+  onStartCreating,
+}) => {
   const buttonId = useId();
   const buttonId = useId();
   const creatingParentId = useCreatingParentId();
   const creatingParentId = useCreatingParentId();
   const isCreating = creatingParentId != null;
   const isCreating = creatingParentId != null;

+ 1 - 2
apps/app/src/features/page-tree/client/hooks/use-page-rename.tsx → apps/app/src/features/page-tree/hooks/use-page-rename.tsx

@@ -1,4 +1,3 @@
-import type { FC } from 'react';
 import { useCallback } from 'react';
 import { useCallback } from 'react';
 import { pathUtils } from '@growi/core/dist/utils';
 import { pathUtils } from '@growi/core/dist/utils';
 import type { ItemInstance } from '@headless-tree/core';
 import type { ItemInstance } from '@headless-tree/core';
@@ -10,7 +9,7 @@ import { toastError, toastSuccess } from '~/client/util/toastr';
 import type { IPageForItem } from '~/interfaces/page';
 import type { IPageForItem } from '~/interfaces/page';
 import { mutatePageTree } from '~/stores/page-listing';
 import { mutatePageTree } from '~/stores/page-listing';
 
 
-import { CREATING_PAGE_VIRTUAL_ID } from '../states/page-tree-create';
+import { CREATING_PAGE_VIRTUAL_ID } from '../constants';
 import { usePageTreeInformationUpdate } from '../states/page-tree-update';
 import { usePageTreeInformationUpdate } from '../states/page-tree-update';
 
 
 type RenameResult = {
 type RenameResult = {

+ 0 - 0
apps/app/src/features/page-tree/client/hooks/use-placeholder-rename-effect.ts → apps/app/src/features/page-tree/hooks/use-placeholder-rename-effect.ts


+ 4 - 39
apps/app/src/features/page-tree/index.ts

@@ -1,39 +1,4 @@
-// Components
-export { SimpleItemContent } from './client/components/SimpleItemContent';
-export { SimplifiedItemsTree } from './client/components/SimplifiedItemsTree';
-export { TreeItemLayout } from './client/components/TreeItemLayout';
-export {
-  NameInputAlternativeComponent,
-  TreeNameInput,
-} from './client/components/TreeNameInput';
-// Hooks
-export { useDataLoader } from './client/hooks/use-data-loader';
-export { usePageCreate } from './client/hooks/use-page-create';
-export { usePageRename } from './client/hooks/use-page-rename';
-export { usePlaceholderRenameEffect } from './client/hooks/use-placeholder-rename-effect';
-export { useScrollToSelectedItem } from './client/hooks/use-scroll-to-selected-item';
-// Interfaces
-export * from './client/interfaces';
-// States
-export {
-  CREATING_PAGE_VIRTUAL_ID,
-  useCreatingParentId,
-  useCreatingParentPath,
-  useIsCreatingChild,
-  usePageTreeCreateActions,
-} from './client/states/page-tree-create';
-export {
-  type PageTreeDescCountMapActions,
-  type PageTreeDescCountMapGetter,
-  type UpdateDescCountData,
-  usePageTreeDescCountMap,
-  usePageTreeDescCountMapAction,
-} from './client/states/page-tree-desc-count-map';
-export {
-  usePageTreeInformationGeneration,
-  usePageTreeInformationLastUpdatedItemIds,
-  usePageTreeInformationUpdate,
-  usePageTreeRevalidationEffect,
-} from './client/states/page-tree-update';
-// Constants
-export { ROOT_PAGE_VIRTUAL_ID } from './constants';
+export * from './constants';
+export * from './hooks';
+export * from './interfaces';
+export * from './states';

+ 0 - 0
apps/app/src/features/page-tree/client/interfaces/index.ts → apps/app/src/features/page-tree/interfaces/index.ts


+ 1 - 0
apps/app/src/features/page-tree/services/index.ts

@@ -0,0 +1 @@
+export * from './page-tree-children';

+ 0 - 0
apps/app/src/features/page-tree/client/services/page-tree-children.ts → apps/app/src/features/page-tree/services/page-tree-children.ts


+ 2 - 0
apps/app/src/features/page-tree/states/_inner/index.ts

@@ -0,0 +1,2 @@
+export * from './page-tree-create';
+export * from './tree-rebuild';

+ 1 - 4
apps/app/src/features/page-tree/client/states/page-tree-create.ts → apps/app/src/features/page-tree/states/_inner/page-tree-create.ts

@@ -3,10 +3,7 @@ import { atom, useAtomValue, useSetAtom } from 'jotai';
 
 
 import type { IPageForTreeItem } from '~/interfaces/page';
 import type { IPageForTreeItem } from '~/interfaces/page';
 
 
-/**
- * Virtual ID for the placeholder node during page creation
- */
-export const CREATING_PAGE_VIRTUAL_ID = '__creating_page_placeholder__';
+import { CREATING_PAGE_VIRTUAL_ID } from '../../constants';
 
 
 /**
 /**
  * Create a placeholder page data for the creating node
  * Create a placeholder page data for the creating node

+ 0 - 0
apps/app/src/features/page-tree/client/states/tree-rebuild.ts → apps/app/src/features/page-tree/states/_inner/tree-rebuild.ts


+ 2 - 0
apps/app/src/features/page-tree/states/index.ts

@@ -0,0 +1,2 @@
+export * from './page-tree-desc-count-map';
+export * from './page-tree-update';

+ 0 - 0
apps/app/src/features/page-tree/client/states/page-tree-desc-count-map.ts → apps/app/src/features/page-tree/states/page-tree-desc-count-map.ts


+ 3 - 3
apps/app/src/features/page-tree/client/states/page-tree-update.ts → apps/app/src/features/page-tree/states/page-tree-update.ts

@@ -2,7 +2,7 @@ import { useCallback, useEffect } from 'react';
 import type { TreeInstance } from '@headless-tree/core';
 import type { TreeInstance } from '@headless-tree/core';
 import { atom, useAtomValue, useSetAtom } from 'jotai';
 import { atom, useAtomValue, useSetAtom } from 'jotai';
 
 
-import { ROOT_PAGE_VIRTUAL_ID } from '../../constants';
+import { ROOT_PAGE_VIRTUAL_ID } from '../constants/_inner-constants';
 import { invalidatePageTreeChildren } from '../services';
 import { invalidatePageTreeChildren } from '../services';
 
 
 // Update generation number
 // Update generation number
@@ -26,8 +26,8 @@ export const usePageTreeInformationUpdate = () => {
 
 
   // Notify update for specific items
   // Notify update for specific items
   const notifyUpdateItems = useCallback(
   const notifyUpdateItems = useCallback(
-    (itemIds: string[]) => {
-      setLastUpdatedIds(itemIds);
+    (itemIds?: string[]) => {
+      setLastUpdatedIds(itemIds ?? [ROOT_PAGE_VIRTUAL_ID]);
       setGeneration((prev) => prev + 1);
       setGeneration((prev) => prev + 1);
     },
     },
     [setGeneration, setLastUpdatedIds],
     [setGeneration, setLastUpdatedIds],