From 235ea0407890658d1cff0f33d16c9cdcefd83f6d Mon Sep 17 00:00:00 2001 From: MingLiang Wang Date: Fri, 23 Dec 2022 19:28:06 +0800 Subject: [PATCH] feat: catch 401 error --- .../app-state-provider/dynamic-blocksuite.tsx | 29 +++++++++------- .../providers/app-state-provider/provider.tsx | 33 ++++--------------- 2 files changed, 24 insertions(+), 38 deletions(-) diff --git a/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx b/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx index 8315603738..c5e5e2b2b5 100644 --- a/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx +++ b/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx @@ -27,8 +27,7 @@ const DynamicBlocksuite = ({ useEffect(() => { const openWorkspace: LoadWorkspaceHandler = ( workspaceId: string, - websocket = false, - user + websocket = false ) => // eslint-disable-next-line no-async-promise-executor new Promise(async resolve => { @@ -64,16 +63,22 @@ const DynamicBlocksuite = ({ const indexDBProvider = workspace.providers.find( p => p instanceof IndexedDBDocProvider ); - if (user) { - const updates = await downloadWorkspace({ workspaceId }); - updates && - StoreWorkspace.Y.applyUpdate( - workspace.doc, - new Uint8Array(updates) - ); - // if after update, the space:meta is empty, then we need to get map with doc - workspace.doc.getMap('space:meta'); - } + await new Promise(resolve => { + downloadWorkspace({ workspaceId }) + .then(async updates => { + updates && + StoreWorkspace.Y.applyUpdate( + workspace.doc, + new Uint8Array(updates) + ); + // if after update, the space:meta is empty, then we need to get map with doc + workspace.doc.getMap('space:meta'); + resolve(undefined); + }) + .catch(() => { + resolve(undefined); + }); + }); if (indexDBProvider) { (indexDBProvider as IndexedDBDocProvider).on('synced', async () => { resolve(workspace); diff --git a/packages/app/src/providers/app-state-provider/provider.tsx b/packages/app/src/providers/app-state-provider/provider.tsx index 6a344fa61f..52acf87ffc 100644 --- a/packages/app/src/providers/app-state-provider/provider.tsx +++ b/packages/app/src/providers/app-state-provider/provider.tsx @@ -41,31 +41,11 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { workspaces: {}, }); - const refreshWorkspacesInfo = async ( - workspaces: AppStateValue['workspaces'] - ) => { - return Promise.all( - Object.entries(workspaces).map(async ([workspaceId, workspace]) => { - if (workspace) { - const updates = await downloadWorkspace({ workspaceId }); - updates && - StoreWorkspace.Y.applyUpdate( - workspace.doc, - new Uint8Array(updates) - ); - // if after update, the space:meta is empty, then we need to get map with doc - workspace.doc.getMap('space:meta'); - } - }) - ); - }; - useEffect(() => { (async () => { const workspacesList = await Promise.all( state.workspacesMeta.map(async ({ id }) => { - const workspace = - (await loadWorkspaceHandler?.(id, false, state.user)) || null; + const workspace = (await loadWorkspaceHandler?.(id, false)) || null; return { id, workspace }; }) ); @@ -73,7 +53,6 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { workspacesList.forEach(({ id, workspace }) => { workspaces[id] = workspace; }); - await refreshWorkspacesInfo(workspaces); setState(state => ({ ...state, workspaces, @@ -108,9 +87,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { if (state.currentWorkspaceId === workspaceId) { return state.currentWorkspace; } - - const workspace = - (await loadWorkspaceHandler?.(workspaceId, true, state.user)) || null; + const workspace = (await loadWorkspaceHandler?.(workspaceId, true)) || null; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error @@ -195,6 +172,11 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { } const callback = async (user: AccessTokenMessage | null) => { const isLogin = token.isLogin; + setState(state => ({ + ...state, + user, + })); + const workspacesMeta = user ? await getWorkspaces().catch(() => { return []; @@ -203,7 +185,6 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => { setState(state => ({ ...state, - user: user, workspacesMeta, synced: isLogin ? !!user : true, }));