mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-26 10:45:57 +08:00
feat: refactor trash, page would delete from its parent's subpageIds after move to trash (#1871)
This commit is contained in:
@@ -9,7 +9,6 @@ import {
|
||||
import { useTranslation } from '@affine/i18n';
|
||||
import {
|
||||
DeletePermanentlyIcon,
|
||||
DeleteTemporarilyIcon,
|
||||
FavoritedIcon,
|
||||
FavoriteIcon,
|
||||
MoreVerticalIcon,
|
||||
@@ -22,7 +21,7 @@ import { useState } from 'react';
|
||||
|
||||
import type { BlockSuiteWorkspace } from '../../../../shared';
|
||||
import { toast } from '../../../../utils';
|
||||
import { MoveTo } from '../../../affine/operation-menu-items';
|
||||
import { MoveTo, MoveToTrash } from '../../../affine/operation-menu-items';
|
||||
|
||||
export type OperationCellProps = {
|
||||
pageMeta: PageMeta;
|
||||
@@ -30,7 +29,7 @@ export type OperationCellProps = {
|
||||
blockSuiteWorkspace: BlockSuiteWorkspace;
|
||||
onOpenPageInNewTab: (pageId: string) => void;
|
||||
onToggleFavoritePage: (pageId: string) => void;
|
||||
onToggleTrashPage: (pageId: string) => void;
|
||||
onToggleTrashPage: (pageId: string, isTrash: boolean) => void;
|
||||
};
|
||||
|
||||
export const OperationCell: React.FC<OperationCellProps> = ({
|
||||
@@ -74,15 +73,12 @@ export const OperationCell: React.FC<OperationCellProps> = ({
|
||||
/>
|
||||
)}
|
||||
{!pageMeta.isRootPinboard && (
|
||||
<MenuItem
|
||||
data-testid="move-to-trash"
|
||||
onClick={() => {
|
||||
<MoveToTrash
|
||||
testId="move-to-trash"
|
||||
onItemClick={() => {
|
||||
setOpen(true);
|
||||
}}
|
||||
icon={<DeleteTemporarilyIcon />}
|
||||
>
|
||||
{t('Move to Trash')}
|
||||
</MenuItem>
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
@@ -100,16 +96,11 @@ export const OperationCell: React.FC<OperationCellProps> = ({
|
||||
</IconButton>
|
||||
</Menu>
|
||||
</FlexWrapper>
|
||||
<Confirm
|
||||
<MoveToTrash.ConfirmModal
|
||||
open={open}
|
||||
title={t('Delete page?')}
|
||||
content={t('will be moved to Trash', {
|
||||
title: pageMeta.title || 'Untitled',
|
||||
})}
|
||||
confirmText={t('Delete')}
|
||||
confirmType="danger"
|
||||
meta={pageMeta}
|
||||
onConfirm={() => {
|
||||
onToggleTrashPage(id);
|
||||
onToggleTrashPage(id, true);
|
||||
toast(t('Deleted'));
|
||||
setOpen(false);
|
||||
}}
|
||||
|
||||
@@ -19,9 +19,10 @@ import type { PageMeta } from '@blocksuite/store';
|
||||
import { useMediaQuery, useTheme } from '@mui/material';
|
||||
import { useAtomValue } from 'jotai';
|
||||
import type React from 'react';
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { useMemo } from 'react';
|
||||
|
||||
import { workspacePreferredModeAtom } from '../../../../atoms';
|
||||
import { useMetaHelper } from '../../../../hooks/affine/use-meta-helper';
|
||||
import {
|
||||
usePageMeta,
|
||||
usePageMetaHelper,
|
||||
@@ -101,6 +102,8 @@ export const PageList: React.FC<PageListProps> = ({
|
||||
}) => {
|
||||
const pageList = usePageMeta(blockSuiteWorkspace);
|
||||
const helper = usePageMetaHelper(blockSuiteWorkspace);
|
||||
const { removeToTrash, restoreFromTrash } =
|
||||
useMetaHelper(blockSuiteWorkspace);
|
||||
const { t } = useTranslation();
|
||||
const theme = useTheme();
|
||||
const matches = useMediaQuery(theme.breakpoints.up('sm'));
|
||||
@@ -113,20 +116,6 @@ export const PageList: React.FC<PageListProps> = ({
|
||||
),
|
||||
[pageList, listType]
|
||||
);
|
||||
const restorePage = useCallback(
|
||||
(pageMeta: PageMeta, allMetas: PageMeta[]) => {
|
||||
helper.setPageMeta(pageMeta.id, {
|
||||
trash: false,
|
||||
});
|
||||
|
||||
allMetas
|
||||
.filter(m => pageMeta?.subpageIds.includes(m.id))
|
||||
.forEach(m => {
|
||||
restorePage(m, allMetas);
|
||||
});
|
||||
},
|
||||
[helper]
|
||||
);
|
||||
if (list.length === 0) {
|
||||
return <Empty listType={listType} />;
|
||||
}
|
||||
@@ -212,7 +201,7 @@ export const PageList: React.FC<PageListProps> = ({
|
||||
blockSuiteWorkspace.removePage(pageId);
|
||||
}}
|
||||
onRestorePage={() => {
|
||||
restorePage(pageMeta, pageList);
|
||||
restoreFromTrash(pageMeta.id);
|
||||
}}
|
||||
onOpenPage={pageId => {
|
||||
onClickPage(pageId, false);
|
||||
@@ -231,11 +220,12 @@ export const PageList: React.FC<PageListProps> = ({
|
||||
favorite: !pageMeta.favorite,
|
||||
});
|
||||
}}
|
||||
onToggleTrashPage={() => {
|
||||
helper.setPageMeta(pageMeta.id, {
|
||||
trash: !pageMeta.trash,
|
||||
trashDate: +new Date(),
|
||||
});
|
||||
onToggleTrashPage={(pageId, isTrash) => {
|
||||
if (isTrash) {
|
||||
removeToTrash(pageId);
|
||||
} else {
|
||||
restoreFromTrash(pageId);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user