Skip to content

Commit 7bfd187

Browse files
authored
fix: Don't call onAction on prompt input when Enter key is pressed during IME composition (#3584)
1 parent fd8eb3d commit 7bfd187

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

src/prompt-input/__tests__/prompt-input.test.tsx

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ describe('prompt input in form', () => {
224224
(console.error as jest.Mock).mockClear();
225225
});
226226

227+
test('enter key during IME composition does not submit form', () => {
228+
const [wrapper, submitSpy] = renderPromptInputInForm({ value: '' });
229+
wrapper.findNativeTextarea().keydown({ keyCode: KeyCode.enter, isComposing: true });
230+
expect(submitSpy).not.toHaveBeenCalled();
231+
});
232+
227233
test('cancelling key event prevents submission', () => {
228234
const [wrapper, submitSpy] = renderPromptInputInForm({
229235
value: '',
@@ -247,21 +253,42 @@ describe('events', () => {
247253
expect(onChange).toHaveBeenCalledWith({ value: 'updated value' });
248254
});
249255

250-
test('fire an action event with correct parameters', () => {
256+
test('fire an action event on action button click with correct parameters', () => {
251257
const onAction = jest.fn();
252258
const { wrapper } = renderPromptInput({
253259
value: 'value',
254260
actionButtonIconName: 'send',
255261
onAction: event => onAction(event.detail),
256262
});
257263

258-
act(() => {
259-
wrapper.findActionButton().click();
264+
wrapper.findActionButton().click();
265+
expect(onAction).toHaveBeenCalled();
266+
});
267+
268+
test('fire an action event on enter keydown with correct parameters', () => {
269+
const onAction = jest.fn();
270+
const { wrapper } = renderPromptInput({
271+
value: 'value',
272+
actionButtonIconName: 'send',
273+
onAction: event => onAction(event.detail),
260274
});
261275

276+
wrapper.findNativeTextarea().keydown(KeyCode.enter);
262277
expect(onAction).toHaveBeenCalled();
263278
});
264279

280+
test('does not fire an action event on enter keydown if part of IME composition', () => {
281+
const onAction = jest.fn();
282+
const { wrapper } = renderPromptInput({
283+
value: 'value',
284+
actionButtonIconName: 'send',
285+
onAction: event => onAction(event.detail),
286+
});
287+
288+
wrapper.findNativeTextarea().keydown({ keyCode: KeyCode.enter, isComposing: true });
289+
expect(onAction).not.toHaveBeenCalled();
290+
});
291+
265292
test('fire keydown event', () => {
266293
const onKeyDown = jest.fn();
267294
const { wrapper } = renderPromptInput({

src/prompt-input/internal.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,10 @@ const InternalPromptInput = React.forwardRef(
9191
const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {
9292
fireKeyboardEvent(onKeyDown, event);
9393

94-
if (event.key === 'Enter' && !event.shiftKey) {
95-
if ('form' in event.target && event.target.form !== null && !event.isDefaultPrevented()) {
96-
(event.target.form as HTMLFormElement).requestSubmit();
94+
if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {
95+
if (event.currentTarget.form && !event.isDefaultPrevented()) {
96+
event.currentTarget.form.requestSubmit();
9797
}
98-
9998
event.preventDefault();
10099
fireNonCancelableEvent(onAction, { value });
101100
}

0 commit comments

Comments
 (0)