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