From 731deda1e1382fd0cbdfcd6c51cc32370740d251 Mon Sep 17 00:00:00 2001 From: DiamondThree <857159145@qq.com> Date: Tue, 7 Feb 2023 22:14:49 +0800 Subject: [PATCH] fix: logout jump to 404 --- .../src/components/workspace-modal/index.tsx | 9 ++++++-- .../app/src/hooks/use-ensure-workspace.ts | 6 ++--- .../providers/app-state-provider/Provider.tsx | 23 +++++++------------ .../providers/app-state-provider/interface.ts | 2 +- .../data-center/src/provider/affine/affine.ts | 2 +- .../src/workspace-unit-collection.ts | 23 ++++++++++--------- 6 files changed, 32 insertions(+), 33 deletions(-) diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx index 91b354946..4a6e78e90 100644 --- a/packages/app/src/components/workspace-modal/index.tsx +++ b/packages/app/src/components/workspace-modal/index.tsx @@ -36,7 +36,7 @@ interface WorkspaceModalProps { export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { const [createWorkspaceOpen, setCreateWorkspaceOpen] = useState(false); - const { workspaceList, logout } = useAppState(); + const { logout, dataCenter } = useAppState(); const router = useRouter(); const { t } = useTranslation(); const [loginOpen, setLoginOpen] = useState(false); @@ -80,7 +80,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => { - {workspaceList.map((item, index) => { + {dataCenter.workspaces.map((item, index) => { return ( { onClose={async wait => { if (!wait) { await logout(); + if (dataCenter.workspaces.length === 0) { + router.push(`/workspace`); + } else { + router.push(`/workspace/${dataCenter.workspaces[0].id}`); + } } setLogoutOpen(false); }} diff --git a/packages/app/src/hooks/use-ensure-workspace.ts b/packages/app/src/hooks/use-ensure-workspace.ts index 08181c414..57d4abf9a 100644 --- a/packages/app/src/hooks/use-ensure-workspace.ts +++ b/packages/app/src/hooks/use-ensure-workspace.ts @@ -5,7 +5,7 @@ import { useRouter } from 'next/router'; // Cause it not just ensure workspace loaded, but also have router change. export const useEnsureWorkspace = () => { const [workspaceLoaded, setWorkspaceLoaded] = useState(false); - const { dataCenter, loadWorkspace, user } = useAppState(); + const { dataCenter, loadWorkspace } = useAppState(); const router = useRouter(); const [activeWorkspaceId, setActiveWorkspaceId] = useState( router.query.workspaceId as string @@ -24,7 +24,7 @@ export const useEnsureWorkspace = () => { meta => meta.id.toString() === router.query.workspaceId ) === -1 ) { - router.push(`/workspace/${dataCenter.workspaces[0].id}`); + router.push(`/404`); return; } // If user is not login and input a custom workspaceId, jump to 404 page @@ -42,7 +42,7 @@ export const useEnsureWorkspace = () => { setWorkspaceLoaded(true); setActiveWorkspaceId(activeWorkspaceId); }); - }, [loadWorkspace, router, user, dataCenter.workspaces, activeWorkspaceId]); + }, [loadWorkspace, router, dataCenter.workspaces, activeWorkspaceId]); return { workspaceLoaded, diff --git a/packages/app/src/providers/app-state-provider/Provider.tsx b/packages/app/src/providers/app-state-provider/Provider.tsx index 5dd18094a..30eb4198d 100644 --- a/packages/app/src/providers/app-state-provider/Provider.tsx +++ b/packages/app/src/providers/app-state-provider/Provider.tsx @@ -24,6 +24,7 @@ export const AppStateProvider = ({ }: PropsWithChildren) => { const [appState, setAppState] = useState({} as AppStateValue); const [blobState, setBlobState] = useState(false); + const [userInfo, setUser] = useState({} as User); useEffect(() => { const initState = async () => { const dataCenter = await getDataCenter(); @@ -31,10 +32,9 @@ export const AppStateProvider = ({ if (dataCenter.workspaces.length === 0) { await createDefaultWorkspace(dataCenter); } - + setUser((await dataCenter.getUserInfo()) || null); setAppState({ dataCenter, - user: (await dataCenter.getUserInfo()) || null, workspaceList: dataCenter.workspaces, currentWorkspace: null, pageList: [], @@ -72,6 +72,7 @@ export const AppStateProvider = ({ // FIXME: onWorkspacesChange should have dispose function dataCenter?.onWorkspacesChange( () => { + console.log(123); setAppState({ ...appState, workspaceList: dataCenter.workspaces, @@ -97,7 +98,7 @@ export const AppStateProvider = ({ const loadWorkspace: AppStateFunction['loadWorkspace'] = useRef() as AppStateFunction['loadWorkspace']; loadWorkspace.current = async (workspaceId: string) => { - const { dataCenter, workspaceList, currentWorkspace, user } = appState; + const { dataCenter, workspaceList, currentWorkspace } = appState; if (!workspaceList.find(v => v.id.toString() === workspaceId)) { return null; } @@ -112,7 +113,7 @@ export const AppStateProvider = ({ isOwner = true; } else { // We must ensure workspace.owner exists, then ensure id same. - isOwner = workspace?.owner && user?.id === workspace.owner.id; + isOwner = workspace?.owner && userInfo?.id === workspace.owner.id; } const pageList = @@ -166,22 +167,13 @@ export const AppStateProvider = ({ if (!user) { throw new Error('User info not found'); } - setAppState({ - ...appState, - workspaceList: dataCenter.workspaces, - user, - }); + setUser(user); return user; }; - const logout = async () => { const { dataCenter } = appState; await dataCenter.logout(); - setAppState({ - ...appState, - workspaceList: dataCenter.workspaces, - user: null, - }); + setUser(null); }; return ( @@ -194,6 +186,7 @@ export const AppStateProvider = ({ login, logout, blobDataSynced: blobState, + user: userInfo, }} > {children} diff --git a/packages/app/src/providers/app-state-provider/interface.ts b/packages/app/src/providers/app-state-provider/interface.ts index a1ea40022..ee960a0a9 100644 --- a/packages/app/src/providers/app-state-provider/interface.ts +++ b/packages/app/src/providers/app-state-provider/interface.ts @@ -16,7 +16,7 @@ export interface PageMeta extends StorePageMeta { export type AppStateValue = { dataCenter: DataCenter; - user: User | null; + user?: User | null; workspaceList: WorkspaceUnit[]; currentWorkspace: WorkspaceUnit | null; pageList: PageMeta[]; diff --git a/packages/data-center/src/provider/affine/affine.ts b/packages/data-center/src/provider/affine/affine.ts index b4627de08..9d88dc14a 100644 --- a/packages/data-center/src/provider/affine/affine.ts +++ b/packages/data-center/src/provider/affine/affine.ts @@ -428,7 +428,7 @@ export class AffineProvider extends BaseProvider { token.clear(); this._channel?.disconnect(); this._wsMap.forEach(ws => ws.disconnect()); - this._workspaces.clear(); + this._workspaces.clear(false); storage.removeItem('token'); } diff --git a/packages/data-center/src/workspace-unit-collection.ts b/packages/data-center/src/workspace-unit-collection.ts index c44ef3feb..d5a5b0b92 100644 --- a/packages/data-center/src/workspace-unit-collection.ts +++ b/packages/data-center/src/workspace-unit-collection.ts @@ -8,8 +8,8 @@ export interface WorkspaceUnitCollectionScope { get: (workspaceId: string) => WorkspaceUnit | undefined; list: () => WorkspaceUnit[]; add: (workspace: WorkspaceUnit | WorkspaceUnit[]) => void; - remove: (workspaceId: string | string[]) => boolean; - clear: () => void; + remove: (workspaceId: string | string[], isUpdate?: boolean) => boolean; + clear: (isUpdate?: boolean) => void; update: ( workspaceId: string, workspaceUnit: UpdateWorkspaceUnitParams @@ -85,7 +85,7 @@ export class WorkspaceUnitCollection { ]); }; - const remove = (workspaceId: string | string[]) => { + const remove = (workspaceId: string | string[], isUpdate = true) => { const workspaceIds = Array.isArray(workspaceId) ? workspaceId : [workspaceId]; @@ -111,18 +111,19 @@ export class WorkspaceUnitCollection { if (!workspaceUnits.length) { return false; } - - this._events.emit('change', [ - { - deleted: workspaceUnits, - } as WorkspaceUnitCollectionChangeEvent, - ]); + if (isUpdate) { + this._events.emit('change', [ + { + deleted: workspaceUnits, + } as WorkspaceUnitCollectionChangeEvent, + ]); + } return true; }; - const clear = () => { - remove(Array.from(scopedWorkspaceIds)); + const clear = (isUpdate = true) => { + remove(Array.from(scopedWorkspaceIds), isUpdate); }; const update = (workspaceId: string, meta: UpdateWorkspaceUnitParams) => {