p.trash)} isTrash={true} />
>
- ) : null;
+ );
};
Trash.getLayout = function getLayout(page: ReactElement) {
diff --git a/packages/app/src/pages/workspace/index.tsx b/packages/app/src/pages/workspace/index.tsx
index 1f7dd2d518..0f1688d1de 100644
--- a/packages/app/src/pages/workspace/index.tsx
+++ b/packages/app/src/pages/workspace/index.tsx
@@ -1,5 +1,21 @@
-const Page = () => {
- return Hello, there is [workspace]/index.
;
+import React, { ReactElement, useEffect } from 'react';
+import WorkspaceLayout from '@/components/workspace-layout';
+import { useAppState } from '@/providers/app-state-provider';
+import { useRouter } from 'next/router';
+
+export const WorkspaceIndex = () => {
+ const router = useRouter();
+ const { currentWorkspaceId } = useAppState();
+ useEffect(() => {
+ if (currentWorkspaceId) {
+ router.replace(`/workspace/${currentWorkspaceId}`);
+ }
+ }, [currentWorkspaceId, router]);
+ return <>>;
};
-export default Page;
+WorkspaceIndex.getLayout = function getLayout(page: ReactElement) {
+ return {page};
+};
+
+export default WorkspaceIndex;
diff --git a/packages/app/src/providers/app-state-provider/context.ts b/packages/app/src/providers/app-state-provider/context.ts
index e5b1c57d4b..65c9fc842e 100644
--- a/packages/app/src/providers/app-state-provider/context.ts
+++ b/packages/app/src/providers/app-state-provider/context.ts
@@ -23,6 +23,7 @@ export interface AppStateValue {
currentPage: StorePage | null;
editor: EditorContainer | null;
+ synced: boolean;
}
export interface AppStateContext extends AppStateValue {
@@ -31,15 +32,9 @@ export interface AppStateContext extends AppStateValue {
((page: StorePage) => EditorContainer | null) | undefined
>;
setEditor?: MutableRefObject<((page: EditorContainer) => void) | undefined>;
- loadWorkspace?: MutableRefObject<
- ((workspaceId: string) => Promise | null) | undefined
- >;
- loadPage?: MutableRefObject<
- ((pageId: string) => Promise | null) | undefined
- >;
- createPage?: MutableRefObject<
- ((pageId?: string) => Promise) | undefined
- >;
+ loadWorkspace: (workspaceId: string) => Promise;
+ loadPage: (pageId: string) => Promise;
+ createPage: (pageId?: string) => Promise;
}
export const AppState = createContext({
@@ -56,9 +51,10 @@ export const AppState = createContext({
setState: () => {},
createEditor: undefined,
setEditor: undefined,
- loadWorkspace: undefined,
- loadPage: undefined,
- createPage: undefined,
+ loadWorkspace: () => Promise.resolve(null),
+ loadPage: () => Promise.resolve(null),
+ createPage: () => Promise.resolve(null),
+ synced: false,
workspaces: {},
});
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 2f22e01a07..3f81edf0bc 100644
--- a/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx
+++ b/packages/app/src/providers/app-state-provider/dynamic-blocksuite.tsx
@@ -89,15 +89,12 @@ const DynamicBlocksuite = ({
p => p instanceof IndexedDBDocProvider
);
if (indexDBProvider) {
- (indexDBProvider as IndexedDBDocProvider).on('synced', async () => {
- const updates = await downloadWorkspace({ workspaceId });
-
- if (updates && updates.byteLength) {
- Workspace.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');
- }
-
+ (indexDBProvider as IndexedDBDocProvider)?.on('synced', async () => {
+ // const updates = await downloadWorkspace({ workspaceId });
+ // updates &&
+ // Workspace.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(workspace);
});
} else {
diff --git a/packages/app/src/providers/app-state-provider/hooks.ts b/packages/app/src/providers/app-state-provider/hooks.ts
index 69129c87e7..7f5f2822ed 100644
--- a/packages/app/src/providers/app-state-provider/hooks.ts
+++ b/packages/app/src/providers/app-state-provider/hooks.ts
@@ -9,7 +9,7 @@ export const useLoadWorkspace = () => {
const workspaceId = router.query.workspaceId as string;
useEffect(() => {
- loadWorkspace?.current?.(workspaceId);
+ loadWorkspace?.(workspaceId);
}, [workspaceId, loadWorkspace]);
return currentWorkspaceId === workspaceId ? currentWorkspace : null;
@@ -29,7 +29,7 @@ export const useLoadPage = () => {
}
const page = pageId ? workspace?.getPage(pageId) : null;
if (page) {
- loadPage?.current?.(pageId);
+ loadPage?.(pageId);
return;
}
@@ -39,7 +39,7 @@ export const useLoadPage = () => {
return;
}
- createPage?.current?.()?.then(async pageId => {
+ createPage?.()?.then(async pageId => {
if (!pageId) {
return;
}
diff --git a/packages/app/src/providers/app-state-provider/provider.tsx b/packages/app/src/providers/app-state-provider/provider.tsx
index 2e38922e06..41e18901f5 100644
--- a/packages/app/src/providers/app-state-provider/provider.tsx
+++ b/packages/app/src/providers/app-state-provider/provider.tsx
@@ -8,7 +8,7 @@ import {
WorkspaceType,
getWorkspaceDetail,
} from '@pathfinder/data-services';
-import { AppState } from './context';
+import { AppState, AppStateContext } from './context';
import type {
AppStateValue,
CreateEditorHandler,
@@ -29,6 +29,9 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
currentPage: null,
editor: null,
workspaces: {},
+ // Synced is used to ensure that the provider has synced with the server,
+ // So after Synced set to true, the other state is sure to be set.
+ synced: false,
});
const [loadWorkspaceHandler, _setLoadWorkspaceHandler] =
@@ -50,12 +53,14 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
[_setCreateEditorHandler]
);
- const loadWorkspace =
- useRef<(workspaceId: string) => Promise | null>();
+ const loadWorkspace = useRef(() =>
+ Promise.resolve(null)
+ );
loadWorkspace.current = async (workspaceId: string) => {
if (state.currentWorkspaceId === workspaceId) {
return state.currentWorkspace;
}
+
const workspace = (await loadWorkspaceHandler?.(workspaceId, true)) || null;
// @ts-expect-error
@@ -72,7 +77,9 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
}));
return workspace;
};
- const loadPage = useRef<(pageId: string) => Promise | null>();
+ const loadPage = useRef(() =>
+ Promise.resolve(null)
+ );
loadPage.current = async (pageId: string) => {
const { currentWorkspace, currentPage } = state;
if (pageId === currentPage?.pageId) {
@@ -114,7 +121,9 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
setState(state => ({ ...state, editor }));
};
- const createPage = useRef<(pageId?: string) => Promise>();
+ const createPage = useRef(() =>
+ Promise.resolve(null)
+ );
createPage.current = (pageId: string = Date.now().toString()) =>
new Promise(resolve => {
@@ -130,8 +139,16 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
});
useEffect(() => {
+ if (!loadWorkspaceHandler) {
+ return;
+ }
const callback = async (user: AccessTokenMessage | null) => {
- const workspacesMeta = user ? await getWorkspaces() : [];
+ const workspacesMeta = user
+ ? await getWorkspaces().catch(() => {
+ return [];
+ })
+ : [];
+
const workspacesList = await Promise.all(
workspacesMeta.map(async ({ id }) => {
const workspace = (await loadWorkspaceHandler?.(id)) || null;
@@ -146,7 +163,13 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
});
// TODO: add meta info to workspace meta
- setState(state => ({ ...state, user: user, workspacesMeta, workspaces }));
+ setState(state => ({
+ ...state,
+ user: user,
+ workspacesMeta,
+ workspaces,
+ synced: true,
+ }));
};
authorizationEvent.onChange(callback);
@@ -161,9 +184,9 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
setState,
createEditor,
setEditor,
- loadWorkspace,
- loadPage,
- createPage,
+ loadWorkspace: loadWorkspace.current,
+ loadPage: loadPage.current,
+ createPage: createPage.current,
}),
[state, setState, loadPage, loadWorkspace]
);
@@ -174,7 +197,7 @@ export const AppStateProvider = ({ children }: { children?: ReactNode }) => {
setLoadWorkspaceHandler={setLoadWorkspaceHandler}
setCreateEditorHandler={setCreateEditorHandler}
/>
- {loadWorkspaceHandler ? children : null}
+ {children}
);
};
diff --git a/packages/app/src/providers/global-modal-provider.tsx b/packages/app/src/providers/global-modal-provider.tsx
index 1db3698f20..618152dea9 100644
--- a/packages/app/src/providers/global-modal-provider.tsx
+++ b/packages/app/src/providers/global-modal-provider.tsx
@@ -1,4 +1,4 @@
-import { createContext, useContext, useState } from 'react';
+import { createContext, useContext, useEffect, useState } from 'react';
import type { PropsWithChildren } from 'react';
import ShortcutsModal from '@/components/shortcuts-modal';
import ContactModal from '@/components/contact-modal';
@@ -49,6 +49,10 @@ export const ModalProvider = ({
[key]: visible ?? !modalMap[key],
});
};
+ useEffect(() => {
+ // @ts-ignore
+ window.triggerHandler = () => triggerHandler('login');
+ }, [triggerHandler]);
return (
=10.10.0}
dependencies:
'@grpc/proto-loader': 0.7.3
- '@types/node': 18.11.17
+ '@types/node': 18.7.18
dev: false
/@grpc/proto-loader/0.6.13:
@@ -2375,10 +2375,10 @@ packages:
/@types/node/18.11.17:
resolution: {integrity: sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==}
+ dev: true
/@types/node/18.7.18:
resolution: {integrity: sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==}
- dev: true
/@types/parse-json/4.0.0:
resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
@@ -2765,8 +2765,8 @@ packages:
engines: {node: '>=4'}
dev: true
- /axios/1.2.1:
- resolution: {integrity: sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==}
+ /axios/1.2.0:
+ resolution: {integrity: sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==}
dependencies:
follow-redirects: 1.15.2
form-data: 4.0.0
@@ -5659,7 +5659,7 @@ packages:
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
'@types/long': 4.0.2
- '@types/node': 18.11.17
+ '@types/node': 18.7.18
long: 4.0.0
dev: false
@@ -5678,7 +5678,7 @@ packages:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
- '@types/node': 18.11.17
+ '@types/node': 18.7.18
long: 5.2.0
dev: false