afterbuild/ops
ERR-102/React · forms
ERR-102
Click submit → no request, no error, no toast

appears when:User clicks the submit button and nothing happens — no network request, no UI change, no error in console

form submit does nothing

Six root causes for silent submit failures in React apps. The DevTools Network tab separates them in under a minute.

Last updated 17 April 2026 · 5 min read · By Hyder Shah
Direct answer
Form submit does nothing is almost always a missing event.preventDefault() in the submit handler, a button with type="button" instead of type="submit", or anonClick wired to the button instead of onSubmit on the form. Open DevTools Network tab — if nothing fires, the handler is not attached; if the page reloads, preventDefault is missing.

Quick fix for form submit does nothing

components/signup-form.tsx
tsx
01function SignupForm() {02  async function onSubmit(e: React.FormEvent<HTMLFormElement>) {03    e.preventDefault(); // synchronous — must run before any await04    const data = new FormData(e.currentTarget);05 06    try {07      const res = await fetch("/api/signup", { method: "POST", body: data });08      if (!res.ok) throw new Error(await res.text());09      toast.success("Account created");10    } catch (err) {11      toast.error(err instanceof Error ? err.message : "Submission failed");12    }13  }14 15  return (16    <form onSubmit={onSubmit}>17      <input name="email" type="email" required />18      <button type="submit">Sign up</button>19    </form>20  );21}
Bind onSubmit to the form, type='submit' on the button, preventDefault first, toast errors

Deeper fixes when the quick fix fails

01 · Render react-hook-form errors inline

components/form.tsx
tsx
01const { register, handleSubmit, formState: { errors } } = useForm();02 03<form onSubmit={handleSubmit(onSubmit)}>04  <input {...register("email", { required: "Email is required" })} />05  {errors.email && (06    <p role="alert">{errors.email.message as string}</p>07  )}08  <button type="submit">Submit</button>09</form>

02 · Reset isSubmitting in a finally block

components/form.tsx
tsx
01const [isSubmitting, setIsSubmitting] = useState(false);02 03async function onSubmit() {04  setIsSubmitting(true);05  try {06    await save();07  } finally {08    setIsSubmitting(false); // guarantees the button re-enables even on error09  }10}

03 · Associate a button outside the form via form= attribute

components/form.tsx
tsx
01<form id="signup" onSubmit={onSubmit}>...</form>02 03{/* Button can live outside the form DOM */}04<button type="submit" form="signup">Submit</button>

Why AI-built apps hit form submit does nothing

AI-generated form code creates valid JSX and wires handlers that look correct in isolation. Failures come from context. A <button onClick=...> inside a <form> without type="submit" triggers a native submit, reloads the page, and cancels the click handler. A <button type="submit"> outside the form has no form to submit. A handler attached to onSubmit without e.preventDefault() works on the first click then reloads on the second.

The second class is silent validation. React Hook Form, Formik, and Zod default to blocking submit when validation fails. If the AI-generated code does not render the errors object to the user, the form feels broken. Click submit, nothing happens, no message. Fix: render validation errors somewhere the user can see them.

The third cause is the swallowed 500. The AI-generated handler wraps fetch in try/catch that logs to console and does nothing else. API returns 500. Catch block catches. User sees no feedback. In production where console.log is invisible, the form appears to do nothing. Fix: display errors (toast, inline), not just log them.

form submit does nothing by AI builder

How often each AI builder ships this error and the pattern that produces it.

AI builder × form submit does nothing
BuilderFrequencyPattern
LovableEvery form scaffoldBinds onClick to the button, not onSubmit to the form
Bolt.newCommonOmits e.preventDefault() in async handler
v0CommonButton inside a dropdown portal — escapes form DOM
CursorSometimesSwallows fetch errors in generic try/catch
Base44RareShips type='button' on the submit

Related errors we fix

Stop form submit does nothing recurring in AI-built apps

Still stuck with form submit does nothing?

Emergency triage · $299 · 48h turnaround
We restore service and write the root-cause report.
start the triage →

form submit does nothing questions

Why does clicking submit do nothing with no error in the console?+
Six common causes. Missing e.preventDefault() so the form submits as a native GET that reloads the page. The button is outside the form. onSubmit is wired to the form but never imported. Client validation silently blocks with no feedback. An API returning 500 with a caught exception that swallows the error. Or the form lives inside a modal portal that breaks ref chain. All six produce the same surface.
How do I tell which cause is mine in 30 seconds?+
Open DevTools Network tab. Click submit. Three things can happen: a request fires and returns an error (API or validation), a full page reload happens (preventDefault missing or server action redirecting), or absolutely nothing happens (handler not attached). Those three buckets cover every version of this bug.
What does preventDefault actually prevent?+
A native HTML form with a submit button tries to POST or GET to its action URL when submitted. React apps almost never want that — they want fetch, handle the response in state, show feedback without a page reload. Without preventDefault the form reloads the page to the action URL, which for most AI-built forms is the current route with no handler.
Why does the button work on desktop but not mobile?+
Usually a click-handler that relies on cursor hover state or a disabled attribute that only resolves on the second touch. Safari on iOS debounces clicks aggressively when a touchstart handler is present. Check the handler for dependency on pointer events vs touch events. react-hook-form, Formik, and the native form element handle this cleanly — hand-rolled submit logic is the usual culprit.
How long does this take to fix?+
Ten minutes for a single-cause bug once you have the Network tab open. The diagnosis is faster than the fix. For a form that fails for some users only, budget 30-60 minutes to catch a race condition or stale session. Emergency Triage at $299 is the right scope when the form stops mid-flow — user submits, row writes, and then nothing.
Next step

Ship the fix. Keep the fix.

Emergency Triage restores service in 48 hours. Break the Fix Loop rebuilds CI so this error cannot ship again.

About the author

Hyder Shah leads Afterbuild Labs, shipping production rescues for apps built in Lovable, Bolt.new, Cursor, Replit, v0, and Base44. our rescue methodology.

Sources