feat: refactor trash, page would delete from its parent's subpageIds after move to trash (#1871)

This commit is contained in:
Qi
2023-04-12 14:14:57 +08:00
committed by GitHub
parent ba4a2fc9d2
commit af04c1b889
12 changed files with 119 additions and 82 deletions
@@ -0,0 +1,68 @@
import { useCallback } from 'react';
import type { BlockSuiteWorkspace } from '../../shared';
import { usePageMeta, usePageMetaHelper } from '../use-page-meta';
export function useMetaHelper(blockSuiteWorkspace: BlockSuiteWorkspace | null) {
const { setPageMeta, getPageMeta } = usePageMetaHelper(blockSuiteWorkspace);
const metas = usePageMeta(blockSuiteWorkspace);
const removeToTrash = useCallback(
(pageId: string, isRoot = true) => {
const parentMeta = metas.find(m => m.subpageIds?.includes(pageId));
const { subpageIds = [] } = getPageMeta(pageId) ?? {};
subpageIds.forEach(id => {
removeToTrash(id, false);
});
setPageMeta(pageId, {
trash: true,
trashDate: +new Date(),
trashRelate: isRoot ? parentMeta?.id : undefined,
});
// Just the trash root need delete its id from parent
if (parentMeta && isRoot) {
const deleteIndex = parentMeta.subpageIds.findIndex(
id => id === pageId
);
const newSubpageIds = [...parentMeta.subpageIds];
newSubpageIds.splice(deleteIndex, 1);
setPageMeta(parentMeta.id, {
subpageIds: newSubpageIds,
});
}
},
[getPageMeta, metas, setPageMeta]
);
const restoreFromTrash = useCallback(
(pageId: string) => {
const { subpageIds = [], trashRelate } = getPageMeta(pageId) ?? {};
if (trashRelate) {
const parentMeta = metas.find(m => m.id === trashRelate);
parentMeta &&
setPageMeta(parentMeta.id, {
subpageIds: [...parentMeta.subpageIds, pageId],
});
}
setPageMeta(pageId, {
trash: false,
trashDate: undefined,
trashRelate: undefined,
});
subpageIds.forEach(id => {
restoreFromTrash(id);
});
},
[getPageMeta, metas, setPageMeta]
);
return {
removeToTrash,
restoreFromTrash,
};
}
+2
View File
@@ -9,6 +9,8 @@ declare module '@blocksuite/store' {
interface PageMeta {
favorite?: boolean;
subpageIds: string[];
// If a page remove to trash, and it is a subpage, it will remove from its parent `subpageIds`, 'trashRelate' is use for save it parent
trashRelate?: string;
trash?: boolean;
trashDate?: number;
// whether to create the page with the default template
+6 -15
View File
@@ -5,6 +5,7 @@ import { nanoid } from '@blocksuite/store';
import { useCallback } from 'react';
import type { BlockSuiteWorkspace } from '../shared';
import { useMetaHelper } from './affine/use-meta-helper';
import { useBlockSuiteWorkspaceHelper } from './use-blocksuite-workspace-helper';
import { usePageMetaHelper } from './use-page-meta';
import type { NodeRenderProps } from './use-pinboard-data';
@@ -32,8 +33,9 @@ export function usePinboardHandler({
onDrop?: TreeViewProps<NodeRenderProps>['onDrop'];
}) {
const { createPage } = useBlockSuiteWorkspaceHelper(blockSuiteWorkspace);
const { getPageMeta, setPageMeta } = usePageMetaHelper(blockSuiteWorkspace);
const { setPageMeta } = usePageMetaHelper(blockSuiteWorkspace);
const { removeToTrash: removeToTrashHelper } =
useMetaHelper(blockSuiteWorkspace);
// Just need handle add operation, delete check is handled in blockSuite's reference link
const addReferenceLink = useCallback(
(pageId: string, referenceId: string) => {
@@ -71,21 +73,10 @@ export function usePinboardHandler({
const deletePin = useCallback(
(deleteId: string) => {
const removeToTrash = (currentMeta: PageMeta) => {
const { subpageIds = [] } = currentMeta;
setPageMeta(currentMeta.id, {
trash: true,
trashDate: +new Date(),
});
subpageIds.forEach(id => {
const subCurrentMeta = getPageMeta(id);
subCurrentMeta && removeToTrash(subCurrentMeta);
});
};
removeToTrash(metas.find(m => m.id === deleteId)!);
removeToTrashHelper(deleteId);
onDelete?.(deleteId);
},
[metas, getPageMeta, onDelete, setPageMeta]
[removeToTrashHelper, onDelete]
);
const dropPin = useCallback(