refactor: support suspense mode in workspaces (#1304)

This commit is contained in:
Himself65
2023-03-04 20:11:15 -06:00
committed by GitHub
parent dd6bee68cb
commit 9a199eb9a1
27 changed files with 713 additions and 652 deletions

View File

@@ -1,7 +1,11 @@
import { atom } from 'jotai';
import { createStore } from 'jotai';
import { assertExists } from '@blocksuite/store';
import { atom, createStore } from 'jotai';
import { atomWithStorage } from 'jotai/utils';
import { unstable_batchedUpdates } from 'react-dom';
import { WorkspacePlugins } from '../plugins';
import { RemWorkspace, RemWorkspaceFlavour } from '../shared';
// workspace necessary atoms
export const currentWorkspaceIdAtom = atom<string | null>(null);
export const currentPageIdAtom = atom<string | null>(null);
@@ -27,3 +31,32 @@ export const openCreateWorkspaceModalAtom = atom(false);
export const openQuickSearchModalAtom = atom(false);
export const jotaiStore = createStore();
type JotaiWorkspace = {
id: string;
flavour: RemWorkspaceFlavour;
};
export const jotaiWorkspacesAtom = atomWithStorage<JotaiWorkspace[]>(
'jotai-workspaces',
[]
);
export const workspacesAtom = atom<Promise<RemWorkspace[]>>(async get => {
const flavours: string[] = Object.values(WorkspacePlugins).map(
plugin => plugin.flavour
);
const jotaiWorkspaces = get(jotaiWorkspacesAtom).filter(workspace =>
flavours.includes(workspace.flavour)
);
const workspaces = await Promise.all(
jotaiWorkspaces.map(workspace => {
const plugin =
WorkspacePlugins[workspace.flavour as keyof typeof WorkspacePlugins];
assertExists(plugin);
const { CRUD } = plugin;
return CRUD.get(workspace.id);
})
);
return workspaces.filter(workspace => workspace !== null) as RemWorkspace[];
});

View File

@@ -1,10 +1,6 @@
import { atom } from 'jotai/index';
import {
BlockSuiteWorkspace,
LocalWorkspace,
RemWorkspaceFlavour,
} from '../../shared';
import { BlockSuiteWorkspace } from '../../shared';
import { apis } from '../../shared/apis';
import { createEmptyBlockSuiteWorkspace } from '../../utils';
@@ -35,14 +31,15 @@ export const publicBlockSuiteAtom = atom<Promise<BlockSuiteWorkspace>>(
blockSuiteWorkspace.awarenessStore.setFlag('enable_drag_handle', false);
return new Promise(resolve => {
setTimeout(() => {
const workspace: LocalWorkspace = {
id: workspaceId,
blockSuiteWorkspace,
flavour: RemWorkspaceFlavour.LOCAL,
providers: [],
};
dataCenter.workspaces.push(workspace);
dataCenter.callbacks.forEach(cb => cb());
// const workspace: LocalWorkspace = {
// id: workspaceId,
// blockSuiteWorkspace,
// flavour: RemWorkspaceFlavour.LOCAL,
// providers: [],
// };
// fixme: quick search won't work, ASAP
// dataCenter.workspaces.push(workspace);
// dataCenter.callbacks.forEach(cb => cb());
resolve(blockSuiteWorkspace);
}, 0);
});