diff --git a/apps/web/src/components/affine/operation-menu-items/MoveTo.tsx b/apps/web/src/components/affine/operation-menu-items/MoveTo.tsx index f31314b309..c088c4aa4e 100644 --- a/apps/web/src/components/affine/operation-menu-items/MoveTo.tsx +++ b/apps/web/src/components/affine/operation-menu-items/MoveTo.tsx @@ -2,7 +2,7 @@ import { MenuItem } from '@affine/component'; import { useTranslation } from '@affine/i18n'; import { ArrowRightSmallIcon, MoveToIcon } from '@blocksuite/icons'; import type { PageMeta } from '@blocksuite/store'; -import { useMemo, useRef, useState } from 'react'; +import { useRef, useState } from 'react'; import type { BlockSuiteWorkspace } from '../../../shared'; import { PinboardMenu } from '../pinboard'; @@ -47,10 +47,7 @@ export const MoveTo = ({ anchorEl={anchorEl} open={open} placement="left-start" - metas={useMemo( - () => metas.filter(m => !m.trash && m.id !== currentMeta.id), - [metas, currentMeta] - )} + metas={metas} currentMeta={currentMeta} blockSuiteWorkspace={blockSuiteWorkspace} onPinboardClick={onSelect} diff --git a/apps/web/src/components/affine/pinboard/pinboard-menu/index.tsx b/apps/web/src/components/affine/pinboard/pinboard-menu/index.tsx index bfafb0315b..c77d5c910e 100644 --- a/apps/web/src/components/affine/pinboard/pinboard-menu/index.tsx +++ b/apps/web/src/components/affine/pinboard/pinboard-menu/index.tsx @@ -3,7 +3,7 @@ import { Input, PureMenu, TreeView } from '@affine/component'; import { useTranslation } from '@affine/i18n'; import { RemoveIcon, SearchIcon } from '@blocksuite/icons'; import type { PageMeta } from '@blocksuite/store'; -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useMemo, useState } from 'react'; import { usePageMetaHelper } from '../../../../hooks/use-page-meta'; import { usePinboardData } from '../../../../hooks/use-pinboard-data'; @@ -29,13 +29,17 @@ export type PinboardMenuProps = { } & PureMenuProps; export const PinboardMenu = ({ - metas, + metas: propsMetas, currentMeta, blockSuiteWorkspace, showRemovePinboard = false, onPinboardClick, ...pureMenuProps }: PinboardMenuProps) => { + const metas = useMemo( + () => propsMetas.filter(m => m.id !== currentMeta.id), + [currentMeta.id, propsMetas] + ); const { t } = useTranslation(); const { setPageMeta } = usePageMetaHelper(blockSuiteWorkspace); const [query, setQuery] = useState(''); diff --git a/apps/web/src/components/affine/pinboard/pinboard-render/OperationButton.tsx b/apps/web/src/components/affine/pinboard/pinboard-render/OperationButton.tsx index 91fcfaa598..fc8d89d436 100644 --- a/apps/web/src/components/affine/pinboard/pinboard-render/OperationButton.tsx +++ b/apps/web/src/components/affine/pinboard/pinboard-render/OperationButton.tsx @@ -10,7 +10,7 @@ import type { PageMeta } from '@blocksuite/store'; import { useTheme } from '@mui/material'; import { useMemo, useState } from 'react'; -import { usePageMetaHelper } from '../../../../hooks/use-page-meta'; +import { useMetaHelper } from '../../../../hooks/affine/use-meta-helper'; import type { BlockSuiteWorkspace } from '../../../../shared'; import { toast } from '../../../../utils'; import { CopyLink, MoveToTrash } from '../../operation-menu-items'; @@ -49,7 +49,7 @@ export const OperationButton = ({ const [pinboardMenuOpen, setPinboardMenuOpen] = useState(false); const [confirmModalOpen, setConfirmModalOpen] = useState(false); const menuIndex = useMemo(() => modalIndex + 1, [modalIndex]); - const { setPageMeta } = usePageMetaHelper(blockSuiteWorkspace); + const { removeToTrash } = useMetaHelper(blockSuiteWorkspace); return ( { toast(t('Moved to Trash')); - setPageMeta(currentMeta.id, { - trash: true, - trashDate: +new Date(), - }); + removeToTrash(currentMeta.id); onDelete(); }} onCancel={() => { diff --git a/apps/web/src/components/blocksuite/block-suite-page-list/page-list/OperationCell.tsx b/apps/web/src/components/blocksuite/block-suite-page-list/page-list/OperationCell.tsx index 19d673a89a..a7e42edfc9 100644 --- a/apps/web/src/components/blocksuite/block-suite-page-list/page-list/OperationCell.tsx +++ b/apps/web/src/components/blocksuite/block-suite-page-list/page-list/OperationCell.tsx @@ -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 = ({ @@ -74,15 +73,12 @@ export const OperationCell: React.FC = ({ /> )} {!pageMeta.isRootPinboard && ( - { + { setOpen(true); }} - icon={} - > - {t('Move to Trash')} - + /> )} ); @@ -100,16 +96,11 @@ export const OperationCell: React.FC = ({ - { - onToggleTrashPage(id); + onToggleTrashPage(id, true); toast(t('Deleted')); setOpen(false); }} diff --git a/apps/web/src/components/blocksuite/block-suite-page-list/page-list/index.tsx b/apps/web/src/components/blocksuite/block-suite-page-list/page-list/index.tsx index 929db950fa..f8dff2bc16 100644 --- a/apps/web/src/components/blocksuite/block-suite-page-list/page-list/index.tsx +++ b/apps/web/src/components/blocksuite/block-suite-page-list/page-list/index.tsx @@ -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 = ({ }) => { 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 = ({ ), [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 ; } @@ -212,7 +201,7 @@ export const PageList: React.FC = ({ blockSuiteWorkspace.removePage(pageId); }} onRestorePage={() => { - restorePage(pageMeta, pageList); + restoreFromTrash(pageMeta.id); }} onOpenPage={pageId => { onClickPage(pageId, false); @@ -231,11 +220,12 @@ export const PageList: React.FC = ({ favorite: !pageMeta.favorite, }); }} - onToggleTrashPage={() => { - helper.setPageMeta(pageMeta.id, { - trash: !pageMeta.trash, - trashDate: +new Date(), - }); + onToggleTrashPage={(pageId, isTrash) => { + if (isTrash) { + removeToTrash(pageId); + } else { + restoreFromTrash(pageId); + } }} /> )} diff --git a/apps/web/src/components/blocksuite/workspace-header/header-right-items/EditorOptionMenu.tsx b/apps/web/src/components/blocksuite/workspace-header/header-right-items/EditorOptionMenu.tsx index ce506f8ca2..c336945b7e 100644 --- a/apps/web/src/components/blocksuite/workspace-header/header-right-items/EditorOptionMenu.tsx +++ b/apps/web/src/components/blocksuite/workspace-header/header-right-items/EditorOptionMenu.tsx @@ -14,6 +14,7 @@ import { useAtom } from 'jotai'; import { useState } from 'react'; import { workspacePreferredModeAtom } from '../../../../atoms'; +import { useMetaHelper } from '../../../../hooks/affine/use-meta-helper'; import { useCurrentPageId } from '../../../../hooks/current/use-current-page-id'; import { useCurrentWorkspace } from '../../../../hooks/current/use-current-workspace'; import { @@ -47,7 +48,7 @@ export const EditorOptionMenu = () => { const { favorite } = pageMeta; const { setPageMeta } = usePageMetaHelper(blockSuiteWorkspace); const [openConfirm, setOpenConfirm] = useState(false); - + const { removeToTrash } = useMetaHelper(blockSuiteWorkspace); const EditMenu = ( <> { open={openConfirm} meta={pageMeta} onConfirm={() => { + removeToTrash(pageMeta.id); toast(t('Moved to Trash')); - setPageMeta(pageMeta.id, { - trash: true, - trashDate: +new Date(), - }); }} onCancel={() => { setOpenConfirm(false); diff --git a/apps/web/src/components/blocksuite/workspace-header/header-right-items/TrashButtonGroup.tsx b/apps/web/src/components/blocksuite/workspace-header/header-right-items/TrashButtonGroup.tsx index 052edf1f0f..93bcab6dd6 100644 --- a/apps/web/src/components/blocksuite/workspace-header/header-right-items/TrashButtonGroup.tsx +++ b/apps/web/src/components/blocksuite/workspace-header/header-right-items/TrashButtonGroup.tsx @@ -4,12 +4,10 @@ import { assertExists } from '@blocksuite/store'; import { useRouter } from 'next/router'; import { useState } from 'react'; +import { useMetaHelper } from '../../../../hooks/affine/use-meta-helper'; import { useCurrentPageId } from '../../../../hooks/current/use-current-page-id'; import { useCurrentWorkspace } from '../../../../hooks/current/use-current-workspace'; -import { - usePageMeta, - usePageMetaHelper, -} from '../../../../hooks/use-page-meta'; +import { usePageMeta } from '../../../../hooks/use-page-meta'; export const TrashButtonGroup = () => { // fixme(himself65): remove these hooks ASAP @@ -22,12 +20,12 @@ export const TrashButtonGroup = () => { meta => meta.id === pageId ); assertExists(pageMeta); - const { setPageMeta } = usePageMetaHelper(blockSuiteWorkspace); + const { t } = useTranslation(); const router = useRouter(); - // + const { restoreFromTrash } = useMetaHelper(blockSuiteWorkspace); + const [open, setOpen] = useState(false); - const { t } = useTranslation(); return ( <>