fix(core): read-only editor does not support code preview (#12700)
Close [AI-160](https://linear.app/affine-design/issue/AI-160) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## 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. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
@@ -40,6 +40,16 @@ export class CodeBlockComponent extends CaptionedBlockComponent<CodeBlockModel>
|
|||||||
|
|
||||||
private _inlineRangeProvider: InlineRangeProvider | null = null;
|
private _inlineRangeProvider: InlineRangeProvider | null = null;
|
||||||
|
|
||||||
|
private readonly _localPreview$ = signal<boolean | null>(null);
|
||||||
|
|
||||||
|
preview$: Signal<boolean> = computed(() => {
|
||||||
|
const modelPreview = !!this.model.props.preview$.value;
|
||||||
|
if (this.store.readonly) {
|
||||||
|
return this._localPreview$.value ?? modelPreview;
|
||||||
|
}
|
||||||
|
return modelPreview;
|
||||||
|
});
|
||||||
|
|
||||||
highlightTokens$: Signal<ThemedToken[][]> = signal([]);
|
highlightTokens$: Signal<ThemedToken[][]> = signal([]);
|
||||||
|
|
||||||
languageName$: Signal<string> = computed(() => {
|
languageName$: Signal<string> = computed(() => {
|
||||||
@@ -393,7 +403,7 @@ export class CodeBlockComponent extends CaptionedBlockComponent<CodeBlockModel>
|
|||||||
true) &&
|
true) &&
|
||||||
(this.model.props.lineNumber ?? true);
|
(this.model.props.lineNumber ?? true);
|
||||||
|
|
||||||
const preview = !!this.model.props.preview;
|
const preview = this.preview$.value;
|
||||||
const previewContext = this.std.getOptional(
|
const previewContext = this.std.getOptional(
|
||||||
CodeBlockPreviewIdentifier(this.model.props.language ?? '')
|
CodeBlockPreviewIdentifier(this.model.props.language ?? '')
|
||||||
);
|
);
|
||||||
@@ -461,6 +471,14 @@ export class CodeBlockComponent extends CaptionedBlockComponent<CodeBlockModel>
|
|||||||
override accessor useCaptionEditor = true;
|
override accessor useCaptionEditor = true;
|
||||||
|
|
||||||
override accessor useZeroWidth = 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 {
|
declare global {
|
||||||
|
|||||||
@@ -58,11 +58,7 @@ export class PreviewButton extends WithDisposable(SignalWatcher(LitElement)) {
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
private readonly _toggle = (value: boolean) => {
|
private readonly _toggle = (value: boolean) => {
|
||||||
if (this.blockComponent.store.readonly) return;
|
this.blockComponent.setPreviewState(value);
|
||||||
|
|
||||||
this.blockComponent.store.updateBlock(this.blockComponent.model, {
|
|
||||||
preview: value,
|
|
||||||
});
|
|
||||||
|
|
||||||
const std = this.blockComponent.std;
|
const std = this.blockComponent.std;
|
||||||
const mode = std.getOptional(DocModeProvider)?.getEditorMode() ?? 'page';
|
const mode = std.getOptional(DocModeProvider)?.getEditorMode() ?? 'page';
|
||||||
@@ -77,7 +73,7 @@ export class PreviewButton extends WithDisposable(SignalWatcher(LitElement)) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
get preview() {
|
get preview() {
|
||||||
return !!this.blockComponent.model.props.preview$.value;
|
return this.blockComponent.preview$.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
override render() {
|
override render() {
|
||||||
|
|||||||
Reference in New Issue
Block a user