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]); }