From 7bd980991ef47f588a23fe7f1cdc2a6f6bb36f4d Mon Sep 17 00:00:00 2001 From: akumatus Date: Tue, 24 Dec 2024 11:17:42 +0000 Subject: [PATCH] fix(core): chat input will be sent repeatedly in two documents with split view (#9289) Fix issue [AF-2011](https://linear.app/affine-design/issue/AF-2011). Add `host` strict equality check before ai request send. --- .../ai/_common/components/ask-ai-toolbar.ts | 6 +++++- .../presets/ai/chat-panel/chat-panel-input.ts | 14 +++++++++----- .../presets/ai/entries/edgeless/index.ts | 6 +++++- .../core/src/blocksuite/presets/ai/provider.ts | 1 + 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/frontend/core/src/blocksuite/presets/ai/_common/components/ask-ai-toolbar.ts b/packages/frontend/core/src/blocksuite/presets/ai/_common/components/ask-ai-toolbar.ts index 1da93ff7ce..71e821cdc2 100644 --- a/packages/frontend/core/src/blocksuite/presets/ai/_common/components/ask-ai-toolbar.ts +++ b/packages/frontend/core/src/blocksuite/presets/ai/_common/components/ask-ai-toolbar.ts @@ -74,7 +74,11 @@ export class AskAIToolbarButton extends WithDisposable(LitElement) { AIProvider.slots.requestOpenWithChat.emit({ host: this.host }); extractContext(this.host) .then(context => { - AIProvider.slots.requestSendWithChat.emit({ input, context }); + AIProvider.slots.requestSendWithChat.emit({ + input, + context, + host: this.host, + }); }) .catch(console.error); }; diff --git a/packages/frontend/core/src/blocksuite/presets/ai/chat-panel/chat-panel-input.ts b/packages/frontend/core/src/blocksuite/presets/ai/chat-panel/chat-panel-input.ts index d4e262a469..72573cd68e 100644 --- a/packages/frontend/core/src/blocksuite/presets/ai/chat-panel/chat-panel-input.ts +++ b/packages/frontend/core/src/blocksuite/presets/ai/chat-panel/chat-panel-input.ts @@ -300,11 +300,15 @@ export class ChatPanelInput extends WithDisposable(LitElement) { super.connectedCallback(); this._disposables.add( - AIProvider.slots.requestSendWithChat.on(async ({ input, context }) => { - context && this.updateContext(context); - await this.updateComplete; - await this.send(input); - }) + AIProvider.slots.requestSendWithChat.on( + async ({ input, context, host }) => { + if (this.host === host) { + context && this.updateContext(context); + await this.updateComplete; + await this.send(input); + } + } + ) ); } diff --git a/packages/frontend/core/src/blocksuite/presets/ai/entries/edgeless/index.ts b/packages/frontend/core/src/blocksuite/presets/ai/entries/edgeless/index.ts index b42159e788..7c7840e229 100644 --- a/packages/frontend/core/src/blocksuite/presets/ai/entries/edgeless/index.ts +++ b/packages/frontend/core/src/blocksuite/presets/ai/entries/edgeless/index.ts @@ -51,7 +51,11 @@ export function setupEdgelessElementToolbarAIEntry( AIProvider.slots.requestOpenWithChat.emit({ host: edgeless.host }); extractContext(edgeless.host) .then(context => { - AIProvider.slots.requestSendWithChat.emit({ input, context }); + AIProvider.slots.requestSendWithChat.emit({ + input, + context, + host: edgeless.host, + }); }) .catch(console.error); }; diff --git a/packages/frontend/core/src/blocksuite/presets/ai/provider.ts b/packages/frontend/core/src/blocksuite/presets/ai/provider.ts index 5d817fdf57..2fcac2e24e 100644 --- a/packages/frontend/core/src/blocksuite/presets/ai/provider.ts +++ b/packages/frontend/core/src/blocksuite/presets/ai/provider.ts @@ -24,6 +24,7 @@ export interface AIChatParams { } export interface AISendParams { + host: EditorHost; input?: string; context?: Partial; }