@@ -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