diff --git a/client/modules/User/components/SignupForm.jsx b/client/modules/User/components/SignupForm.jsx index d3e6129461..d70dc4e6e0 100644 --- a/client/modules/User/components/SignupForm.jsx +++ b/client/modules/User/components/SignupForm.jsx @@ -18,7 +18,7 @@ function asyncValidate(fieldToValidate, value) { const queryParams = { [fieldToValidate]: value, - check_type: fieldToValidate + check_type: fieldToValidate, }; return new Promise((resolve) => { @@ -66,8 +66,7 @@ function SignupForm() { useSyncFormTranslations(formRef, i18n.language); const handleVisibility = () => setShowPassword(!showPassword); - const handleConfirmVisibility = () => - setShowConfirmPassword(!showConfirmPassword); + const handleConfirmVisibility = () => setShowConfirmPassword(!showConfirmPassword); function onSubmit(formProps) { return dispatch(validateAndSignUpUser(formProps)); @@ -86,7 +85,7 @@ function SignupForm() { {(field) => (
@@ -110,7 +109,11 @@ function SignupForm() {
)}
- + {(field) => (
{field.meta.touched && field.meta.error && ( @@ -179,7 +178,7 @@ function SignupForm() { className="form__input" type={showConfirmPassword ? 'text' : 'password'} aria-label={t('SignupForm.ConfirmPasswordARIA')} - id="confirmPassword" // Match the id with htmlFor + id="confirmPassword" autoComplete="new-password" {...field.input} /> @@ -189,11 +188,7 @@ function SignupForm() { onClick={handleConfirmVisibility} aria-hidden="true" > - {showConfirmPassword ? ( - - ) : ( - - )} + {showConfirmPassword ? : } {field.meta.touched && field.meta.error && ( diff --git a/client/utils/reduxFormUtils.js b/client/utils/reduxFormUtils.js index 085e37cae7..97e74f59db 100644 --- a/client/utils/reduxFormUtils.js +++ b/client/utils/reduxFormUtils.js @@ -1,5 +1,6 @@ /* eslint-disable */ import i18n from 'i18next'; + export const domOnlyProps = ({ initialValue, autofill, @@ -23,20 +24,20 @@ const EMAIL_REGEX = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+")) function validateNameEmail(formProps, errors) { if (!formProps.username) { - errors.username = i18n.t('ReduxFormUtils.errorEmptyUsername'); + errors.username = errors.username || i18n.t('ReduxFormUtils.errorEmptyUsername'); } else if (!formProps.username.match(/^.{1,20}$/)) { - errors.username = i18n.t('ReduxFormUtils.errorLongUsername'); + errors.username = errors.username || i18n.t('ReduxFormUtils.errorLongUsername'); } else if (!formProps.username.match(/^[a-zA-Z0-9._-]{1,20}$/)) { - errors.username = i18n.t('ReduxFormUtils.errorValidUsername'); + errors.username = errors.username || i18n.t('ReduxFormUtils.errorValidUsername'); } if (!formProps.email) { - errors.email = i18n.t('ReduxFormUtils.errorEmptyEmail'); + errors.email = errors.email || i18n.t('ReduxFormUtils.errorEmptyEmail'); } else if ( // eslint-disable-next-line max-len !formProps.email.match(EMAIL_REGEX) ) { - errors.email = i18n.t('ReduxFormUtils.errorInvalidEmail'); + errors.email = errors.email || i18n.t('ReduxFormUtils.errorInvalidEmail'); } } @@ -96,14 +97,16 @@ export function validateNewPassword(formProps) { return errors; } -export function validateSignup(formProps) { - const errors = {}; +export function validateSignup(formProps, existingErrors = {}) { + // Merge existing errors (could be from async validation) to preserve them + const errors = { ...existingErrors }; validateNameEmail(formProps, errors); validatePasswords(formProps, errors); return errors; } + export function validateResetPassword(formProps) { const errors = {}; if (!formProps.email) {