From 79128a3c3ea68d63cf612ade918fc4fde1a215ad Mon Sep 17 00:00:00 2001 From: Himself65 Date: Wed, 29 Mar 2023 20:10:47 -0500 Subject: [PATCH] fix: fallback to all page (#1749) --- apps/web/src/hooks/__tests__/index.spec.tsx | 40 +++++++++++++++++-- ...-router-with-current-workspace-and-page.ts | 14 ++++++- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/apps/web/src/hooks/__tests__/index.spec.tsx b/apps/web/src/hooks/__tests__/index.spec.tsx index 9ba668bdc2..0ef79f57aa 100644 --- a/apps/web/src/hooks/__tests__/index.spec.tsx +++ b/apps/web/src/hooks/__tests__/index.spec.tsx @@ -24,7 +24,7 @@ import { } from '../../atoms'; import { LocalPlugin } from '../../plugins/local'; import type { LocalWorkspace } from '../../shared'; -import { BlockSuiteWorkspace } from '../../shared'; +import { BlockSuiteWorkspace, WorkspaceSubPath } from '../../shared'; import { useIsFirstLoad, useOpenTips } from '../affine/use-is-first-load'; import { useRecentlyViewed, @@ -52,7 +52,13 @@ vi.mock( let blockSuiteWorkspace: BlockSuiteWorkspace; beforeAll(() => { routerMock.useParser( - createDynamicRouteParser(['/workspace/[workspaceId]/[pageId]']) + createDynamicRouteParser([ + `/workspace/[workspaceId/${WorkspaceSubPath.ALL}`, + `/workspace/[workspaceId/${WorkspaceSubPath.SETTING}`, + `/workspace/[workspaceId/${WorkspaceSubPath.TRASH}`, + `/workspace/[workspaceId/${WorkspaceSubPath.FAVORITE}`, + '/workspace/[workspaceId]/[pageId]', + ]) ); }); @@ -214,6 +220,34 @@ describe('useSyncRouterWithCurrentWorkspaceAndPage', () => { expect(routerHook.result.current.asPath).toBe(`/workspace/${id}/page0`); }); + test('from empty workspace', async () => { + const { ProviderWrapper, store } = await getJotaiContext(); + const mutationHook = renderHook(() => useWorkspacesHelper(), { + wrapper: ProviderWrapper, + }); + const id = await mutationHook.result.current.createLocalWorkspace('test0'); + const workspaces = await store.get(workspacesAtom); + expect(workspaces.length).toEqual(1); + mutationHook.rerender(); + const routerHook = renderHook(() => useRouter()); + await routerHook.result.current.push(`/workspace/${id}/not_exist`); + routerHook.rerender(); + expect(routerHook.result.current.asPath).toBe(`/workspace/${id}/not_exist`); + renderHook( + ({ router }) => useSyncRouterWithCurrentWorkspaceAndPage(router), + { + wrapper: ProviderWrapper, + initialProps: { + router: routerHook.result.current, + }, + } + ); + + await new Promise(resolve => setTimeout(resolve, REDIRECT_TIMEOUT + 50)); + + expect(routerHook.result.current.asPath).toBe(`/workspace/${id}/all`); + }); + test('from incorrect "/workspace/[workspaceId]/[pageId]"', async () => { const { ProviderWrapper, store } = await getJotaiContext(); const mutationHook = renderHook(() => useWorkspacesHelper(), { @@ -238,7 +272,7 @@ describe('useSyncRouterWithCurrentWorkspaceAndPage', () => { } ); - await new Promise(resolve => setTimeout(resolve, REDIRECT_TIMEOUT)); + await new Promise(resolve => setTimeout(resolve, REDIRECT_TIMEOUT + 50)); expect(routerHook.result.current.asPath).toBe(`/workspace/${id}/page0`); }); diff --git a/apps/web/src/hooks/use-sync-router-with-current-workspace-and-page.ts b/apps/web/src/hooks/use-sync-router-with-current-workspace-and-page.ts index 05cb114865..d792b83411 100644 --- a/apps/web/src/hooks/use-sync-router-with-current-workspace-and-page.ts +++ b/apps/web/src/hooks/use-sync-router-with-current-workspace-and-page.ts @@ -4,8 +4,10 @@ import { useEffect } from 'react'; import { currentPageIdAtom, jotaiStore } from '../atoms'; import type { RemWorkspace } from '../shared'; +import { WorkspaceSubPath } from '../shared'; import { useCurrentPageId } from './current/use-current-page-id'; import { useCurrentWorkspace } from './current/use-current-workspace'; +import { RouteLogic, useRouterHelper } from './use-router-helper'; import { useWorkspaces } from './use-workspaces'; export function findSuitablePageId( @@ -39,6 +41,7 @@ export function useSyncRouterWithCurrentWorkspaceAndPage(router: NextRouter) { const [currentWorkspace, setCurrentWorkspaceId] = useCurrentWorkspace(); const [currentPageId, setCurrentPageId] = useCurrentPageId(); const workspaces = useWorkspaces(); + const { jumpToSubPath } = useRouterHelper(router); useEffect(() => { const listener: Parameters[1] = (url: string) => { if (url.startsWith('/')) { @@ -161,7 +164,8 @@ export function useSyncRouterWithCurrentWorkspaceAndPage(router: NextRouter) { } ); const clearId = setTimeout(() => { - if (jotaiStore.get(currentPageIdAtom) === null) { + const pageId = jotaiStore.get(currentPageIdAtom); + if (pageId === null) { const id = currentWorkspace.blockSuiteWorkspace.meta.pageMetas.at(0)?.id; if (id) { @@ -173,8 +177,15 @@ export function useSyncRouterWithCurrentWorkspaceAndPage(router: NextRouter) { }, }); setCurrentPageId(id); + dispose.dispose(); + return; } } + jumpToSubPath( + currentWorkspace.blockSuiteWorkspace.id, + WorkspaceSubPath.ALL, + RouteLogic.REPLACE + ); dispose.dispose(); }, REDIRECT_TIMEOUT); return () => { @@ -194,5 +205,6 @@ export function useSyncRouterWithCurrentWorkspaceAndPage(router: NextRouter) { setCurrentWorkspaceId, workspaces, router, + jumpToSubPath, ]); }