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

@@ -0,0 +1,53 @@
import { DEFAULT_WORKSPACE_NAME } from '@affine/env';
import { assertEquals, assertExists, nanoid } from '@blocksuite/store';
import { useAtom } from 'jotai/index';
import { useEffect } from 'react';
import { jotaiWorkspacesAtom } from '../atoms';
import { LocalPlugin } from '../plugins/local';
import { RemWorkspaceFlavour } from '../shared';
import { createEmptyBlockSuiteWorkspace } from '../utils';
export function useCreateFirstWorkspace() {
const [jotaiWorkspaces, set] = useAtom(jotaiWorkspacesAtom);
useEffect(() => {
const controller = new AbortController();
/**
* Create a first workspace, only just once for a browser
*/
async function createFirst() {
const blockSuiteWorkspace = createEmptyBlockSuiteWorkspace(
nanoid(),
(_: string) => undefined
);
blockSuiteWorkspace.meta.setName(DEFAULT_WORKSPACE_NAME);
const id = await LocalPlugin.CRUD.create(blockSuiteWorkspace);
const workspace = await LocalPlugin.CRUD.get(id);
assertExists(workspace);
assertEquals(workspace.id, id);
const newPageId = nanoid();
workspace.blockSuiteWorkspace.slots.pageAdded.once(pageId => {
assertEquals(pageId, newPageId);
set(workspaces => [
...workspaces,
{
id: workspace.id,
flavour: RemWorkspaceFlavour.LOCAL,
},
]);
});
workspace.blockSuiteWorkspace.createPage(newPageId);
}
if (
jotaiWorkspaces.length === 0 &&
localStorage.getItem('first') !== 'true'
) {
localStorage.setItem('first', 'true');
createFirst();
}
return () => {
controller.abort();
};
}, [jotaiWorkspaces.length, set]);
}