From 5d8743fb29e807ba9bbe4eac121991179ec73dbb Mon Sep 17 00:00:00 2001 From: "Adolfo R. Brandes" Date: Fri, 6 Mar 2026 19:04:28 -0300 Subject: [PATCH] fix: use functional state updater in validateInput to prevent stale closure validateInput was directly mutating the formErrors state object and then spreading it. When handleSubmit called validateInput twice in succession, the second call operated on stale closure values because React batches state updates. Also fixed handleOnFocus for the same issue. Co-Authored-By: Claude Opus 4.6 --- src/reset-password/ResetPasswordPage.jsx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/reset-password/ResetPasswordPage.jsx b/src/reset-password/ResetPasswordPage.jsx index 2cbe3d3b..fc6cc516 100644 --- a/src/reset-password/ResetPasswordPage.jsx +++ b/src/reset-password/ResetPasswordPage.jsx @@ -93,28 +93,27 @@ const ResetPasswordPageInner = () => { }; const validateInput = (name, value) => { + let fieldError = ''; switch (name) { case 'newPassword': if (!value || !LETTER_REGEX.test(value) || !NUMBER_REGEX.test(value) || value.length < 8) { - formErrors.newPassword = formatMessage(messages['password.validation.message']); + fieldError = formatMessage(messages['password.validation.message']); } else { validatePasswordFromBackend(value); } break; case 'confirmPassword': if (!value) { - formErrors.confirmPassword = formatMessage(messages['confirm.your.password']); + fieldError = formatMessage(messages['confirm.your.password']); } else if (value !== newPassword) { - formErrors.confirmPassword = formatMessage(messages['passwords.do.not.match']); - } else { - formErrors.confirmPassword = ''; + fieldError = formatMessage(messages['passwords.do.not.match']); } break; default: break; } - setFormErrors({ ...formErrors }); - return !Object.values(formErrors).some(x => (x !== '')); + setFormErrors((prev) => ({ ...prev, [name]: fieldError })); + return !fieldError; }; const handleOnBlur = (event) => { @@ -130,7 +129,7 @@ const ResetPasswordPageInner = () => { }; const handleOnFocus = (e) => { - setFormErrors({ ...formErrors, [e.target.name]: '' }); + setFormErrors((prev) => ({ ...prev, [e.target.name]: '' })); }; const handleSubmit = (e) => {