diff --git a/blocksuite/affine/fragments/doc-title/src/doc-title.ts b/blocksuite/affine/fragments/doc-title/src/doc-title.ts index 9f812268a..acf3baab4 100644 --- a/blocksuite/affine/fragments/doc-title/src/doc-title.ts +++ b/blocksuite/affine/fragments/doc-title/src/doc-title.ts @@ -192,10 +192,14 @@ export class DocTitle extends WithDisposable(ShadowlessElement) { this._updateTitleInMeta(); this.requestUpdate(); }; - this._rootModel?.props.title.yText.observe(updateMetaTitle); - this._disposables.add(() => { - this._rootModel?.props.title.yText.unobserve(updateMetaTitle); - }); + + if (this._rootModel) { + const rootModel = this._rootModel; + rootModel.props.title.yText.observe(updateMetaTitle); + this._disposables.add(() => { + rootModel.props.title.yText.unobserve(updateMetaTitle); + }); + } } override render() { diff --git a/blocksuite/playground/apps/starter/data/preset.ts b/blocksuite/playground/apps/starter/data/preset.ts index bff7364a2..1c7941210 100644 --- a/blocksuite/playground/apps/starter/data/preset.ts +++ b/blocksuite/playground/apps/starter/data/preset.ts @@ -7,30 +7,40 @@ import type { InitFn } from './utils.js'; const presetMarkdown = `Click the 🔁 button to switch between editors dynamically - they are fully compatible!`; export const preset: InitFn = async (collection: Workspace, id: string) => { - const doc = collection.createDoc(id).getStore({ id }); - doc.load(); - // Add root block and surface block at root level - const rootId = doc.addBlock('affine:page', { - title: new Text('BlockSuite Playground'), - }); - doc.addBlock('affine:surface', {}, rootId); + let doc = collection.getDoc(id); + const hasDoc = !!doc; + if (!doc) { + doc = collection.createDoc(id); + } - // Add note block inside root block - const noteId = doc.addBlock( - 'affine:note', - { xywh: '[0, 100, 800, 640]' }, - rootId - ); + const store = doc.getStore({ id }); + store.load(); - // Import preset markdown content inside note block - await MarkdownTransformer.importMarkdownToBlock({ - doc, - blockId: noteId, - markdown: presetMarkdown, - extensions: getTestStoreManager().get('store'), - }); + // Run only once on all clients. + let noteId: string; + if (!hasDoc) { + // Add root block and surface block at root level + const rootId = store.addBlock('affine:page', { + title: new Text('BlockSuite Playground'), + }); + store.addBlock('affine:surface', {}, rootId); - doc.resetHistory(); + // Add note block inside root block + noteId = store.addBlock( + 'affine:note', + { xywh: '[0, 100, 800, 640]' }, + rootId + ); + // Import preset markdown content inside note block + await MarkdownTransformer.importMarkdownToBlock({ + doc: store, + blockId: noteId, + markdown: presetMarkdown, + extensions: getTestStoreManager().get('store'), + }); + } + + store.resetHistory(); }; preset.id = 'preset';