mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-24 04:27:27 +08:00
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.
This commit is contained in:
@@ -24,31 +24,18 @@ export async function buildShowcaseWorkspace(
|
|||||||
|
|
||||||
const docsService = workspace.scope.get(DocsService);
|
const docsService = workspace.scope.get(DocsService);
|
||||||
|
|
||||||
// todo: find better way to do the following
|
// should jump to "Write, Draw, Plan all at Once." in edgeless by default
|
||||||
// perhaps put them into middleware?
|
const defaultDoc = docsService.list.docs$.value.find(p =>
|
||||||
{
|
p.title$.value.startsWith('Write, Draw, Plan all at Once.')
|
||||||
// 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.'
|
|
||||||
);
|
|
||||||
|
|
||||||
if (edgelessPage1) {
|
if (defaultDoc) {
|
||||||
edgelessPage1.setMode('edgeless');
|
defaultDoc.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,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dispose();
|
dispose();
|
||||||
return meta;
|
|
||||||
|
return { meta, defaultDocId: defaultDoc?.id };
|
||||||
}
|
}
|
||||||
|
|
||||||
const logger = new DebugLogger('createFirstAppData');
|
const logger = new DebugLogger('createFirstAppData');
|
||||||
@@ -59,26 +46,25 @@ export async function createFirstAppData(workspacesService: WorkspacesService) {
|
|||||||
}
|
}
|
||||||
localStorage.setItem('is-first-open', 'false');
|
localStorage.setItem('is-first-open', 'false');
|
||||||
if (runtimeConfig.enablePreloading) {
|
if (runtimeConfig.enablePreloading) {
|
||||||
const workspaceMetadata = await buildShowcaseWorkspace(
|
const { meta, defaultDocId } = await buildShowcaseWorkspace(
|
||||||
workspacesService,
|
workspacesService,
|
||||||
WorkspaceFlavour.LOCAL,
|
WorkspaceFlavour.LOCAL,
|
||||||
DEFAULT_WORKSPACE_NAME
|
DEFAULT_WORKSPACE_NAME
|
||||||
);
|
);
|
||||||
logger.info('create first workspace', workspaceMetadata);
|
logger.info('create first workspace', defaultDocId);
|
||||||
return workspaceMetadata;
|
return { meta, defaultPageId: defaultDocId };
|
||||||
} else {
|
} else {
|
||||||
|
let defaultPageId: string | undefined = undefined;
|
||||||
const workspaceMetadata = await workspacesService.create(
|
const workspaceMetadata = await workspacesService.create(
|
||||||
WorkspaceFlavour.LOCAL,
|
WorkspaceFlavour.LOCAL,
|
||||||
async workspace => {
|
async workspace => {
|
||||||
workspace.meta.setName(DEFAULT_WORKSPACE_NAME);
|
workspace.meta.setName(DEFAULT_WORKSPACE_NAME);
|
||||||
const page = workspace.createDoc();
|
const page = workspace.createDoc();
|
||||||
workspace.setDocMeta(page.id, {
|
defaultPageId = page.id;
|
||||||
jumpOnce: true,
|
|
||||||
});
|
|
||||||
initEmptyPage(page);
|
initEmptyPage(page);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
logger.info('create first workspace', workspaceMetadata);
|
logger.info('create first workspace', workspaceMetadata);
|
||||||
return workspaceMetadata;
|
return { meta: workspaceMetadata, defaultPageId };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ const logger = new DebugLogger('CreateWorkspaceModal');
|
|||||||
interface ModalProps {
|
interface ModalProps {
|
||||||
mode: CreateWorkspaceMode; // false means not open
|
mode: CreateWorkspaceMode; // false means not open
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
onCreate: (id: string) => void;
|
onCreate: (id: string, defaultDocId?: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface NameWorkspaceContentProps extends ConfirmModalProps {
|
interface NameWorkspaceContentProps extends ConfirmModalProps {
|
||||||
@@ -236,25 +236,24 @@ export const CreateWorkspaceModal = ({
|
|||||||
// this will be the last step for web for now
|
// this will be the last step for web for now
|
||||||
// fix me later
|
// fix me later
|
||||||
if (runtimeConfig.enablePreloading) {
|
if (runtimeConfig.enablePreloading) {
|
||||||
const { id } = await buildShowcaseWorkspace(
|
const { meta, defaultDocId } = await buildShowcaseWorkspace(
|
||||||
workspacesService,
|
workspacesService,
|
||||||
workspaceFlavour,
|
workspaceFlavour,
|
||||||
name
|
name
|
||||||
);
|
);
|
||||||
onCreate(id);
|
onCreate(meta.id, defaultDocId);
|
||||||
} else {
|
} else {
|
||||||
|
let defaultDocId: string | undefined = undefined;
|
||||||
const { id } = await workspacesService.create(
|
const { id } = await workspacesService.create(
|
||||||
workspaceFlavour,
|
workspaceFlavour,
|
||||||
async workspace => {
|
async workspace => {
|
||||||
workspace.meta.setName(name);
|
workspace.meta.setName(name);
|
||||||
const page = workspace.createDoc();
|
const page = workspace.createDoc();
|
||||||
workspace.setDocMeta(page.id, {
|
defaultDocId = page.id;
|
||||||
jumpOnce: true,
|
|
||||||
});
|
|
||||||
initEmptyPage(page);
|
initEmptyPage(page);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
onCreate(id);
|
onCreate(id, defaultDocId);
|
||||||
}
|
}
|
||||||
|
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ export const Component = () => {
|
|||||||
const list = useLiveData(workspacesService.list.workspaces$);
|
const list = useLiveData(workspacesService.list.workspaces$);
|
||||||
const listIsLoading = useLiveData(workspacesService.list.isLoading$);
|
const listIsLoading = useLiveData(workspacesService.list.isLoading$);
|
||||||
|
|
||||||
const { openPage } = useNavigateHelper();
|
const { openPage, jumpToPage } = useNavigateHelper();
|
||||||
const [searchParams] = useSearchParams();
|
const [searchParams] = useSearchParams();
|
||||||
|
|
||||||
const createOnceRef = useRef(false);
|
const createOnceRef = useRef(false);
|
||||||
@@ -61,9 +61,15 @@ export const Component = () => {
|
|||||||
WorkspaceFlavour.AFFINE_CLOUD,
|
WorkspaceFlavour.AFFINE_CLOUD,
|
||||||
'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));
|
.catch(err => console.error('Failed to create cloud workspace', err));
|
||||||
}, [openPage, workspacesService]);
|
}, [jumpToPage, openPage, workspacesService]);
|
||||||
|
|
||||||
useLayoutEffect(() => {
|
useLayoutEffect(() => {
|
||||||
if (!navigating) {
|
if (!navigating) {
|
||||||
@@ -114,9 +120,16 @@ export const Component = () => {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setCreating(true);
|
setCreating(true);
|
||||||
createFirstAppData(workspacesService)
|
createFirstAppData(workspacesService)
|
||||||
.then(workspaceMeta => {
|
.then(createdWorkspace => {
|
||||||
if (workspaceMeta) {
|
if (createdWorkspace) {
|
||||||
openPage(workspaceMeta.id, WorkspaceSubPath.ALL);
|
if (createdWorkspace.defaultPageId) {
|
||||||
|
jumpToPage(
|
||||||
|
createdWorkspace.meta.id,
|
||||||
|
createdWorkspace.defaultPageId
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
openPage(createdWorkspace.meta.id, WorkspaceSubPath.ALL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch(err => {
|
.catch(err => {
|
||||||
@@ -125,7 +138,7 @@ export const Component = () => {
|
|||||||
.finally(() => {
|
.finally(() => {
|
||||||
setCreating(false);
|
setCreating(false);
|
||||||
});
|
});
|
||||||
}, [openPage, workspacesService]);
|
}, [jumpToPage, openPage, workspacesService]);
|
||||||
|
|
||||||
if (navigating || creating) {
|
if (navigating || creating) {
|
||||||
return <WorkspaceFallback></WorkspaceFallback>;
|
return <WorkspaceFallback></WorkspaceFallback>;
|
||||||
|
|||||||
@@ -4,11 +4,10 @@ import {
|
|||||||
VirtualizedPageList,
|
VirtualizedPageList,
|
||||||
} from '@affine/core/components/page-list';
|
} from '@affine/core/components/page-list';
|
||||||
import { useBlockSuiteDocMeta } from '@affine/core/hooks/use-block-suite-page-meta';
|
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 { performanceRenderLogger } from '@affine/core/shared';
|
||||||
import type { Filter } from '@affine/env/filter';
|
import type { Filter } from '@affine/env/filter';
|
||||||
import { useService, WorkspaceService } from '@toeverything/infra';
|
import { useService, WorkspaceService } from '@toeverything/infra';
|
||||||
import { useEffect, useState } from 'react';
|
import { useState } from 'react';
|
||||||
|
|
||||||
import { ViewBodyIsland, ViewHeaderIsland } from '../../../modules/workbench';
|
import { ViewBodyIsland, ViewHeaderIsland } from '../../../modules/workbench';
|
||||||
import { EmptyPageList } from '../page-list-empty';
|
import { EmptyPageList } from '../page-list-empty';
|
||||||
@@ -59,25 +58,5 @@ export const AllPage = () => {
|
|||||||
export const Component = () => {
|
export const Component = () => {
|
||||||
performanceRenderLogger.info('AllPage');
|
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 <AllPage />;
|
return <AllPage />;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -325,14 +325,6 @@ export const DetailPage = ({ pageId }: { pageId: string }): ReactElement => {
|
|||||||
};
|
};
|
||||||
}, [currentWorkspace, pageId]);
|
}, [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));
|
const isInTrash = useLiveData(doc?.meta$.map(meta => meta.trash));
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ export const AllWorkspaceModals = (): ReactElement => {
|
|||||||
openCreateWorkspaceModalAtom
|
openCreateWorkspaceModalAtom
|
||||||
);
|
);
|
||||||
|
|
||||||
const { jumpToSubPath } = useNavigateHelper();
|
const { jumpToSubPath, jumpToPage } = useNavigateHelper();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -270,15 +270,19 @@ export const AllWorkspaceModals = (): ReactElement => {
|
|||||||
setOpenCreateWorkspaceModal(false);
|
setOpenCreateWorkspaceModal(false);
|
||||||
}, [setOpenCreateWorkspaceModal])}
|
}, [setOpenCreateWorkspaceModal])}
|
||||||
onCreate={useCallback(
|
onCreate={useCallback(
|
||||||
id => {
|
(id, defaultDocId) => {
|
||||||
setOpenCreateWorkspaceModal(false);
|
setOpenCreateWorkspaceModal(false);
|
||||||
// if jumping immediately, the page may stuck in loading state
|
// if jumping immediately, the page may stuck in loading state
|
||||||
// not sure why yet .. here is a workaround
|
// not sure why yet .. here is a workaround
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
jumpToSubPath(id, WorkspaceSubPath.ALL);
|
if (!defaultDocId) {
|
||||||
|
jumpToSubPath(id, WorkspaceSubPath.ALL);
|
||||||
|
} else {
|
||||||
|
jumpToPage(id, defaultDocId);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
[jumpToSubPath, setOpenCreateWorkspaceModal]
|
[jumpToPage, jumpToSubPath, setOpenCreateWorkspaceModal]
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
|
|||||||
Vendored
-1
@@ -30,7 +30,6 @@ declare module '@blocksuite/store' {
|
|||||||
trashDate?: number;
|
trashDate?: number;
|
||||||
updatedDate?: number;
|
updatedDate?: number;
|
||||||
mode?: 'page' | 'edgeless';
|
mode?: 'page' | 'edgeless';
|
||||||
jumpOnce?: boolean;
|
|
||||||
// todo: support `number` in the future
|
// todo: support `number` in the future
|
||||||
isPublic?: boolean;
|
isPublic?: boolean;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user