Yuki Takei 3 лет назад
Родитель
Сommit
2ec74ee647

+ 8 - 39
packages/app/src/components/DescendantsPageList.tsx

@@ -11,17 +11,14 @@ import {
 import { IPagingResult } from '~/interfaces/paging-result';
 import { IPagingResult } from '~/interfaces/paging-result';
 import { OnDeletedFunction, OnPutBackedFunction } from '~/interfaces/ui';
 import { OnDeletedFunction, OnPutBackedFunction } from '~/interfaces/ui';
 import {
 import {
-  useIsGuestUser, useIsSharedUser, useShowPageLimitationXL,
+  useIsGuestUser, useIsSharedUser,
 } from '~/stores/context';
 } from '~/stores/context';
-import { useIsTrashPage } from '~/stores/page';
 import {
 import {
-  mutateDescendantsPageListForCurrentPath,
   mutatePageTree,
   mutatePageTree,
-  useSWRxDescendantsPageListForCurrrentPath,
   useSWRxPageInfoForList, useSWRxPageList,
   useSWRxPageInfoForList, useSWRxPageList,
 } from '~/stores/page-listing';
 } from '~/stores/page-listing';
 
 
-import { ForceHideMenuItems, MenuItemType } from './Common/Dropdown/PageItemControl';
+import { ForceHideMenuItems } from './Common/Dropdown/PageItemControl';
 import PageList from './PageList/PageList';
 import PageList from './PageList/PageList';
 import PaginationWrapper from './PaginationWrapper';
 import PaginationWrapper from './PaginationWrapper';
 
 
@@ -39,7 +36,7 @@ const convertToIDataWithMeta = (page: IPageHasId): IDataWithMeta<IPageHasId> =>
   return { data: page };
   return { data: page };
 };
 };
 
 
