mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-29 16:19:43 +08:00
fix(core): ask ai loses user selected context (#11767)
Close [AI-72](https://linear.app/affine-design/issue/AI-72)
This commit is contained in:
@@ -281,12 +281,9 @@ export class AIChatInput extends SignalWatcher(WithDisposable(LitElement)) {
|
|||||||
({ input, context, host }) => {
|
({ input, context, host }) => {
|
||||||
if (this.host === host) {
|
if (this.host === host) {
|
||||||
context && this.updateContext(context);
|
context && this.updateContext(context);
|
||||||
const { updateComplete, send } = this;
|
setTimeout(() => {
|
||||||
updateComplete
|
this.send(input).catch(console.error);
|
||||||
.then(() => {
|
}, 0);
|
||||||
return send(input);
|
|
||||||
})
|
|
||||||
.catch(console.error);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
+7
-11
@@ -84,11 +84,11 @@ export class AIPanelInput extends SignalWatcher(WithDisposable(LitElement)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.arrow[data-active] {
|
.arrow[data-active='true'] {
|
||||||
background: ${unsafeCSSVarV2('icon/activated')};
|
background: ${unsafeCSSVarV2('icon/activated')};
|
||||||
}
|
}
|
||||||
|
|
||||||
.arrow[data-active]:hover {
|
.arrow[data-active='true']:hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,7 +140,7 @@ export class AIPanelInput extends SignalWatcher(WithDisposable(LitElement)) {
|
|||||||
)};
|
)};
|
||||||
}
|
}
|
||||||
|
|
||||||
.arrow[data-active] {
|
.arrow[data-active='true'] {
|
||||||
background: ${unsafeCSS(
|
background: ${unsafeCSS(
|
||||||
lightCssVariablesV2['--affine-v2-icon-activated']
|
lightCssVariablesV2['--affine-v2-icon-activated']
|
||||||
)};
|
)};
|
||||||
@@ -178,7 +178,7 @@ export class AIPanelInput extends SignalWatcher(WithDisposable(LitElement)) {
|
|||||||
)};
|
)};
|
||||||
}
|
}
|
||||||
|
|
||||||
.arrow[data-active] {
|
.arrow[data-active='true'] {
|
||||||
background: ${unsafeCSS(
|
background: ${unsafeCSS(
|
||||||
darkCssVariablesV2['--affine-v2-icon-activated']
|
darkCssVariablesV2['--affine-v2-icon-activated']
|
||||||
)};
|
)};
|
||||||
@@ -196,13 +196,8 @@ export class AIPanelInput extends SignalWatcher(WithDisposable(LitElement)) {
|
|||||||
|
|
||||||
this.onInput?.(this.textarea.value);
|
this.onInput?.(this.textarea.value);
|
||||||
const value = this.textarea.value.trim();
|
const value = this.textarea.value.trim();
|
||||||
if (value.length > 0) {
|
this._hasContent = value.length > 0;
|
||||||
this._arrow.dataset.active = '';
|
this._arrow.dataset.active = String(this._hasContent);
|
||||||
this._hasContent = true;
|
|
||||||
} else {
|
|
||||||
delete this._arrow.dataset.active;
|
|
||||||
this._hasContent = false;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly _onKeyDown = (e: KeyboardEvent) => {
|
private readonly _onKeyDown = (e: KeyboardEvent) => {
|
||||||
@@ -264,6 +259,7 @@ export class AIPanelInput extends SignalWatcher(WithDisposable(LitElement)) {
|
|||||||
: nothing}
|
: nothing}
|
||||||
<div
|
<div
|
||||||
class="arrow"
|
class="arrow"
|
||||||
|
data-testid="ai-panel-input-send"
|
||||||
@click=${this._sendToAI}
|
@click=${this._sendToAI}
|
||||||
@pointerdown=${stopPropagation}
|
@pointerdown=${stopPropagation}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -359,4 +359,63 @@ test.describe('AIBasic/Chat', () => {
|
|||||||
expect(clipboardText).toBe(content);
|
expect(clipboardText).toBe(content);
|
||||||
}).toPass({ timeout: 5000 });
|
}).toPass({ timeout: 5000 });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('chat with ask ai input in page mode', async ({
|
||||||
|
loggedInPage: page,
|
||||||
|
utils,
|
||||||
|
}) => {
|
||||||
|
await utils.chatPanel.closeChatPanel(page);
|
||||||
|
await utils.editor.askAIWithText(
|
||||||
|
page,
|
||||||
|
'AFFiNE is an open source all in one workspace.'
|
||||||
|
);
|
||||||
|
await page.keyboard.type('Translate to chinese');
|
||||||
|
|
||||||
|
const sendButton = await page.getByTestId('ai-panel-input-send');
|
||||||
|
await expect(sendButton).toHaveAttribute('data-active', 'true');
|
||||||
|
await sendButton.click();
|
||||||
|
|
||||||
|
await expect(page.getByTestId('sidebar-tab-content-chat')).toBeVisible();
|
||||||
|
await utils.chatPanel.waitForHistory(page, [
|
||||||
|
{
|
||||||
|
role: 'user',
|
||||||
|
content:
|
||||||
|
'AFFiNE is an open source all in one workspace.\nTranslate to chinese',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'assistant',
|
||||||
|
status: 'success',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('chat with ask ai input in edgeless mode', async ({
|
||||||
|
loggedInPage: page,
|
||||||
|
utils,
|
||||||
|
}) => {
|
||||||
|
await utils.chatPanel.closeChatPanel(page);
|
||||||
|
await utils.editor.askAIWithEdgeless(page, async () => {
|
||||||
|
await utils.editor.createShape(page, 'HelloWorld');
|
||||||
|
});
|
||||||
|
await page.waitForTimeout(1000);
|
||||||
|
await page.keyboard.type('What color is it?');
|
||||||
|
|
||||||
|
await page.waitForTimeout(1000);
|
||||||
|
const sendButton = await page.getByTestId('ai-panel-input-send');
|
||||||
|
await expect(sendButton).toHaveAttribute('data-active', 'true');
|
||||||
|
await sendButton.click();
|
||||||
|
|
||||||
|
await expect(page.getByTestId('sidebar-tab-content-chat')).toBeVisible();
|
||||||
|
expect(await page.locator('chat-content-images')).toBeVisible();
|
||||||
|
await utils.chatPanel.waitForHistory(page, [
|
||||||
|
{
|
||||||
|
role: 'user',
|
||||||
|
content: 'What color is it?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
role: 'assistant',
|
||||||
|
status: 'success',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -38,6 +38,13 @@ export class ChatPanelUtils {
|
|||||||
await this.disableNetworkSearch(page);
|
await this.disableNetworkSearch(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async closeChatPanel(page: Page) {
|
||||||
|
await page.getByTestId('right-sidebar-toggle').click({
|
||||||
|
delay: 200,
|
||||||
|
});
|
||||||
|
await expect(page.getByTestId('sidebar-tab-content-chat')).toBeHidden();
|
||||||
|
}
|
||||||
|
|
||||||
public static async typeChat(page: Page, content: string) {
|
public static async typeChat(page: Page, content: string) {
|
||||||
await page.getByTestId('chat-panel-input').focus();
|
await page.getByTestId('chat-panel-input').focus();
|
||||||
await page.keyboard.type(content);
|
await page.keyboard.type(content);
|
||||||
|
|||||||
Reference in New Issue
Block a user