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; }