-export const DescendantsPageListSubstance = (props: SubstanceProps): JSX.Element => {
+const DescendantsPageListSubstance = (props: SubstanceProps): JSX.Element => {
 
 
   const { t } = useTranslation();
   const { t } = useTranslation();
 
 
@@ -83,7 +80,6 @@ export const DescendantsPageListSubstance = (props: SubstanceProps): JSX.Element
     toastSuccess(t('page_has_been_reverted', { path }));
     toastSuccess(t('page_has_been_reverted', { path }));
 
 
     mutatePageTree();
     mutatePageTree();
-    mutateDescendantsPageListForCurrentPath();
 
 
     if (onPagePutBacked != null) {
     if (onPagePutBacked != null) {
       onPagePutBacked(path);
       onPagePutBacked(path);
@@ -133,16 +129,18 @@ export const DescendantsPageListSubstance = (props: SubstanceProps): JSX.Element
 
 
 export type DescendantsPageListProps = {
 export type DescendantsPageListProps = {
   path: string,
   path: string,
+  limit?: number,
+  forceHideMenuItems?: ForceHideMenuItems,
 }
 }
 
 
 export const DescendantsPageList = (props: DescendantsPageListProps): JSX.Element => {
 export const DescendantsPageList = (props: DescendantsPageListProps): JSX.Element => {
-  const { path } = props;
+  const { path, limit, forceHideMenuItems } = props;
 
 
   const [activePage, setActivePage] = useState(1);
   const [activePage, setActivePage] = useState(1);
 
 
   const { data: isSharedUser } = useIsSharedUser();
   const { data: isSharedUser } = useIsSharedUser();
 
 
-  const { data: pagingResult, error, mutate } = useSWRxPageList(null, isSharedUser ? null : path, activePage);
+  const { data: pagingResult, error, mutate } = useSWRxPageList(isSharedUser ? null : path, activePage, limit);
 
 
   if (error != null) {
   if (error != null) {
     return (
     return (
@@ -152,35 +150,6 @@ export const DescendantsPageList = (props: DescendantsPageListProps): JSX.Elemen
     );
     );
   }
   }
 
 
-  return (
-    <DescendantsPageListSubstance
-      pagingResult={pagingResult}
-      activePage={activePage}
-      setActivePage={setActivePage}
-      onPagesDeleted={() => mutate()}
-      onPagePutBacked={() => mutate()}
-    />
-  );
-};
-
-export const DescendantsPageListForCurrentPath = (): JSX.Element => {
-
-  const [activePage, setActivePage] = useState(1);
-
-  const { data: isTrashPage } = useIsTrashPage();
-  const { data: limit } = useShowPageLimitationXL();
-  const { data: pagingResult, error, mutate } = useSWRxDescendantsPageListForCurrrentPath(activePage, limit);
-
-  if (error != null) {
-    return (
-      <div className="my-5">
-        <div className="text-danger">{error.message}</div>
-      </div>
-    );
-  }
-
-  const forceHideMenuItems = isTrashPage ? [MenuItemType.RENAME] : undefined;
-
   return (
   return (
     <DescendantsPageListSubstance
     <DescendantsPageListSubstance
       pagingResult={pagingResult}
       pagingResult={pagingResult}
@@ -188,7 +157,7 @@ export const DescendantsPageListForCurrentPath = (): JSX.Element => {
       setActivePage={setActivePage}
       setActivePage={setActivePage}
       forceHideMenuItems={forceHideMenuItems}
       forceHideMenuItems={forceHideMenuItems}
       onPagesDeleted={() => mutate()}
       onPagesDeleted={() => mutate()}
+      onPagePutBacked={() => mutate()}
     />
     />
   );
   );
-
 };
 };

+ 2 - 8
packages/app/src/components/DescendantsPageListModal.tsx

@@ -20,15 +20,9 @@ import TimeLineIcon from './Icons/TimeLineIcon';
 
 
 import styles from './DescendantsPageListModal.module.scss';
 import styles from './DescendantsPageListModal.module.scss';
 
 
-const DescendantsPageList = (props: DescendantsPageListProps): JSX.Element => {
-  const DescendantsPageList = dynamic<DescendantsPageListProps>(() => import('./DescendantsPageList').then(mod => mod.DescendantsPageList), { ssr: false });
-  return <DescendantsPageList {...props}/>;
-};
+const DescendantsPageList = dynamic<DescendantsPageListProps>(() => import('./DescendantsPageList').then(mod => mod.DescendantsPageList), { ssr: false });
 
 
-const PageTimeline = (): JSX.Element => {
-  const PageTimeline = dynamic(() => import('./PageTimeline').then(mod => mod.PageTimeline), { ssr: false });
-  return <PageTimeline />;
-};
+const PageTimeline = dynamic(() => import('./PageTimeline').then(mod => mod.PageTimeline), { ssr: false });
 
 
 export const DescendantsPageListModal = (): JSX.Element => {
 export const DescendantsPageListModal = (): JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();

+ 4 - 4
packages/app/src/components/SearchPage/SearchResultContent.tsx

@@ -18,7 +18,7 @@ import { useCurrentUser, useIsContainerFluid } from '~/stores/context';
 import {
 import {
   usePageDuplicateModal, usePageRenameModal, usePageDeleteModal,
   usePageDuplicateModal, usePageRenameModal, usePageDeleteModal,
 } from '~/stores/modal';
 } from '~/stores/modal';
-import { mutateDescendantsPageListForCurrentPath, mutatePageTree } from '~/stores/page-listing';
+import { mutatePageList, mutatePageTree } from '~/stores/page-listing';
 import { useSearchResultOptions } from '~/stores/renderer';
 import { useSearchResultOptions } from '~/stores/renderer';
 import { mutateSearching } from '~/stores/search';
 import { mutateSearching } from '~/stores/search';
 
 
@@ -164,7 +164,7 @@ export const SearchResultContent: FC<Props> = (props: Props) => {
 
 
       mutatePageTree();
       mutatePageTree();
       mutateSearching();
       mutateSearching();
-      mutateDescendantsPageListForCurrentPath();
+      mutatePageList();
     };
     };
     openDuplicateModal(pageToDuplicate, { onDuplicated: duplicatedHandler });
     openDuplicateModal(pageToDuplicate, { onDuplicated: duplicatedHandler });
   }, [openDuplicateModal, t]);
   }, [openDuplicateModal, t]);
@@ -175,7 +175,7 @@ export const SearchResultContent: FC<Props> = (props: Props) => {
 
 
       mutatePageTree();
       mutatePageTree();
       mutateSearching();
       mutateSearching();
-      mutateDescendantsPageListForCurrentPath();
+      mutatePageList();
     };
     };
     openRenameModal(pageToRename, { onRenamed: renamedHandler });
     openRenameModal(pageToRename, { onRenamed: renamedHandler });
   }, [openRenameModal, t]);
   }, [openRenameModal, t]);
