From 028fdae8b1a94ab39a462d0915b233ce6f03fc4e Mon Sep 17 00:00:00 2001
From: DiamondThree <857159145@qq.com>
Date: Tue, 7 Feb 2023 19:18:28 +0800
Subject: [PATCH 1/4] fix: logout will jump to 404 error
---
.../app/src/components/logout-modal/index.tsx | 63 +++++++++++++------
.../src/components/workspace-modal/index.tsx | 2 +-
2 files changed, 44 insertions(+), 21 deletions(-)
diff --git a/packages/app/src/components/logout-modal/index.tsx b/packages/app/src/components/logout-modal/index.tsx
index 19b6b04d9..d710b2e45 100644
--- a/packages/app/src/components/logout-modal/index.tsx
+++ b/packages/app/src/components/logout-modal/index.tsx
@@ -51,26 +51,49 @@ export const LogoutModal = ({ open, onClose }: LoginModalProps) => {
)}
{t('Retain local cached data')}
-
-
-
-
+ {blobDataSynced ? (
+
+
+
+
+ ) : (
+
+
+
+
+ )}
diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx
index 1363763c3..4dd552eac 100644
--- a/packages/app/src/components/workspace-modal/index.tsx
+++ b/packages/app/src/components/workspace-modal/index.tsx
@@ -132,7 +132,7 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => {
onClose={async wait => {
if (!wait) {
await logout();
- router.replace(`/workspace`);
+ router.push(`/workspace`);
}
setLogoutOpen(false);
}}
From d9d60197f2538327a6600a28ebf609fb24a8c7c8 Mon Sep 17 00:00:00 2001
From: DiamondThree <857159145@qq.com>
Date: Tue, 7 Feb 2023 20:01:25 +0800
Subject: [PATCH 2/4] fix:delete workspace will jump to 404
---
.../app/src/components/workspace-modal/index.tsx | 1 -
.../workspace-setting/general/delete/Delete.tsx | 3 ---
packages/app/src/hooks/use-ensure-workspace.ts | 12 ++++++------
3 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/packages/app/src/components/workspace-modal/index.tsx b/packages/app/src/components/workspace-modal/index.tsx
index 4dd552eac..91b354946 100644
--- a/packages/app/src/components/workspace-modal/index.tsx
+++ b/packages/app/src/components/workspace-modal/index.tsx
@@ -132,7 +132,6 @@ export const WorkspaceModal = ({ open, onClose }: WorkspaceModalProps) => {
onClose={async wait => {
if (!wait) {
await logout();
- router.push(`/workspace`);
}
setLogoutOpen(false);
}}
diff --git a/packages/app/src/components/workspace-setting/general/delete/Delete.tsx b/packages/app/src/components/workspace-setting/general/delete/Delete.tsx
index 3fcab8c15..d8b0858de 100644
--- a/packages/app/src/components/workspace-setting/general/delete/Delete.tsx
+++ b/packages/app/src/components/workspace-setting/general/delete/Delete.tsx
@@ -11,7 +11,6 @@ import {
import { useState } from 'react';
import { ModalCloseButton } from '@/ui/modal';
import { Button } from '@/ui/button';
-import { useRouter } from 'next/router';
import { WorkspaceUnit } from '@affine/datacenter';
import { Trans, useTranslation } from '@affine/i18n';
@@ -30,7 +29,6 @@ export const WorkspaceDelete = ({
}: WorkspaceDeleteProps) => {
const [deleteStr, setDeleteStr] = useState('');
const { t } = useTranslation();
- const router = useRouter();
const { deleteWorkSpace } = useWorkspaceHelper();
const handlerInputChange = (workspaceName: string) => {
setDeleteStr(workspaceName);
@@ -39,7 +37,6 @@ export const WorkspaceDelete = ({
const handleDelete = async () => {
await deleteWorkSpace();
onClose();
- router.push(`/workspace`);
};
return (
diff --git a/packages/app/src/hooks/use-ensure-workspace.ts b/packages/app/src/hooks/use-ensure-workspace.ts
index d547b09da..08181c414 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 { workspaceList, loadWorkspace, user } = useAppState();
+ const { dataCenter, loadWorkspace, user } = useAppState();
const router = useRouter();
const [activeWorkspaceId, setActiveWorkspaceId] = useState(
router.query.workspaceId as string
@@ -17,14 +17,14 @@ export const useEnsureWorkspace = () => {
// If router.query.workspaceId is not in workspace list, jump to 404 page
// If workspaceList is empty, we need to create a default workspace but not jump to 404
if (
- workspaceList.length &&
+ dataCenter.workspaces.length &&
// FIXME: router is not ready when this hook is called
location.pathname.startsWith(`/workspace/${router.query.workspaceId}`) &&
- workspaceList.findIndex(
+ dataCenter.workspaces.findIndex(
meta => meta.id.toString() === router.query.workspaceId
) === -1
) {
- router.push('/404');
+ router.push(`/workspace/${dataCenter.workspaces[0].id}`);
return;
}
// If user is not login and input a custom workspaceId, jump to 404 page
@@ -37,12 +37,12 @@ export const useEnsureWorkspace = () => {
// return;
// }
const workspaceId =
- (router.query.workspaceId as string) || workspaceList[0]?.id;
+ (router.query.workspaceId as string) || dataCenter.workspaces[0]?.id;
loadWorkspace.current(workspaceId).finally(() => {
setWorkspaceLoaded(true);
setActiveWorkspaceId(activeWorkspaceId);
});
- }, [loadWorkspace, router, user, workspaceList, activeWorkspaceId]);
+ }, [loadWorkspace, router, user, dataCenter.workspaces, activeWorkspaceId]);
return {
workspaceLoaded,
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 3/4] 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) => {
From ef4a25d82b0796d0b2faf1a345057cf7a99cfb97 Mon Sep 17 00:00:00 2001
From: alt0
Date: Tue, 7 Feb 2023 22:46:40 +0800
Subject: [PATCH 4/4] fix: workspace router
---
.../workspace-setting/general/delete/Delete.tsx | 3 +++
packages/app/src/hooks/use-ensure-workspace.ts | 12 ++++++------
.../src/providers/app-state-provider/Provider.tsx | 1 -
3 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/packages/app/src/components/workspace-setting/general/delete/Delete.tsx b/packages/app/src/components/workspace-setting/general/delete/Delete.tsx
index d8b0858de..af2570f81 100644
--- a/packages/app/src/components/workspace-setting/general/delete/Delete.tsx
+++ b/packages/app/src/components/workspace-setting/general/delete/Delete.tsx
@@ -1,3 +1,4 @@
+import { useRouter } from 'next/router';
import Modal from '@/ui/modal';
import Input from '@/ui/input';
import {
@@ -29,6 +30,7 @@ export const WorkspaceDelete = ({
}: WorkspaceDeleteProps) => {
const [deleteStr, setDeleteStr] = useState('');
const { t } = useTranslation();
+ const router = useRouter();
const { deleteWorkSpace } = useWorkspaceHelper();
const handlerInputChange = (workspaceName: string) => {
setDeleteStr(workspaceName);
@@ -37,6 +39,7 @@ export const WorkspaceDelete = ({
const handleDelete = async () => {
await deleteWorkSpace();
onClose();
+ router.push(`/workspace`);
};
return (
diff --git a/packages/app/src/hooks/use-ensure-workspace.ts b/packages/app/src/hooks/use-ensure-workspace.ts
index 57d4abf9a..d547b09da 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 } = useAppState();
+ const { workspaceList, loadWorkspace, user } = useAppState();
const router = useRouter();
const [activeWorkspaceId, setActiveWorkspaceId] = useState(
router.query.workspaceId as string
@@ -17,14 +17,14 @@ export const useEnsureWorkspace = () => {
// If router.query.workspaceId is not in workspace list, jump to 404 page
// If workspaceList is empty, we need to create a default workspace but not jump to 404
if (
- dataCenter.workspaces.length &&
+ workspaceList.length &&
// FIXME: router is not ready when this hook is called
location.pathname.startsWith(`/workspace/${router.query.workspaceId}`) &&
- dataCenter.workspaces.findIndex(
+ workspaceList.findIndex(
meta => meta.id.toString() === router.query.workspaceId
) === -1
) {
- router.push(`/404`);
+ router.push('/404');
return;
}
// If user is not login and input a custom workspaceId, jump to 404 page
@@ -37,12 +37,12 @@ export const useEnsureWorkspace = () => {
// return;
// }
const workspaceId =
- (router.query.workspaceId as string) || dataCenter.workspaces[0]?.id;
+ (router.query.workspaceId as string) || workspaceList[0]?.id;
loadWorkspace.current(workspaceId).finally(() => {
setWorkspaceLoaded(true);
setActiveWorkspaceId(activeWorkspaceId);
});
- }, [loadWorkspace, router, dataCenter.workspaces, activeWorkspaceId]);
+ }, [loadWorkspace, router, user, workspaceList, 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 30eb4198d..b8601e9ea 100644
--- a/packages/app/src/providers/app-state-provider/Provider.tsx
+++ b/packages/app/src/providers/app-state-provider/Provider.tsx
@@ -72,7 +72,6 @@ export const AppStateProvider = ({
// FIXME: onWorkspacesChange should have dispose function
dataCenter?.onWorkspacesChange(
() => {
- console.log(123);
setAppState({
...appState,
workspaceList: dataCenter.workspaces,