From 40ccb7642cf7bb9f4f7e22cd6d7464a1e5f31724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=B7=E5=B8=83=E5=8A=B3=E5=A4=96=20=C2=B7=20=E8=B4=BE?= =?UTF-8?q?=E8=B4=B5?= <472285740@qq.com> Date: Wed, 6 Aug 2025 09:39:25 +0800 Subject: [PATCH] refactor(core): show selected content chip if needed (#13415) > CLOSE AF-2784 ## Summary by CodeRabbit * **Bug Fixes** * Improved reliability when handling AI chat actions by ensuring valid context is present before proceeding. * Enhanced error handling and logging for failed context extraction in AI chat features. * **New Features** * Context extraction is now performed asynchronously before opening the AI Chat, providing more accurate and relevant chat context. --- .../ai-chat-composer/ai-chat-composer.ts | 27 ++++++++++++++++--- .../ai/entries/edgeless/actions-config.ts | 16 +++++++---- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-composer/ai-chat-composer.ts b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-composer/ai-chat-composer.ts index 72745861fb..e0d640eab2 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-composer/ai-chat-composer.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-composer/ai-chat-composer.ts @@ -211,13 +211,32 @@ export class AIChatComposer extends SignalWatcher( if (!params) return; const { context, host } = params; - if (this.host !== host) return; + if (this.host !== host || !context) return; - if (context) { - this.updateContext(context); + if ( + context.attachments || + context.snapshot || + context.combinedElementsMarkdown + ) { + // Wait for context value updated next frame + setTimeout(() => { + this.addSelectedContextChip().catch(console.error); + }, 0); } + }) + ); + this._disposables.add( + AIProvider.slots.requestSendWithChat.subscribe(params => { + if (!params) return; - if (context?.attachments) { + const { context, host } = params; + if (this.host !== host || !context) return; + + if ( + context.attachments || + context.snapshot || + context.combinedElementsMarkdown + ) { // Wait for context value updated next frame setTimeout(() => { this.addSelectedContextChip().catch(console.error); diff --git a/packages/frontend/core/src/blocksuite/ai/entries/edgeless/actions-config.ts b/packages/frontend/core/src/blocksuite/ai/entries/edgeless/actions-config.ts index 8c33071f84..ae68393e9c 100644 --- a/packages/frontend/core/src/blocksuite/ai/entries/edgeless/actions-config.ts +++ b/packages/frontend/core/src/blocksuite/ai/entries/edgeless/actions-config.ts @@ -52,6 +52,7 @@ import type { AIItemGroupConfig } from '../../components/ai-item/types'; import { AIProvider } from '../../provider'; import { getAIPanelWidget } from '../../utils/ai-widgets'; import { mindMapToMarkdown } from '../../utils/edgeless'; +import { extractSelectedContent } from '../../utils/extract'; import { canvasToBlob, randomSeed } from '../../utils/image'; import { getCopilotSelectedElems, @@ -114,11 +115,16 @@ const othersGroup: AIItemGroupConfig = { showWhen: () => true, handler: host => { const panel = getAIPanelWidget(host); - AIProvider.slots.requestOpenWithChat.next({ - host, - mode: 'edgeless', - autoSelect: true, - }); + extractSelectedContent(host) + .then(context => { + AIProvider.slots.requestOpenWithChat.next({ + host, + mode: 'edgeless', + autoSelect: true, + context, + }); + }) + .catch(console.error); panel.hide(); }, },