From 788fb7c0efced953583ef9bf87b948775c8c3c7a Mon Sep 17 00:00:00 2001 From: Maxence Mauduit Date: Thu, 16 Jul 2026 11:20:00 +0900 Subject: [PATCH] fix(elements): block Enter submit while streaming in PromptInputTextarea --- .../elements/__tests__/prompt-input.test.tsx | 45 +++++++++++++++++++ packages/elements/src/prompt-input.tsx | 7 ++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/packages/elements/__tests__/prompt-input.test.tsx b/packages/elements/__tests__/prompt-input.test.tsx index d961a3ba..ce89183c 100644 --- a/packages/elements/__tests__/prompt-input.test.tsx +++ b/packages/elements/__tests__/prompt-input.test.tsx @@ -704,6 +704,51 @@ describe("promptInputTextarea", () => { expect(onSubmit).not.toHaveBeenCalled(); }); + it("does not submit on Enter while streaming - #439", async () => { + setupPromptInputTests(); + const onSubmit = vi.fn(); + const user = userEvent.setup(); + + render( + + + + + + + ); + + const textarea = screen.getByPlaceholderText( + "What would you like to know?" + ); + await user.type(textarea, "Test"); + await user.keyboard("{Enter}"); + + expect(onSubmit).not.toHaveBeenCalled(); + }); + + it("does not submit on Enter without a submit button - #439", async () => { + setupPromptInputTests(); + const onSubmit = vi.fn(); + const user = userEvent.setup(); + + render( + + + + + + ); + + const textarea = screen.getByPlaceholderText( + "What would you like to know?" + ); + await user.type(textarea, "Test"); + await user.keyboard("{Enter}"); + + expect(onSubmit).not.toHaveBeenCalled(); + }); + it("does not submit on Enter during IME composition - #21", () => { setupPromptInputTests(); const onSubmit = vi.fn(); diff --git a/packages/elements/src/prompt-input.tsx b/packages/elements/src/prompt-input.tsx index 412c846d..86ce866a 100644 --- a/packages/elements/src/prompt-input.tsx +++ b/packages/elements/src/prompt-input.tsx @@ -983,12 +983,15 @@ export const PromptInputTextarea = ({ } e.preventDefault(); - // Check if the submit button is disabled before submitting + // Check if the submit button is disabled before submitting. + // No submit button in the form means the input is not submittable + // right now (e.g. PromptInputSubmit renders as a stop button while + // streaming), so block Enter in that case too. const { form } = e.currentTarget; const submitButton = form?.querySelector( 'button[type="submit"]' ) as HTMLButtonElement | null; - if (submitButton?.disabled) { + if (!submitButton || submitButton.disabled) { return; }