|
|
@@ -3,9 +3,9 @@ import React, { FC } from 'react';
|
|
|
import { IPageHasId } from '../../../interfaces/page';
|
|
|
import { ItemNode } from './ItemNode';
|
|
|
import Item from './Item';
|
|
|
-import { useSWRxPageAncestorsChildren } from '../../../stores/page-listing';
|
|
|
-import { useTargetAndAncestors, useCurrentPagePath } from '../../../stores/context';
|
|
|
-import { HasObjectId } from '../../../interfaces/has-object-id';
|
|
|
+import { useSWRxPageAncestorsChildren, useSWRxRootPage } from '../../../stores/page-listing';
|
|
|
+import { TargetAndAncestors } from '~/interfaces/page-listing-results';
|
|
|
+import { toastError } from '~/client/util/apiNotification';
|
|
|
|
|
|
|
|
|
/*
|
|
|
@@ -43,54 +43,52 @@ const generateInitialNodeAfterResponse = (ancestorsChildren: Record<string, Part
|
|
|
};
|
|
|
|
|
|
type ItemsTreeProps = {
|
|
|
- path: string
|
|
|
+ targetPath: string
|
|
|
+ targetId?: string
|
|
|
+ targetAndAncestorsData?: TargetAndAncestors
|
|
|
}
|
|
|
|
|
|
+const renderByInitialNode = (initialNode: ItemNode, targetId?: string): JSX.Element => {
|
|
|
+ return (
|
|
|
+ <div className="grw-pagetree p-3">
|
|
|
+ <Item key={initialNode.page.path} targetId={targetId} itemNode={initialNode} isOpen />
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
|
|
|
/*
|
|
|
* ItemsTree
|
|
|
*/
|
|
|
const ItemsTree: FC<ItemsTreeProps> = (props: ItemsTreeProps) => {
|
|
|
- const { data, error } = useTargetAndAncestors();
|
|
|
+ const { targetPath, targetId, targetAndAncestorsData } = props;
|
|
|
|
|
|
- const { data: ancestorsChildrenData, error: error2 } = useSWRxPageAncestorsChildren(props.path);
|
|
|
+ const { data: ancestorsChildrenData, error: error1 } = useSWRxPageAncestorsChildren(targetPath);
|
|
|
+ const { data: rootPageData, error: error2 } = useSWRxRootPage(true);
|
|
|
|
|
|
- if (error != null || error2 != null) {
|
|
|
+ if (error1 != null || error2 != null) {
|
|
|
+ // TODO: improve message
|
|
|
+ toastError('Error occurred while fetching pages to render PageTree');
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- if (data == null) { // when not permalink
|
|
|
- return null;
|
|
|
- }
|
|
|
-
|
|
|
- const { targetAndAncestors, rootPage } = data;
|
|
|
-
|
|
|
- let initialNode: ItemNode;
|
|
|
-
|
|
|
/*
|
|
|
- * Before swr response comes back
|
|
|
+ * Render completely
|
|
|
*/
|
|
|
- if (ancestorsChildrenData == null) {
|
|
|
- initialNode = generateInitialNodeBeforeResponse(targetAndAncestors);
|
|
|
+ if (ancestorsChildrenData != null && rootPageData != null) {
|
|
|
+ const initialNode = generateInitialNodeAfterResponse(ancestorsChildrenData.ancestorsChildren, new ItemNode(rootPageData.rootPage));
|
|
|
+ return renderByInitialNode(initialNode, targetId);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * When swr request finishes
|
|
|
+ * Before swr response comes back
|
|
|
*/
|
|
|
- else {
|
|
|
- const { ancestorsChildren } = ancestorsChildrenData;
|
|
|
-
|
|
|
- const rootNode = new ItemNode(rootPage);
|
|
|
-
|
|
|
- initialNode = generateInitialNodeAfterResponse(ancestorsChildren, rootNode);
|
|
|
+ if (targetAndAncestorsData != null) {
|
|
|
+ const initialNode = generateInitialNodeBeforeResponse(targetAndAncestorsData.targetAndAncestors);
|
|
|
+ return renderByInitialNode(initialNode, targetId);
|
|
|
}
|
|
|
|
|
|
- const isOpen = true;
|
|
|
- return (
|
|
|
- <div className="grw-pagetree p-3">
|
|
|
- <Item key={initialNode.page.path} itemNode={initialNode} isOpen={isOpen} />
|
|
|
- </div>
|
|
|
- );
|
|
|
+ return null;
|
|
|
};
|
|
|
|
|
|
|