diff --git a/src/contexts/Auth/AuthState.jsx b/src/contexts/Auth/AuthState.jsx index fd3694299bdb0b4a657fc9ec7f4637b1e1b14ea1..3fa34b50f8597e53ea3d7dc44e82bbff7a54a409 100755 --- a/src/contexts/Auth/AuthState.jsx +++ b/src/contexts/Auth/AuthState.jsx @@ -26,11 +26,22 @@ function AuthState({ children }) { // ### LOGIN async function login(credentials) { - const result = await api.post( - '/users/login', - credentials, - { withCredentials: true } - ); + let result = {}; + try { + result = await api.post( + '/users/login', + credentials, + { withCredentials: true } + ); + } catch (error) { + result = await api.post( + '/users/adminlogin', + credentials, + { withCredentials: true } + ); + // try to match output with normal user + result.data.record = { ...result.data.admin, isAdmin: true }; + } // set current user to login and merge accessToken into currentUser dispatchCurrentUser({ type: USER_ACTIONS.SET, payload: { ...result.data.record } }); setAccessToken(result.data.token); diff --git a/src/pages/User/Login.jsx b/src/pages/User/Login.jsx index d8d73a6ea4285808c4c2197677727ea5dba22016..0dbd5c024e9238ce3dd13d8c4d838b22ea8908e1 100644 --- a/src/pages/User/Login.jsx +++ b/src/pages/User/Login.jsx @@ -34,7 +34,7 @@ function Login() { // ### PREPARE FORM const methods = useForm({ resolver: zodResolver(schema), - mode: 'onBlur', + mode: 'onSubmit', defaultValues: { email: '', password: '' @@ -106,7 +106,7 @@ function Login() { <div className="mt-4 flex justify-between"> <Link to="/reset_password">Reset Password</Link> - <Link to="/signup">Create an account</Link> + <Link to="/signup">Create account</Link> </div> </> ); diff --git a/src/pages/User/ResetPassword.jsx b/src/pages/User/ResetPassword.jsx index 1950c9c7189f7ac947421156e54e837ef25150f4..29d006714e320e0600867e81b46eee12fa1eb3b7 100644 --- a/src/pages/User/ResetPassword.jsx +++ b/src/pages/User/ResetPassword.jsx @@ -38,7 +38,7 @@ function ResetPasswordForm() { // ### PREPARE FORM const methods = useForm({ resolver: zodResolver(schema), - mode: 'onBlur', + mode: 'onSubmit', defaultValues: { token: token, } diff --git a/src/pages/User/Signup.jsx b/src/pages/User/Signup.jsx index 9823a68a1f1178bafaed90b710025b5a6a28c02d..d3eb5da3c879e7b26f774a3b33f07a61526999ce 100644 --- a/src/pages/User/Signup.jsx +++ b/src/pages/User/Signup.jsx @@ -43,7 +43,7 @@ function Signup() { // ### PREPARE FORM const methods = useForm({ resolver: zodResolver(schema), - mode: 'onBlur', + mode: 'onSubmit', defaultValues: { name: '', username: '', diff --git a/src/utils/AxiosConfig.js b/src/utils/AxiosConfig.js index 7e9e6a7e011d239f87a4314a14b8367a82d7dcec..a32332c37ae7dc569943fa64148851687d4b3f15 100755 --- a/src/utils/AxiosConfig.js +++ b/src/utils/AxiosConfig.js @@ -29,40 +29,21 @@ api.interceptors.request.use( // ### RESPONSE INTERCEPTOR // refreshes accessToken if needed api.interceptors.response.use( - (res) => { - return res; - }, - async (err) => { - // console.log('JWT error: ', err); - // save original request config - const originalConfig = err.config; - // if access denied and not a retry already - // BUG: Infinit loop because _retry isn't set at runtime - // console.log('originalConfig: ',originalConfig); - // console.log('originalConfig: ',JSON.stringify(originalConfig)); - if (originalConfig && err?.response?.status === 403 && originalConfig._retry !== true) { - // patch config to remember it's a retry - originalConfig._retry = true; - console.log('trying to refresh the accessToken and rerun the request'); - // console.log('retry', err.code, originalConfig._retry); - // refresh access token - try { - const result = await api.get( + async (res) => { + switch (res.config.url) { + case '/users/refreshjwt': + case '/users/logout': + case '/users/login': + return res; + default: + const refresh = await api.get( '/users/refreshjwt', {}, { withCredentials: true } ); - // TODO: don't store accessToken in localStorage, keep in memory only - localStorage.setItem("accessToken", JSON.stringify(result.data.accessToken)); - // run retry - return api(originalConfig); - - } catch (error) { - return Promise.reject(error); - } + localStorage.setItem("accessToken", JSON.stringify(refresh.data.token)); + return res; } - return Promise.reject(err); - } );