refactor(core): refactor atom to use di (#5831)

To support multiple instances, this PR removes some atoms and implements them using the new DI system.

removed atom

- `pageSettingsAtom`
- `currentPageIdAtom`
- `currentModeAtom`
This commit is contained in:
EYHN
2024-02-27 03:50:53 +00:00
parent 0dabb08217
commit ad9b0303c4
60 changed files with 602 additions and 626 deletions
@@ -1,17 +1,11 @@
import { useAsyncCallback } from '@affine/core/hooks/affine-async-hooks';
import {
useBlockSuitePageMeta,
usePageMetaHelper,
} from '@affine/core/hooks/use-block-suite-page-meta';
import { usePageMetaHelper } from '@affine/core/hooks/use-block-suite-page-meta';
import { useBlockSuiteWorkspaceHelper } from '@affine/core/hooks/use-block-suite-workspace-helper';
import { CollectionService } from '@affine/core/modules/collection';
import { useService } from '@toeverything/infra';
import { useAtomValue, useSetAtom } from 'jotai';
import { PageRecordList, useService } from '@toeverything/infra';
import { useCallback } from 'react';
import { applyUpdate, encodeStateAsUpdate } from 'yjs';
import { setPageModeAtom } from '../../atoms';
import { currentModeAtom } from '../../atoms/mode';
import type { BlockSuiteWorkspace } from '../../shared';
import { useNavigateHelper } from '../use-navigate-helper';
import { useReferenceLinkHelper } from './use-reference-link-helper';
@@ -22,31 +16,10 @@ export function useBlockSuiteMetaHelper(
const { setPageMeta, getPageMeta, setPageReadonly, setPageTitle } =
usePageMetaHelper(blockSuiteWorkspace);
const { addReferenceLink } = useReferenceLinkHelper(blockSuiteWorkspace);
const metas = useBlockSuitePageMeta(blockSuiteWorkspace);
const setPageMode = useSetAtom(setPageModeAtom);
const currentMode = useAtomValue(currentModeAtom);
const { createPage } = useBlockSuiteWorkspaceHelper(blockSuiteWorkspace);
const { openPage } = useNavigateHelper();
const collectionService = useService(CollectionService);
const switchToPageMode = useCallback(
(pageId: string) => {
setPageMode(pageId, 'page');
},
[setPageMode]
);
const switchToEdgelessMode = useCallback(
(pageId: string) => {
setPageMode(pageId, 'edgeless');
},
[setPageMode]
);
const togglePageMode = useCallback(
(pageId: string) => {
setPageMode(pageId, currentMode === 'edgeless' ? 'page' : 'edgeless');
},
[currentMode, setPageMode]
);
const pageRecordList = useService(PageRecordList);
const addToFavorite = useCallback(
(pageId: string) => {
@@ -77,28 +50,21 @@ export function useBlockSuiteMetaHelper(
// TODO-Doma
// "Remove" may cause ambiguity here. Consider renaming as "moveToTrash".
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);
});
(pageId: string) => {
setPageMeta(pageId, {
trash: true,
trashDate: Date.now(),
trashRelate: isRoot ? parentMeta?.id : undefined,
trashRelate: undefined,
});
setPageReadonly(pageId, true);
collectionService.deletePagesFromCollections([pageId]);
},
[collectionService, getPageMeta, metas, setPageMeta, setPageReadonly]
[collectionService, setPageMeta, setPageReadonly]
);
const restoreFromTrash = useCallback(
(pageId: string) => {
const { subpageIds = [], trashRelate } = getPageMeta(pageId) ?? {};
const { trashRelate } = getPageMeta(pageId) ?? {};
if (trashRelate) {
addReferenceLink(trashRelate, pageId);
@@ -110,9 +76,6 @@ export function useBlockSuiteMetaHelper(
trashRelate: undefined,
});
setPageReadonly(pageId, false);
subpageIds.forEach(id => {
restoreFromTrash(id);
});
},
[addReferenceLink, getPageMeta, setPageMeta, setPageReadonly]
);
@@ -150,6 +113,7 @@ export function useBlockSuiteMetaHelper(
const duplicate = useAsyncCallback(
async (pageId: string, openPageAfterDuplication: boolean = true) => {
const currentPageMode = pageRecordList.record(pageId).value?.mode.value;
const currentPageMeta = getPageMeta(pageId);
const newPage = createPage();
const currentPage = blockSuiteWorkspace.getPage(pageId);
@@ -174,28 +138,24 @@ export function useBlockSuiteMetaHelper(
const newPageTitle =
currentPageMeta.title.replace(lastDigitRegex, '') + `(${newNumber})`;
setPageMode(newPage.id, currentMode);
pageRecordList
.record(newPage.id)
.value?.setMode(currentPageMode || 'page');
setPageTitle(newPage.id, newPageTitle);
openPageAfterDuplication && openPage(blockSuiteWorkspace.id, newPage.id);
},
[
blockSuiteWorkspace,
createPage,
currentMode,
getPageMeta,
openPage,
pageRecordList,
setPageMeta,
setPageMode,
setPageTitle,
]
);
return {
switchToPageMode,
switchToEdgelessMode,
togglePageMode,
publicPage,
cancelPublicPage,
@@ -7,11 +7,10 @@ import {
revokePublicPageMutation,
} from '@affine/graphql';
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import type { Workspace } from '@toeverything/infra/workspace';
import type { PageMode, Workspace } from '@toeverything/infra';
import { useSetAtom } from 'jotai';
import { useCallback, useMemo } from 'react';
import type { PageMode } from '../../atoms';
import { useMutation } from '../use-mutation';
import { useQuery } from '../use-query';
@@ -4,7 +4,7 @@ import { WorkspaceFlavour } from '@affine/env/workspace';
import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { assertExists } from '@blocksuite/global/utils';
import { EdgelessIcon, HistoryIcon, PageIcon } from '@blocksuite/icons';
import { Workspace } from '@toeverything/infra';
import { Page, useLiveData, Workspace } from '@toeverything/infra';
import {
PreconditionStrategy,
registerAffineCommand,
@@ -18,10 +18,10 @@ import { useBlockSuiteMetaHelper } from './use-block-suite-meta-helper';
import { useExportPage } from './use-export-page';
import { useTrashModalHelper } from './use-trash-modal-helper';
export function useRegisterBlocksuiteEditorCommands(
pageId: string,
mode: 'page' | 'edgeless'
) {
export function useRegisterBlocksuiteEditorCommands() {
const page = useService(Page);
const pageId = page.id;
const mode = useLiveData(page.mode);
const t = useAFFiNEI18N();
const workspace = useService(Workspace);
const blockSuiteWorkspace = workspace.blockSuiteWorkspace;
@@ -42,7 +42,7 @@ export function useRegisterBlocksuiteEditorCommands(
}));
}, [pageId, setPageHistoryModalState]);
const { togglePageMode, toggleFavorite, restoreFromTrash, duplicate } =
const { toggleFavorite, restoreFromTrash, duplicate } =
useBlockSuiteMetaHelper(blockSuiteWorkspace);
const exportHandler = useExportPage(currentPage);
const { setTrashModal } = useTrashModalHelper(blockSuiteWorkspace);
@@ -116,7 +116,7 @@ export function useRegisterBlocksuiteEditorCommands(
: t['com.affine.pageMode.page']()
}`,
run() {
togglePageMode(pageId);
page.toggleMode();
toast(
mode === 'page'
? t['com.affine.toastMessage.edgelessMode']()
@@ -245,10 +245,10 @@ export function useRegisterBlocksuiteEditorCommands(
restoreFromTrash,
t,
toggleFavorite,
togglePageMode,
trash,
isCloudWorkspace,
openHistoryModal,
duplicate,
page,
]);
}
@@ -1,15 +0,0 @@
import { useBlockSuiteWorkspacePage } from '@affine/core/hooks/use-block-suite-workspace-page';
import { Workspace } from '@toeverything/infra';
import { useService } from '@toeverything/infra/di';
import { useAtomValue } from 'jotai';
import { currentPageIdAtom } from '../../atoms/mode';
export const useCurrentPage = () => {
const currentPageId = useAtomValue(currentPageIdAtom);
const currentWorkspace = useService(Workspace);
return useBlockSuiteWorkspacePage(
currentWorkspace.blockSuiteWorkspace,
currentPageId
);
};
@@ -1,4 +1,3 @@
import type { PageMeta } from '@blocksuite/store';
import { noop } from 'lodash-es';
import { useEffect } from 'react';
@@ -16,6 +15,6 @@ export function useDocumentTitle(newTitle?: string | null) {
}, [newTitle]);
}
export function usePageDocumentTitle(pageMeta?: PageMeta) {
useDocumentTitle(pageMeta?.title ? `${pageMeta.title} · AFFiNE` : null);
export function usePageDocumentTitle(pageTitle?: string) {
useDocumentTitle(pageTitle ? `${pageTitle} · AFFiNE` : null);
}
@@ -1,4 +1,4 @@
import { initEmptyPage } from '@toeverything/infra/blocksuite';
import { initEmptyPage } from '@toeverything/infra';
import dayjs from 'dayjs';
import { useCallback, useMemo } from 'react';