From 6202ba5ada12705756568e4bbe2521a2f2a2033d Mon Sep 17 00:00:00 2001 From: EYHN Date: Mon, 29 Apr 2024 08:51:31 +0000 Subject: [PATCH] refactor(core): remove jump once (#6733) Previously, we marked `jumpOnce: true` on `doc.meta` to open a specific doc after creating a new workspace. This pr removes `jumpOnce` and directly jumps to the specific doc URL. This PR also fixes an error when opening the all-page page, because the all-page page scans the jumpOnce attribute of all docs, and the code in it will fail on damaged data. --- .../core/src/bootstrap/first-app-data.ts | 44 +++++++------------ .../affine/create-workspace-modal/index.tsx | 13 +++--- packages/frontend/core/src/pages/index.tsx | 27 +++++++++--- .../src/pages/workspace/all-page/all-page.tsx | 23 +--------- .../workspace/detail-page/detail-page.tsx | 8 ---- .../core/src/providers/modal-provider.tsx | 12 +++-- tools/@types/env/__all.d.ts | 1 - 7 files changed, 50 insertions(+), 78 deletions(-) diff --git a/packages/frontend/core/src/bootstrap/first-app-data.ts b/packages/frontend/core/src/bootstrap/first-app-data.ts index 90f4a6bead..34d01088db 100644 --- a/packages/frontend/core/src/bootstrap/first-app-data.ts +++ b/packages/frontend/core/src/bootstrap/first-app-data.ts @@ -24,31 +24,18 @@ export async function buildShowcaseWorkspace( const docsService = workspace.scope.get(DocsService); - // todo: find better way to do the following - // perhaps put them into middleware? - { - // the "Write, Draw, Plan all at Once." page should be set to edgeless mode - const edgelessPage1 = docsService.list.docs$.value.find( - p => p.title$.value === 'Write, Draw, Plan all at Once.' - ); + // should jump to "Write, Draw, Plan all at Once." in edgeless by default + const defaultDoc = docsService.list.docs$.value.find(p => + p.title$.value.startsWith('Write, Draw, Plan all at Once.') + ); - if (edgelessPage1) { - edgelessPage1.setMode('edgeless'); - } - - // should jump to "Write, Draw, Plan all at Once." by default - const defaultPage = docsService.list.docs$.value.find(p => - p.title$.value.startsWith('Write, Draw, Plan all at Once.') - ); - - if (defaultPage) { - defaultPage.setMeta({ - jumpOnce: true, - }); - } + if (defaultDoc) { + defaultDoc.setMode('edgeless'); } + dispose(); - return meta; + + return { meta, defaultDocId: defaultDoc?.id }; } const logger = new DebugLogger('createFirstAppData'); @@ -59,26 +46,25 @@ export async function createFirstAppData(workspacesService: WorkspacesService) { } localStorage.setItem('is-first-open', 'false'); if (runtimeConfig.enablePreloading) { - const workspaceMetadata = await buildShowcaseWorkspace( + const { meta, defaultDocId } = await buildShowcaseWorkspace( workspacesService, WorkspaceFlavour.LOCAL, DEFAULT_WORKSPACE_NAME ); - logger.info('create first workspace', workspaceMetadata); - return workspaceMetadata; + logger.info('create first workspace', defaultDocId); + return { meta, defaultPageId: defaultDocId }; } else { + let defaultPageId: string | undefined = undefined; const workspaceMetadata = await workspacesService.create( WorkspaceFlavour.LOCAL, async workspace => { workspace.meta.setName(DEFAULT_WORKSPACE_NAME); const page = workspace.createDoc(); - workspace.setDocMeta(page.id, { - jumpOnce: true, - }); + defaultPageId = page.id; initEmptyPage(page); } ); logger.info('create first workspace', workspaceMetadata); - return workspaceMetadata; + return { meta: workspaceMetadata, defaultPageId }; } } diff --git a/packages/frontend/core/src/components/affine/create-workspace-modal/index.tsx b/packages/frontend/core/src/components/affine/create-workspace-modal/index.tsx index 4be31e42d4..a23698220a 100644 --- a/packages/frontend/core/src/components/affine/create-workspace-modal/index.tsx +++ b/packages/frontend/core/src/components/affine/create-workspace-modal/index.tsx @@ -36,7 +36,7 @@ const logger = new DebugLogger('CreateWorkspaceModal'); interface ModalProps { mode: CreateWorkspaceMode; // false means not open onClose: () => void; - onCreate: (id: string) => void; + onCreate: (id: string, defaultDocId?: string) => void; } interface NameWorkspaceContentProps extends ConfirmModalProps { @@ -236,25 +236,24 @@ export const CreateWorkspaceModal = ({ // this will be the last step for web for now // fix me later if (runtimeConfig.enablePreloading) { - const { id } = await buildShowcaseWorkspace( + const { meta, defaultDocId } = await buildShowcaseWorkspace( workspacesService, workspaceFlavour, name ); - onCreate(id); + onCreate(meta.id, defaultDocId); } else { + let defaultDocId: string | undefined = undefined; const { id } = await workspacesService.create( workspaceFlavour, async workspace => { workspace.meta.setName(name); const page = workspace.createDoc(); - workspace.setDocMeta(page.id, { - jumpOnce: true, - }); + defaultDocId = page.id; initEmptyPage(page); } ); - onCreate(id); + onCreate(id, defaultDocId); } setLoading(false); diff --git a/packages/frontend/core/src/pages/index.tsx b/packages/frontend/core/src/pages/index.tsx index 5047947277..fa5a080f5c 100644 --- a/packages/frontend/core/src/pages/index.tsx +++ b/packages/frontend/core/src/pages/index.tsx @@ -48,7 +48,7 @@ export const Component = () => { const list = useLiveData(workspacesService.list.workspaces$); const listIsLoading = useLiveData(workspacesService.list.isLoading$); - const { openPage } = useNavigateHelper(); + const { openPage, jumpToPage } = useNavigateHelper(); const [searchParams] = useSearchParams(); const createOnceRef = useRef(false); @@ -61,9 +61,15 @@ export const Component = () => { WorkspaceFlavour.AFFINE_CLOUD, 'AFFiNE Cloud' ) - .then(workspace => openPage(workspace.id, WorkspaceSubPath.ALL)) + .then(({ meta, defaultDocId }) => { + if (defaultDocId) { + jumpToPage(meta.id, defaultDocId); + } else { + openPage(meta.id, WorkspaceSubPath.ALL); + } + }) .catch(err => console.error('Failed to create cloud workspace', err)); - }, [openPage, workspacesService]); + }, [jumpToPage, openPage, workspacesService]); useLayoutEffect(() => { if (!navigating) { @@ -114,9 +120,16 @@ export const Component = () => { useEffect(() => { setCreating(true); createFirstAppData(workspacesService) - .then(workspaceMeta => { - if (workspaceMeta) { - openPage(workspaceMeta.id, WorkspaceSubPath.ALL); + .then(createdWorkspace => { + if (createdWorkspace) { + if (createdWorkspace.defaultPageId) { + jumpToPage( + createdWorkspace.meta.id, + createdWorkspace.defaultPageId + ); + } else { + openPage(createdWorkspace.meta.id, WorkspaceSubPath.ALL); + } } }) .catch(err => { @@ -125,7 +138,7 @@ export const Component = () => { .finally(() => { setCreating(false); }); - }, [openPage, workspacesService]); + }, [jumpToPage, openPage, workspacesService]); if (navigating || creating) { return ; diff --git a/packages/frontend/core/src/pages/workspace/all-page/all-page.tsx b/packages/frontend/core/src/pages/workspace/all-page/all-page.tsx index 2c5da62352..d0b15b71bb 100644 --- a/packages/frontend/core/src/pages/workspace/all-page/all-page.tsx +++ b/packages/frontend/core/src/pages/workspace/all-page/all-page.tsx @@ -4,11 +4,10 @@ import { VirtualizedPageList, } from '@affine/core/components/page-list'; import { useBlockSuiteDocMeta } from '@affine/core/hooks/use-block-suite-page-meta'; -import { useNavigateHelper } from '@affine/core/hooks/use-navigate-helper'; import { performanceRenderLogger } from '@affine/core/shared'; import type { Filter } from '@affine/env/filter'; import { useService, WorkspaceService } from '@toeverything/infra'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { ViewBodyIsland, ViewHeaderIsland } from '../../../modules/workbench'; import { EmptyPageList } from '../page-list-empty'; @@ -59,25 +58,5 @@ export const AllPage = () => { export const Component = () => { performanceRenderLogger.info('AllPage'); - const currentWorkspace = useService(WorkspaceService).workspace; - const navigateHelper = useNavigateHelper(); - - useEffect(() => { - function checkJumpOnce() { - for (const [pageId] of currentWorkspace.docCollection.docs) { - const page = currentWorkspace.docCollection.getDoc(pageId); - if (page && page.meta?.jumpOnce) { - currentWorkspace.docCollection.meta.setDocMeta(page.id, { - jumpOnce: false, - }); - navigateHelper.jumpToPage(currentWorkspace.id, pageId); - } - } - } - checkJumpOnce(); - return currentWorkspace.docCollection.slots.docUpdated.on(checkJumpOnce) - .dispose; - }, [currentWorkspace.docCollection, currentWorkspace.id, navigateHelper]); - return ; }; diff --git a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx index 65a9abe2ad..25cca55be0 100644 --- a/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx +++ b/packages/frontend/core/src/pages/workspace/detail-page/detail-page.tsx @@ -325,14 +325,6 @@ export const DetailPage = ({ pageId }: { pageId: string }): ReactElement => { }; }, [currentWorkspace, pageId]); - const jumpOnce = useLiveData(doc?.meta$.map(meta => meta.jumpOnce)); - - useEffect(() => { - if (jumpOnce) { - doc?.record.setMeta({ jumpOnce: false }); - } - }, [doc?.record, jumpOnce]); - const isInTrash = useLiveData(doc?.meta$.map(meta => meta.trash)); useEffect(() => { diff --git a/packages/frontend/core/src/providers/modal-provider.tsx b/packages/frontend/core/src/providers/modal-provider.tsx index fcb521ffeb..2bcd3910d5 100644 --- a/packages/frontend/core/src/providers/modal-provider.tsx +++ b/packages/frontend/core/src/providers/modal-provider.tsx @@ -259,7 +259,7 @@ export const AllWorkspaceModals = (): ReactElement => { openCreateWorkspaceModalAtom ); - const { jumpToSubPath } = useNavigateHelper(); + const { jumpToSubPath, jumpToPage } = useNavigateHelper(); return ( <> @@ -270,15 +270,19 @@ export const AllWorkspaceModals = (): ReactElement => { setOpenCreateWorkspaceModal(false); }, [setOpenCreateWorkspaceModal])} onCreate={useCallback( - id => { + (id, defaultDocId) => { setOpenCreateWorkspaceModal(false); // if jumping immediately, the page may stuck in loading state // not sure why yet .. here is a workaround setTimeout(() => { - jumpToSubPath(id, WorkspaceSubPath.ALL); + if (!defaultDocId) { + jumpToSubPath(id, WorkspaceSubPath.ALL); + } else { + jumpToPage(id, defaultDocId); + } }); }, - [jumpToSubPath, setOpenCreateWorkspaceModal] + [jumpToPage, jumpToSubPath, setOpenCreateWorkspaceModal] )} /> diff --git a/tools/@types/env/__all.d.ts b/tools/@types/env/__all.d.ts index 224bc064e5..210d4f9ec5 100644 --- a/tools/@types/env/__all.d.ts +++ b/tools/@types/env/__all.d.ts @@ -30,7 +30,6 @@ declare module '@blocksuite/store' { trashDate?: number; updatedDate?: number; mode?: 'page' | 'edgeless'; - jumpOnce?: boolean; // todo: support `number` in the future isPublic?: boolean; }