From be387a6f337f88b42bdf2febab8874ea7cd2b6a6 Mon Sep 17 00:00:00 2001 From: Saul-Mirone Date: Thu, 2 Jan 2025 04:02:15 +0000 Subject: [PATCH] refactor(editor): set readonly (#9475) --- .../src/common/render-linked-doc.ts | 2 +- .../src/helpers/preview-helper.ts | 2 +- .../widgets/format-bar/format-bar.ts | 4 +--- .../block-std/src/selection/manager.ts | 6 ++---- .../src/__tests__/collection.unit.spec.ts | 3 --- .../store/src/__tests__/doc.unit.spec.ts | 4 ++-- .../framework/store/src/store/doc/doc.ts | 20 ++++++++++--------- .../_common/components/starter-debug-menu.ts | 2 +- blocksuite/playground/apps/_common/history.ts | 1 - blocksuite/tests-legacy/utils/actions/misc.ts | 2 +- .../_common/components/text-renderer.ts | 5 +---- .../affine/page-history-modal/data.ts | 2 +- .../hooks/use-block-suite-page-meta.ts | 7 ++----- .../general-setting/editor/edgeless/shape.tsx | 4 ++-- .../editor/edgeless/snapshot.tsx | 8 ++++---- .../detail-page/detail-page-wrapper.tsx | 5 +---- .../pages/workspace/share/share-page.tsx | 5 +---- 17 files changed, 32 insertions(+), 50 deletions(-) diff --git a/blocksuite/affine/block-embed/src/common/render-linked-doc.ts b/blocksuite/affine/block-embed/src/common/render-linked-doc.ts index 928f0c46d7..f04e6debcf 100644 --- a/blocksuite/affine/block-embed/src/common/render-linked-doc.ts +++ b/blocksuite/affine/block-embed/src/common/render-linked-doc.ts @@ -188,7 +188,7 @@ async function renderNoteContent( let parent: string | null = block; while (parent && !ids.includes(parent)) { ids.push(parent); - parent = doc.blockCollection.crud.getParent(parent); + parent = doc.getParent(parent)?.id ?? null; } }); const query: Query = { diff --git a/blocksuite/affine/widget-drag-handle/src/helpers/preview-helper.ts b/blocksuite/affine/widget-drag-handle/src/helpers/preview-helper.ts index 4e82df2a8e..f202506fcc 100644 --- a/blocksuite/affine/widget-drag-handle/src/helpers/preview-helper.ts +++ b/blocksuite/affine/widget-drag-handle/src/helpers/preview-helper.ts @@ -35,7 +35,7 @@ export class PreviewHelper { if (!selectedIds.includes(parent)) { ids.push({ viewType: BlockViewType.Bypass, id: parent }); } - parent = this.widget.doc.blockCollection.crud.getParent(parent); + parent = this.widget.doc.getParent(parent)?.id ?? null; } while (parent && !ids.map(({ id }) => id).includes(parent)); }); diff --git a/blocksuite/blocks/src/root-block/widgets/format-bar/format-bar.ts b/blocksuite/blocks/src/root-block/widgets/format-bar/format-bar.ts index 664235efa7..5c7541d552 100644 --- a/blocksuite/blocks/src/root-block/widgets/format-bar/format-bar.ts +++ b/blocksuite/blocks/src/root-block/widgets/format-bar/format-bar.ts @@ -343,9 +343,7 @@ export class AffineFormatBarWidget extends WidgetComponent { } private _shouldDisplay() { - const readonly = this.doc.awarenessStore.isReadonly( - this.doc.blockCollection - ); + const readonly = this.doc.readonly; const active = this.host.event.active; if (readonly || !active) return false; diff --git a/blocksuite/framework/block-std/src/selection/manager.ts b/blocksuite/framework/block-std/src/selection/manager.ts index c499068a2f..64edb93c10 100644 --- a/blocksuite/framework/block-std/src/selection/manager.ts +++ b/blocksuite/framework/block-std/src/selection/manager.ts @@ -75,7 +75,7 @@ export class SelectionManager extends LifeCycleWatcher { constructor(std: BlockStdScope) { super(std); - this._id = `${this.std.doc.blockCollection.id}:${nanoid()}`; + this._id = `${this.std.doc.id}:${nanoid()}`; this._setupDefaultSelections(); this._store.awareness.on( 'change', @@ -99,9 +99,7 @@ export class SelectionManager extends LifeCycleWatcher { if (id === this._store.awareness.clientID) return; // selection id starts with the same block collection id from others clients would be considered as remote selections const selection = Object.entries(state.selectionV2) - .filter(([key]) => - key.startsWith(this.std.doc.blockCollection.id) - ) + .filter(([key]) => key.startsWith(this.std.doc.id)) .flatMap(([_, selection]) => selection); const selections = selection diff --git a/blocksuite/framework/store/src/__tests__/collection.unit.spec.ts b/blocksuite/framework/store/src/__tests__/collection.unit.spec.ts index 1468258322..9104fe690d 100644 --- a/blocksuite/framework/store/src/__tests__/collection.unit.spec.ts +++ b/blocksuite/framework/store/src/__tests__/collection.unit.spec.ts @@ -163,17 +163,14 @@ describe('basic', () => { doc.slots.rootAdded.on(rootAddedCallback); doc.load(() => { - expect(doc.ready).toBe(false); const rootId = doc.addBlock('affine:page', { title: new doc.Text(), }); expect(rootAddedCallback).toBeCalledTimes(1); - expect(doc.ready).toBe(false); doc.addBlock('affine:note', {}, rootId); }); - expect(doc.ready).toBe(true); expect(readyCallback).toBeCalledTimes(1); }); diff --git a/blocksuite/framework/store/src/__tests__/doc.unit.spec.ts b/blocksuite/framework/store/src/__tests__/doc.unit.spec.ts index 41c54a4a64..804ddd0de5 100644 --- a/blocksuite/framework/store/src/__tests__/doc.unit.spec.ts +++ b/blocksuite/framework/store/src/__tests__/doc.unit.spec.ts @@ -258,13 +258,13 @@ test('local readonly', () => { expect(doc2?.readonly).toBeTruthy(); expect(doc3?.readonly).toBeFalsy(); - collection.awarenessStore.setReadonly(doc1.blockCollection, true); + doc1.readonly = true; expect(doc1.readonly).toBeTruthy(); expect(doc2?.readonly).toBeTruthy(); expect(doc3?.readonly).toBeTruthy(); - collection.awarenessStore.setReadonly(doc1.blockCollection, false); + doc1.readonly = false; expect(doc1.readonly).toBeFalsy(); expect(doc2?.readonly).toBeTruthy(); diff --git a/blocksuite/framework/store/src/store/doc/doc.ts b/blocksuite/framework/store/src/store/doc/doc.ts index 5232ac3738..b659984fea 100644 --- a/blocksuite/framework/store/src/store/doc/doc.ts +++ b/blocksuite/framework/store/src/store/doc/doc.ts @@ -37,7 +37,7 @@ export class Doc { mode: 'loose', }; - protected readonly _readonly?: boolean; + protected _readonly?: boolean; protected readonly _schema: Schema; @@ -144,10 +144,6 @@ export class Doc { return this._blockCollection.awarenessStore; } - get awarenessSync() { - return this.collection.awarenessSync; - } - get blobSync() { return this.collection.blobSync; } @@ -184,10 +180,6 @@ export class Doc { return this._blockCollection.collection; } - get docSync() { - return this.collection.docSync; - } - get generateBlockId() { return this._blockCollection.generateBlockId.bind(this._blockCollection); } @@ -219,6 +211,16 @@ export class Doc { return this._readonly === true; } + set readonly(value: boolean) { + this._blockCollection.awarenessStore.setReadonly( + this._blockCollection, + value + ); + if (this._readonly !== undefined && this._readonly !== value) { + this._readonly = value; + } + } + get ready() { return this._blockCollection.ready; } diff --git a/blocksuite/playground/apps/_common/components/starter-debug-menu.ts b/blocksuite/playground/apps/_common/components/starter-debug-menu.ts index c223e6d82b..b975418166 100644 --- a/blocksuite/playground/apps/_common/components/starter-debug-menu.ts +++ b/blocksuite/playground/apps/_common/components/starter-debug-menu.ts @@ -668,7 +668,7 @@ export class StarterDebugMenu extends ShadowlessElement { private _toggleReadonly() { const doc = this.doc; - doc.awarenessStore.setReadonly(doc.blockCollection, !doc.readonly); + doc.readonly = !doc.readonly; } private async _toggleStyleDebugMenu() { diff --git a/blocksuite/playground/apps/_common/history.ts b/blocksuite/playground/apps/_common/history.ts index eb763896a6..f25b1206b6 100644 --- a/blocksuite/playground/apps/_common/history.ts +++ b/blocksuite/playground/apps/_common/history.ts @@ -22,7 +22,6 @@ export function getDocFromUrlParams(collection: DocCollection, url: URL) { doc.load(); doc.resetHistory(); - assertExists(doc.ready, 'Doc is not ready'); assertExists(doc.root, 'Doc root is not ready'); return doc; diff --git a/blocksuite/tests-legacy/utils/actions/misc.ts b/blocksuite/tests-legacy/utils/actions/misc.ts index 04358023fd..1ac879beff 100644 --- a/blocksuite/tests-legacy/utils/actions/misc.ts +++ b/blocksuite/tests-legacy/utils/actions/misc.ts @@ -79,7 +79,7 @@ async function initEmptyEditor({ async function waitForMountPageEditor( doc: ReturnType ) { - if (!doc.ready) doc.load(); + doc.load(); if (!doc.root) { await new Promise(resolve => doc.slots.rootAdded.once(resolve)); diff --git a/packages/frontend/core/src/blocksuite/presets/_common/components/text-renderer.ts b/packages/frontend/core/src/blocksuite/presets/_common/components/text-renderer.ts index 7a03d6b9b5..8eb91464c4 100644 --- a/packages/frontend/core/src/blocksuite/presets/_common/components/text-renderer.ts +++ b/packages/frontend/core/src/blocksuite/presets/_common/components/text-renderer.ts @@ -226,10 +226,7 @@ export class TextRenderer extends WithDisposable(ShadowlessElement) { this.disposables.add(() => { doc.blockCollection.clearQuery(this._query); }); - this._doc.awarenessStore.setReadonly( - this._doc.blockCollection, - true - ); + this._doc.readonly = true; this.requestUpdate(); if (this.state !== 'generating') { this._clearTimer(); diff --git a/packages/frontend/core/src/components/affine/page-history-modal/data.ts b/packages/frontend/core/src/components/affine/page-history-modal/data.ts index a74547a4ad..f847d50de1 100644 --- a/packages/frontend/core/src/components/affine/page-history-modal/data.ts +++ b/packages/frontend/core/src/components/affine/page-history-modal/data.ts @@ -169,7 +169,7 @@ export const useSnapshotPage = ( page = historyShellWorkspace.createDoc({ id: pageId, }); - page.awarenessStore.setReadonly(page.blockCollection, true); + page.readonly = true; const spaceDoc = page.spaceDoc; page.load(() => { applyUpdate(spaceDoc, new Uint8Array(snapshot)); diff --git a/packages/frontend/core/src/components/hooks/use-block-suite-page-meta.ts b/packages/frontend/core/src/components/hooks/use-block-suite-page-meta.ts index 9821a15a5d..89dde2bdd7 100644 --- a/packages/frontend/core/src/components/hooks/use-block-suite-page-meta.ts +++ b/packages/frontend/core/src/components/hooks/use-block-suite-page-meta.ts @@ -56,11 +56,8 @@ export function useDocMetaHelper() { const setDocReadonly = useCallback( (docId: string, readonly: boolean) => { const doc = workspaceService.workspace.docCollection.getDoc(docId); - if (doc?.blockCollection) { - workspaceService.workspace.docCollection.awarenessStore.setReadonly( - doc.blockCollection, - readonly - ); + if (doc) { + doc.readonly = readonly; } }, [workspaceService] diff --git a/packages/frontend/core/src/desktop/dialogs/setting/general-setting/editor/edgeless/shape.tsx b/packages/frontend/core/src/desktop/dialogs/setting/general-setting/editor/edgeless/shape.tsx index 7d0c8c5ef8..208dbabbfa 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/general-setting/editor/edgeless/shape.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/general-setting/editor/edgeless/shape.tsx @@ -359,7 +359,7 @@ export const ShapeSettings = () => { ) as EdgelessRootService; const surface = getSurfaceBlock(doc); if (!surface) return; - doc.awarenessStore.setReadonly(doc.blockCollection, false); + doc.readonly = false; surface.getElementsByType('shape').forEach(node => { const shape = node as ShapeElementModel; const { shapeType, radius } = shape; @@ -367,7 +367,7 @@ export const ShapeSettings = () => { const props = editorSetting.get(`shape:${shapeName}`); edgelessService.crud.updateElement(shape.id, props); }); - doc.awarenessStore.setReadonly(doc.blockCollection, true); + doc.readonly = true; }, [editorSetting] ); diff --git a/packages/frontend/core/src/desktop/dialogs/setting/general-setting/editor/edgeless/snapshot.tsx b/packages/frontend/core/src/desktop/dialogs/setting/general-setting/editor/edgeless/snapshot.tsx index 329753c298..1d67a46553 100644 --- a/packages/frontend/core/src/desktop/dialogs/setting/general-setting/editor/edgeless/snapshot.tsx +++ b/packages/frontend/core/src/desktop/dialogs/setting/general-setting/editor/edgeless/snapshot.tsx @@ -77,11 +77,11 @@ export const EdgelessSnapshot = (props: Props) => { ) as EdgelessRootService; const elements = getElements(doc); const props = editorSetting.get(keyName) as any; - doc.awarenessStore.setReadonly(doc.blockCollection, false); + doc.readonly = false; elements.forEach(element => { edgelessService.crud.updateElement(element.id, props); }); - doc.awarenessStore.setReadonly(doc.blockCollection, true); + doc.readonly = true; }, [editorSetting, getElements, keyName]); const renderEditor = useCallback(async () => { @@ -112,7 +112,7 @@ export const EdgelessSnapshot = (props: Props) => { ) as EdgelessRootService; edgelessService.specSlots.viewConnected.once(({ component }) => { const edgelessBlock = component as any; - doc.awarenessStore.setReadonly(doc.blockCollection, false); + doc.readonly = false; edgelessBlock.editorViewportSelector = 'ref-viewport'; const frame = getFrameBlock(doc); if (frame) { @@ -121,7 +121,7 @@ export const EdgelessSnapshot = (props: Props) => { } const bound = boundMap.get(docName); bound && edgelessService.viewport.setViewportByBound(bound); - doc.awarenessStore.setReadonly(doc.blockCollection, true); + doc.readonly = true; }); // append to dom node diff --git a/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page-wrapper.tsx b/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page-wrapper.tsx index 2468461c01..dc63d16193 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page-wrapper.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/detail-page/detail-page-wrapper.tsx @@ -51,10 +51,7 @@ const useLoadDoc = (pageId: string) => { useEffect(() => { if (doc && isInTrash) { - currentWorkspace.docCollection.awarenessStore.setReadonly( - doc.blockSuiteDoc.blockCollection, - true - ); + doc.blockSuiteDoc.readonly = true; } }, [currentWorkspace.docCollection.awarenessStore, doc, isInTrash]); diff --git a/packages/frontend/core/src/desktop/pages/workspace/share/share-page.tsx b/packages/frontend/core/src/desktop/pages/workspace/share/share-page.tsx index b695ac67c8..f84926ef23 100644 --- a/packages/frontend/core/src/desktop/pages/workspace/share/share-page.tsx +++ b/packages/frontend/core/src/desktop/pages/workspace/share/share-page.tsx @@ -211,10 +211,7 @@ const SharePageInner = ({ .then(() => { const { doc } = workspace.scope.get(DocsService).open(docId); - workspace.docCollection.awarenessStore.setReadonly( - doc.blockSuiteDoc.blockCollection, - true - ); + doc.blockSuiteDoc.readonly = true; setPage(doc);