// the following import is used to ensure the block suite editor effects are run import '../blocksuite/block-suite-editor'; import { DebugLogger } from '@affine/debug'; import { DEFAULT_WORKSPACE_NAME } from '@affine/env/constant'; import onboardingUrl from '@affine/templates/onboarding.zip'; import { ZipTransformer } from '@blocksuite/affine/widgets/linked-doc'; import { DocsService } from '../modules/doc'; import { OrganizeService } from '../modules/organize'; import { getAFFiNEWorkspaceSchema, type WorkspacesService, } from '../modules/workspace'; export async function buildShowcaseWorkspace( workspacesService: WorkspacesService, flavour: string, workspaceName: string ) { const meta = await workspacesService.create(flavour, async docCollection => { docCollection.meta.initialize(); docCollection.doc.getMap('meta').set('name', workspaceName); const blob = await (await fetch(onboardingUrl)).blob(); await ZipTransformer.importDocs( docCollection, getAFFiNEWorkspaceSchema(), blob ); }); const { workspace, dispose } = workspacesService.open({ metadata: meta }); await workspace.engine.doc.waitForDocReady(workspace.id); const docsService = workspace.scope.get(DocsService); // should jump to "Getting Started" const defaultDoc = docsService.list.docs$.value.find(p => p.title$.value.startsWith('Getting Started') ); const folderTutorialDoc = docsService.list.docs$.value.find(p => p.title$.value.startsWith('How to use folder and Tags') ); // create default organize if (folderTutorialDoc) { const organizeService = workspace.scope.get(OrganizeService); const folderId = organizeService.folderTree.rootFolder.createFolder( 'First Folder', organizeService.folderTree.rootFolder.indexAt('after') ); const firstFolderNode = organizeService.folderTree.folderNode$(folderId).value; firstFolderNode?.createLink( 'doc', folderTutorialDoc.id, firstFolderNode.indexAt('after') ); } dispose(); return { meta, defaultDocId: defaultDoc?.id }; } const logger = new DebugLogger('createFirstAppData'); export async function createFirstAppData(workspacesService: WorkspacesService) { if (localStorage.getItem('is-first-open') !== null) { return; } localStorage.setItem('is-first-open', 'false'); const { meta, defaultDocId } = await buildShowcaseWorkspace( workspacesService, 'local', DEFAULT_WORKSPACE_NAME ); logger.info('create first workspace', defaultDocId); return { meta, defaultPageId: defaultDocId }; }