feat: catch 401 error

This commit is contained in:
MingLiang Wang
2022-12-23 19:28:06 +08:00
parent e50919d106
commit 235ea04078
2 changed files with 24 additions and 38 deletions
@@ -27,8 +27,7 @@ const DynamicBlocksuite = ({
useEffect(() => { useEffect(() => {
const openWorkspace: LoadWorkspaceHandler = ( const openWorkspace: LoadWorkspaceHandler = (
workspaceId: string, workspaceId: string,
websocket = false, websocket = false
user
) => ) =>
// eslint-disable-next-line no-async-promise-executor // eslint-disable-next-line no-async-promise-executor
new Promise(async resolve => { new Promise(async resolve => {
@@ -64,16 +63,22 @@ const DynamicBlocksuite = ({
const indexDBProvider = workspace.providers.find( const indexDBProvider = workspace.providers.find(
p => p instanceof IndexedDBDocProvider p => p instanceof IndexedDBDocProvider
); );
if (user) { await new Promise<undefined>(resolve => {
const updates = await downloadWorkspace({ workspaceId }); downloadWorkspace({ workspaceId })
updates && .then(async updates => {
StoreWorkspace.Y.applyUpdate( updates &&
workspace.doc, StoreWorkspace.Y.applyUpdate(
new Uint8Array(updates) 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'); // 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) { if (indexDBProvider) {
(indexDBProvider as IndexedDBDocProvider).on('synced', async () => { (indexDBProvider as IndexedDBDocProvider).on('synced', async () => {
resolve(workspace); resolve(workspace);
@@ -41,31 +41,11 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
workspaces: {}, 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(() => { useEffect(() => {
(async () => { (async () => {
const workspacesList = await Promise.all( const workspacesList = await Promise.all(
state.workspacesMeta.map(async ({ id }) => { state.workspacesMeta.map(async ({ id }) => {
const workspace = const workspace = (await loadWorkspaceHandler?.(id, false)) || null;
(await loadWorkspaceHandler?.(id, false, state.user)) || null;
return { id, workspace }; return { id, workspace };
}) })
); );
@@ -73,7 +53,6 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
workspacesList.forEach(({ id, workspace }) => { workspacesList.forEach(({ id, workspace }) => {
workspaces[id] = workspace; workspaces[id] = workspace;
}); });
await refreshWorkspacesInfo(workspaces);
setState(state => ({ setState(state => ({
...state, ...state,
workspaces, workspaces,
@@ -108,9 +87,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
if (state.currentWorkspaceId === workspaceId) { if (state.currentWorkspaceId === workspaceId) {
return state.currentWorkspace; return state.currentWorkspace;
} }
const workspace = (await loadWorkspaceHandler?.(workspaceId, true)) || null;
const workspace =
(await loadWorkspaceHandler?.(workspaceId, true, state.user)) || null;
// eslint-disable-next-line @typescript-eslint/ban-ts-comment // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error // @ts-expect-error
@@ -195,6 +172,11 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
} }
const callback = async (user: AccessTokenMessage | null) => { const callback = async (user: AccessTokenMessage | null) => {
const isLogin = token.isLogin; const isLogin = token.isLogin;
setState(state => ({
...state,
user,
}));
const workspacesMeta = user const workspacesMeta = user
? await getWorkspaces().catch(() => { ? await getWorkspaces().catch(() => {
return []; return [];
@@ -203,7 +185,6 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
setState(state => ({ setState(state => ({
...state, ...state,
user: user,
workspacesMeta, workspacesMeta,
synced: isLogin ? !!user : true, synced: isLogin ? !!user : true,
})); }));