mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-20 03:26:47 +08:00
feat: refactor trash, page would delete from its parent's subpageIds after move to trash (#1871)
This commit is contained in:
@@ -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,
|
||||
};
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user