@@ -194,7 +194,7 @@ export const SearchResultContent: FC<Props> = (props: Props) => {
     }
     }
     mutatePageTree();
     mutatePageTree();
     mutateSearching();
     mutateSearching();
-    mutateDescendantsPageListForCurrentPath();
+    mutatePageList();
   }, [t]);
   }, [t]);
 
 
   const deleteItemClickedHandler = useCallback((pageToDelete: IPageToDeleteWithMeta) => {
   const deleteItemClickedHandler = useCallback((pageToDelete: IPageToDeleteWithMeta) => {

+ 4 - 4
packages/app/src/components/Sidebar/PageTree/ItemsTree.tsx

@@ -18,7 +18,7 @@ import {
 } from '~/stores/modal';
 } from '~/stores/modal';
 import { mutateAllPageInfo, useCurrentPagePath, useSWRMUTxCurrentPage } from '~/stores/page';
 import { mutateAllPageInfo, useCurrentPagePath, useSWRMUTxCurrentPage } from '~/stores/page';
 import {
 import {
-  useSWRxPageAncestorsChildren, useSWRxRootPage, mutatePageTree, mutateDescendantsPageListForCurrentPath,
+  useSWRxPageAncestorsChildren, useSWRxRootPage, mutatePageTree, mutatePageList,
 } from '~/stores/page-listing';
 } from '~/stores/page-listing';
 import { mutateSearching } from '~/stores/search';
 import { mutateSearching } from '~/stores/search';
 import { usePageTreeDescCountMap, useSidebarScrollerRef } from '~/stores/ui';
 import { usePageTreeDescCountMap, useSidebarScrollerRef } from '~/stores/ui';
@@ -149,7 +149,7 @@ const ItemsTree = (props: ItemsTreeProps): JSX.Element => {
   const onRenamed = useCallback((fromPath: string | undefined, toPath: string) => {
   const onRenamed = useCallback((fromPath: string | undefined, toPath: string) => {
     mutatePageTree();
     mutatePageTree();
     mutateSearching();
     mutateSearching();
-    mutateDescendantsPageListForCurrentPath();
+    mutatePageList();
 
 
     if (currentPagePath === fromPath || currentPagePath === toPath) {
     if (currentPagePath === fromPath || currentPagePath === toPath) {
       mutateCurrentPage();
       mutateCurrentPage();
@@ -163,7 +163,7 @@ const ItemsTree = (props: ItemsTreeProps): JSX.Element => {
 
 
       mutatePageTree();
       mutatePageTree();
       mutateSearching();
       mutateSearching();
-      mutateDescendantsPageListForCurrentPath();
+      mutatePageList();
     };
     };
 
 
     openDuplicateModal(pageToDuplicate, { onDuplicated: duplicatedHandler });
     openDuplicateModal(pageToDuplicate, { onDuplicated: duplicatedHandler });
@@ -186,7 +186,7 @@ const ItemsTree = (props: ItemsTreeProps): JSX.Element => {
 
 
       mutatePageTree();
       mutatePageTree();
       mutateSearching();
       mutateSearching();
-      mutateDescendantsPageListForCurrentPath();
+      mutatePageList();
       mutateAllPageInfo();
       mutateAllPageInfo();
 
 
       if (currentPagePath === pathOrPathsToDelete) {
       if (currentPagePath === pathOrPathsToDelete) {

+ 24 - 6
packages/app/src/components/TrashPageList.tsx

@@ -1,6 +1,7 @@
-import React, { FC, useMemo, useCallback } from 'react';
+import React, { useMemo, useCallback } from 'react';
 
 
 import { useTranslation } from 'next-i18next';
 import { useTranslation } from 'next-i18next';
+import dynamic from 'next/dynamic';
 
 
 import { toastSuccess } from '~/client/util/apiNotification';
 import { toastSuccess } from '~/client/util/apiNotification';
 import {
 import {
@@ -9,13 +10,18 @@ import {
 import { IPagingResult } from '~/interfaces/paging-result';
 import { IPagingResult } from '~/interfaces/paging-result';
 import { useShowPageLimitationXL } from '~/stores/context';
 import { useShowPageLimitationXL } from '~/stores/context';
 import { useEmptyTrashModal } from '~/stores/modal';
 import { useEmptyTrashModal } from '~/stores/modal';
-import { useSWRxDescendantsPageListForCurrrentPath, useSWRxPageInfoForList } from '~/stores/page-listing';
+import { useSWRxPageInfoForList, useSWRxPageList } from '~/stores/page-listing';
 
 
+import { MenuItemType } from './Common/Dropdown/PageItemControl';
 import CustomNavAndContents from './CustomNavigation/CustomNavAndContents';
 import CustomNavAndContents from './CustomNavigation/CustomNavAndContents';
-import { DescendantsPageListForCurrentPath } from './DescendantsPageList';
+import { DescendantsPageListProps } from './DescendantsPageList';
 import EmptyTrashButton from './EmptyTrashButton';
 import EmptyTrashButton from './EmptyTrashButton';
 import PageListIcon from './Icons/PageListIcon';
 import PageListIcon from './Icons/PageListIcon';
 
 
+
+const DescendantsPageList = dynamic<DescendantsPageListProps>(() => import('./DescendantsPageList').then(mod => mod.DescendantsPageList), { ssr: false });
+
+
 const convertToIDataWithMeta = (page) => {
 const convertToIDataWithMeta = (page) => {
   return { data: page };
   return { data: page };
 };
 };
@@ -23,7 +29,7 @@ const convertToIDataWithMeta = (page) => {
 const useEmptyTrashButton = () => {
 const useEmptyTrashButton = () => {
 
 
   const { data: limit } = useShowPageLimitationXL();
   const { data: limit } = useShowPageLimitationXL();
-  const { data: pagingResult, mutate: mutatePageLists } = useSWRxDescendantsPageListForCurrrentPath(1, limit);
+  const { data: pagingResult, mutate: mutatePageLists } = useSWRxPageList('/trash', 1, limit);
   const { t } = useTranslation();
   const { t } = useTranslation();
   const { open: openEmptyTrashModal } = useEmptyTrashModal();
   const { open: openEmptyTrashModal } = useEmptyTrashModal();
 
 
@@ -59,7 +65,19 @@ const useEmptyTrashButton = () => {
   return emptyTrashButton;
   return emptyTrashButton;
 };
 };
 
 
-export const TrashPageList: FC = () => {
+const DescendantsPageListForTrash = (): JSX.Element => {
+  const { data: limit } = useShowPageLimitationXL();
+
+  return (
+    <DescendantsPageList
+      path="/trash"
+      limit={limit}
+      forceHideMenuItems={[MenuItemType.RENAME]}
+    />
+  );
+};
+
+export const TrashPageList = (): JSX.Element => {
   const { t } = useTranslation();
   const { t } = useTranslation();
   const emptyTrashButton = useEmptyTrashButton();
   const emptyTrashButton = useEmptyTrashButton();
 
 
@@ -67,7 +85,7 @@ export const TrashPageList: FC = () => {
     return {
     return {
       pagelist: {
       pagelist: {
         Icon: PageListIcon,
         Icon: PageListIcon,
-        Content: DescendantsPageListForCurrentPath,
+        Content: DescendantsPageListForTrash,
         i18n: t('page_list'),
         i18n: t('page_list'),
         index: 0,
         index: 0,
       },
       },

+ 9 - 16
packages/app/src/stores/page-listing.tsx

@@ -15,7 +15,6 @@ import {
   AncestorsChildrenResult, ChildrenResult, V5MigrationStatus, RootPageResult,
   AncestorsChildrenResult, ChildrenResult, V5MigrationStatus, RootPageResult,
 } from '../interfaces/page-listing-results';
 } from '../interfaces/page-listing-results';
 
 
-import { useCurrentPagePath } from './page';
 
 
 export const useSWRxPagesByPath = (path?: Nullable<string>): SWRResponse<IPageHasId[], Error> => {
 export const useSWRxPagesByPath = (path?: Nullable<string>): SWRResponse<IPageHasId[], Error> => {
   const findAll = true;
   const findAll = true;
@@ -44,15 +43,21 @@ export const useSWRInifinitexRecentlyUpdated = () : SWRInfiniteResponse<(IPageHa
     },
     },
   );
   );
 };
 };
+
+export const mutatePageList = async(): Promise<void[]> => {
+  return mutate(
+    key => Array.isArray(key) && key[0] === '/pages/list',
+  );
+};
+
 export const useSWRxPageList = (
 export const useSWRxPageList = (
-    mutationId: string | null,
     path: string | null, pageNumber?: number, limit?: number,
     path: string | null, pageNumber?: number, limit?: number,
 ): SWRResponse<IPagingResult<IPageHasId>, Error> => {
 ): SWRResponse<IPagingResult<IPageHasId>, Error> => {
   return useSWR(
   return useSWR(
     path == null
     path == null
       ? null
       ? null
-      : [mutationId, '/pages/list', path, pageNumber, limit],
-    ([, endpoint, path, pageNumber, limit]) => {
+      : ['/pages/list', path, pageNumber, limit],
+    ([endpoint, path, pageNumber, limit]) => {
       const args = Object.assign(
       const args = Object.assign(
         { path, page: pageNumber ?? 1 },
         { path, page: pageNumber ?? 1 },
         // if limit exist then add it as query string
         // if limit exist then add it as query string
@@ -74,18 +79,6 @@ export const useSWRxPageList = (
   );
   );
 };
 };
 
 
-const MUTATION_ID_FOR_DESCENDANTS_PAGELIST_FOR_CURRENT_PATH = 'descendantsPageListForCurrentPath';
-export const mutateDescendantsPageListForCurrentPath = async(): Promise<void[]> => {
-  return mutate(
-    key => Array.isArray(key) && key[0] === MUTATION_ID_FOR_DESCENDANTS_PAGELIST_FOR_CURRENT_PATH,
-  );
-};
-
-export const useSWRxDescendantsPageListForCurrrentPath = (pageNumber?: number, limit?:number): SWRResponse<IPagingResult<IPageHasId>, Error> => {
-  const { data: currentPagePath } = useCurrentPagePath();
-  return useSWRxPageList(MUTATION_ID_FOR_DESCENDANTS_PAGELIST_FOR_CURRENT_PATH, currentPagePath ?? null, pageNumber, limit);
-};
-
 
 
 type PageInfoInjector = {
 type PageInfoInjector = {
   injectTo: <D extends HasObjectId>(pages: (D | IDataWithMeta<D>)[]) => IDataWithMeta<D, IPageInfoForOperation>[],
   injectTo: <D extends HasObjectId>(pages: (D | IDataWithMeta<D>)[]) => IDataWithMeta<D, IPageInfoForOperation>[],