Skip to content

Commit 5f01b24

Browse files
sandranymarkcardosodougfabris
authored
fix(ux): Inline-Errors in LoginForm (#36469)
Co-authored-by: Matheus Cardoso <[email protected]> Co-authored-by: Douglas Fabris <[email protected]>
1 parent 5f6b887 commit 5f01b24

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

packages/web-ui-registration/src/LoginForm.tsx

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@ const LOGIN_SUBMIT_ERRORS = {
3333
type: 'danger',
3434
i18n: 'registration.page.login.errors.AppUserNotAllowedToLogin',
3535
},
36-
'user-not-found': {
37-
type: 'danger',
38-
i18n: 'registration.page.login.errors.wrongCredentials',
39-
},
4036
'error-login-blocked-for-ip': {
4137
type: 'danger',
4238
i18n: 'registration.page.login.errors.loginBlockedForIp',
@@ -64,13 +60,30 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute
6460
register,
6561
handleSubmit,
6662
setError,
63+
watch,
6764
clearErrors,
6865
getValues,
6966
formState: { errors },
7067
} = useForm<{ usernameOrEmail: string; password: string }>({
71-
mode: 'onBlur',
68+
mode: 'onSubmit',
69+
reValidateMode: 'onChange',
7270
});
7371

72+
const watchUsernameOrEmail = watch('usernameOrEmail');
73+
const watchPassword = watch('password');
74+
75+
useEffect(() => {
76+
if (watchUsernameOrEmail) {
77+
clearErrors('password');
78+
}
79+
}, [watchUsernameOrEmail, clearErrors]);
80+
81+
useEffect(() => {
82+
if (watchPassword) {
83+
clearErrors('usernameOrEmail');
84+
}
85+
}, [watchPassword, clearErrors]);
86+
7487
const { t } = useTranslation();
7588
const formLabelId = useId();
7689
const [errorOnSubmit, setErrorOnSubmit] = useState<LoginErrorState>(undefined);
@@ -88,16 +101,22 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute
88101
return login(formData.usernameOrEmail, formData.password);
89102
},
90103
onError: (error: any) => {
104+
if (error.error === 'user-not-found' || error.error === 401 || error.reason === 'User not found') {
105+
setError('password', {
106+
type: 'user-not-found',
107+
message: t('registration.page.login.errors.wrongCredentials'),
108+
});
109+
return;
110+
}
111+
91112
if ([error.error, error.errorType].includes('error-invalid-email')) {
92113
setError('usernameOrEmail', { type: 'invalid-email', message: t('registration.page.login.errors.invalidEmail') });
114+
return;
93115
}
94116

95117
if ('error' in error && error.error !== 403) {
96118
setErrorOnSubmit([error.error, error.reason]);
97-
return;
98119
}
99-
100-
setErrorOnSubmit(['user-not-found']);
101120
},
102121
});
103122

@@ -139,6 +158,8 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute
139158
return <EmailConfirmationForm onBackToLogin={() => clearErrors('usernameOrEmail')} email={getValues('usernameOrEmail')} />;
140159
}
141160

161+
const hasAuthError = errors.password?.type === 'user-not-found';
162+
142163
return (
143164
<Form
144165
tabIndex={-1}
@@ -164,14 +185,14 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute
164185
required: t('Required_field', { field: t('registration.component.form.emailOrUsername') }),
165186
})}
166187
placeholder={usernameOrEmailPlaceholder || t('registration.component.form.emailPlaceholder')}
167-
error={errors.usernameOrEmail?.message}
168-
aria-invalid={errors.usernameOrEmail || errorOnSubmit ? 'true' : 'false'}
188+
error={errors.usernameOrEmail?.message || (hasAuthError ? errors.password?.message : undefined)}
189+
aria-invalid={errors.usernameOrEmail || hasAuthError || errorOnSubmit ? 'true' : 'false'}
169190
aria-describedby={`${usernameId}-error`}
170191
id={usernameId}
171192
/>
172193
</FieldRow>
173194
{errors.usernameOrEmail && (
174-
<FieldError aria-live='assertive' id={`${usernameId}-error`}>
195+
<FieldError role='alert' id={`${usernameId}-error`}>
175196
{errors.usernameOrEmail.message}
176197
</FieldError>
177198
)}
@@ -193,7 +214,7 @@ export const LoginForm = ({ setLoginRoute }: { setLoginRoute: DispatchLoginRoute
193214
/>
194215
</FieldRow>
195216
{errors.password && (
196-
<FieldError aria-live='assertive' id={`${passwordId}-error`}>
217+
<FieldError role='alert' id={`${passwordId}-error`}>
197218
{errors.password.message}
198219
</FieldError>
199220
)}

0 commit comments

Comments
 (0)