diff --git a/blocksuite/affine/blocks/embed-doc/src/embed-linked-doc-block/embed-linked-doc-block.ts b/blocksuite/affine/blocks/embed-doc/src/embed-linked-doc-block/embed-linked-doc-block.ts index 7ca1c2f63..fe7a82a26 100644 --- a/blocksuite/affine/blocks/embed-doc/src/embed-linked-doc-block/embed-linked-doc-block.ts +++ b/blocksuite/affine/blocks/embed-doc/src/embed-linked-doc-block/embed-linked-doc-block.ts @@ -259,7 +259,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent { event.stopPropagation(); const openDocService = this.std.get(OpenDocExtensionIdentifier); const shouldOpenInPeek = @@ -270,7 +270,7 @@ export class EmbedLinkedDocBlockComponent extends EmbedBlockComponent `; }; diff --git a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts index d56ed3e06..fbf6b6622 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/text-renderer.ts @@ -2,8 +2,10 @@ import { createReactComponentFromLit } from '@affine/component'; import { getStoreManager } from '@affine/core/blocksuite/manager/store'; import { getViewManager } from '@affine/core/blocksuite/manager/view'; import type { FeatureFlagService } from '@affine/core/modules/feature-flag'; +import { PeekViewProvider } from '@blocksuite/affine/components/peek'; import { Container, type ServiceProvider } from '@blocksuite/affine/global/di'; import { WithDisposable } from '@blocksuite/affine/global/lit'; +import { RefNodeSlotsProvider } from '@blocksuite/affine/inlines/reference'; import { codeBlockWrapMiddleware, defaultImageProxyMiddleware, @@ -34,6 +36,7 @@ import { classMap } from 'lit/directives/class-map.js'; import { keyed } from 'lit/directives/keyed.js'; import { literal } from 'lit/static-html.js'; import React from 'react'; +import { filter } from 'rxjs/operators'; import { markDownToDoc } from '../../utils'; import type { @@ -240,6 +243,28 @@ export class TextRenderer extends WithDisposable(ShadowlessElement) { private _timer?: ReturnType | null = null; + private readonly _subscribeDocLinkClicked = () => { + const refNodeSlots = this.host?.std.getOptional(RefNodeSlotsProvider); + if (!refNodeSlots) return; + this.disposables.add( + refNodeSlots.docLinkClicked + .pipe( + filter( + options => !!this._previewHost && options.host === this._previewHost + ) + ) + .subscribe(options => { + // Open the doc in center peek + this.host?.std + .getOptional(PeekViewProvider) + ?.peek({ + docId: options.pageId, + }) + .catch(console.error); + }) + ); + }; + private readonly _updateDoc = () => { if (this._answers.length > 0) { const latestAnswer = this._answers.pop(); @@ -311,6 +336,10 @@ export class TextRenderer extends WithDisposable(ShadowlessElement) { } } + override firstUpdated() { + this._subscribeDocLinkClicked(); + } + private disposeDoc() { this._doc?.dispose(); this._doc?.workspace.dispose(); @@ -382,6 +411,9 @@ export class TextRenderer extends WithDisposable(ShadowlessElement) { @query('.text-renderer-container') private accessor _container!: HTMLDivElement; + @query('.text-renderer-container editor-host') + private accessor _previewHost: EditorHost | null = null; + @property({ attribute: false }) accessor answer!: string;