From c32f7c7964ec1180c3420bc0cf7ed5ee12698289 Mon Sep 17 00:00:00 2001 From: akumatus Date: Wed, 4 Jun 2025 12:41:10 +0000 Subject: [PATCH] fix(core): read-only editor does not support code preview (#12700) Close [AI-160](https://linear.app/affine-design/issue/AI-160) ## Summary by CodeRabbit - **New Features** - Improved preview state management for code blocks, ensuring consistent behavior in both editable and readonly modes. - **Refactor** - Streamlined the way preview state is toggled and displayed for code blocks, resulting in a more reliable and maintainable user experience. --- .../affine/blocks/code/src/code-block.ts | 20 ++++++++++++++++++- .../code-toolbar/components/preview-button.ts | 8 ++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/blocksuite/affine/blocks/code/src/code-block.ts b/blocksuite/affine/blocks/code/src/code-block.ts index 36d0ff8a7..92bc747a4 100644 --- a/blocksuite/affine/blocks/code/src/code-block.ts +++ b/blocksuite/affine/blocks/code/src/code-block.ts @@ -40,6 +40,16 @@ export class CodeBlockComponent extends CaptionedBlockComponent private _inlineRangeProvider: InlineRangeProvider | null = null; + private readonly _localPreview$ = signal(null); + + preview$: Signal = computed(() => { + const modelPreview = !!this.model.props.preview$.value; + if (this.store.readonly) { + return this._localPreview$.value ?? modelPreview; + } + return modelPreview; + }); + highlightTokens$: Signal = signal([]); languageName$: Signal = computed(() => { @@ -393,7 +403,7 @@ export class CodeBlockComponent extends CaptionedBlockComponent true) && (this.model.props.lineNumber ?? true); - const preview = !!this.model.props.preview; + const preview = this.preview$.value; const previewContext = this.std.getOptional( CodeBlockPreviewIdentifier(this.model.props.language ?? '') ); @@ -461,6 +471,14 @@ export class CodeBlockComponent extends CaptionedBlockComponent override accessor useCaptionEditor = true; override accessor useZeroWidth = true; + + setPreviewState(preview: boolean) { + if (this.store.readonly) { + this._localPreview$.value = preview; + } else { + this.store.updateBlock(this.model, { preview }); + } + } } declare global { diff --git a/blocksuite/affine/blocks/code/src/code-toolbar/components/preview-button.ts b/blocksuite/affine/blocks/code/src/code-toolbar/components/preview-button.ts index 060e97fe8..15387ad50 100644 --- a/blocksuite/affine/blocks/code/src/code-toolbar/components/preview-button.ts +++ b/blocksuite/affine/blocks/code/src/code-toolbar/components/preview-button.ts @@ -58,11 +58,7 @@ export class PreviewButton extends WithDisposable(SignalWatcher(LitElement)) { `; private readonly _toggle = (value: boolean) => { - if (this.blockComponent.store.readonly) return; - - this.blockComponent.store.updateBlock(this.blockComponent.model, { - preview: value, - }); + this.blockComponent.setPreviewState(value); const std = this.blockComponent.std; const mode = std.getOptional(DocModeProvider)?.getEditorMode() ?? 'page'; @@ -77,7 +73,7 @@ export class PreviewButton extends WithDisposable(SignalWatcher(LitElement)) { }; get preview() { - return !!this.blockComponent.model.props.preview$.value; + return this.blockComponent.preview$.value; } override render() {