Every form I ever shipped before React 19 needed the same three pieces of state, and I wired them up by hand every single time.
One for the result. One for whether it's submitting. One for the error. And at least once a sprint, I'd forget to reset one of them in the right place and spend twenty minutes staring at a button that wouldn't re-enable.
Here's the version I wrote for years, probably the same one you have sitting in a dozen components right now:
function OldSignupForm() {
const [error, setError] = useState(null);






