From c0e34c2f72bfefdc0368bad804cef9a5075395f3 Mon Sep 17 00:00:00 2001 From: Timo Heman Date: Tue, 19 Jul 2022 20:58:35 +0100 Subject: [PATCH 1/2] add loading state on submit for login and signup --- src/pages/Login/Login.js | 41 ++++++++++++++++--------------- src/pages/Login/SignUp.js | 51 +++++++++++++++++++++------------------ 2 files changed, 49 insertions(+), 43 deletions(-) diff --git a/src/pages/Login/Login.js b/src/pages/Login/Login.js index 115fa7c..7cda364 100644 --- a/src/pages/Login/Login.js +++ b/src/pages/Login/Login.js @@ -7,15 +7,18 @@ const Login = ({ dispatch }) => { const [email, setEmail] = useState(); const [password, setPassword] = useState(); const [register, setRegister] = useState(false); + const [loading, setLoading] = useState(false); const handleLogin = async (e) => { e.preventDefault(); + setLoading(true); dispatch({ type: FetchState.FETCH_INIT }); try { await api.createSession(email, password); const data = await api.getAccount(); dispatch({ type: FetchState.FETCH_SUCCESS, payload: data }); } catch (e) { + setLoading(false); dispatch({ type: FetchState.FETCH_FAILURE }); } }; @@ -23,44 +26,44 @@ const Login = ({ dispatch }) => { return register ? ( ) : ( -
-
-

Login

-

+

+
+

Login

+

{" "} Don't have an account ?{" "} setRegister(true)} > Sign Up {" "}

- + setEmail(e.target.value)} - name="email" - autoComplete="email" + name='email' + autoComplete='email' /> - + setPassword(e.target.value)} - name="password" - autoComplete="password" + name='password' + autoComplete='password' /> -
+
diff --git a/src/pages/Login/SignUp.js b/src/pages/Login/SignUp.js index 44d7247..f9316d3 100644 --- a/src/pages/Login/SignUp.js +++ b/src/pages/Login/SignUp.js @@ -6,69 +6,72 @@ const SignUp = ({ setRegister, dispatch }) => { const [name, setName] = useState(); const [email, setEmail] = useState(); const [password, setPassword] = useState(); + const [loading, setLoading] = useState(false); const handleSignup = async (e) => { e.preventDefault(); + setLoading(true); dispatch({ type: FetchState.FETCH_INIT }); try { const user = await api.createAccount(email, password, name); await api.createSession(email, password); dispatch({ type: FetchState.FETCH_SUCCESS, payload: user }); } catch (e) { + setLoading(false); dispatch({ type: FetchState.FETCH_FAILURE }); } }; return ( <> -
-
-

Sign Up

-

+

+
+

Sign Up

+

{" "} Already have an account ?{" "} setRegister(false)} > Login {" "}

- + setName(e.target.value)} - name="name" - autoComplete="name" + name='name' + autoComplete='name' /> - + {/* “Don’t worry if it doesn’t work right. If everything did, you’d be out of a job.” */} setEmail(e.target.value)} - name="email" - autoComplete="email" + name='email' + autoComplete='email' /> - + setPassword(e.target.value)} - name="password" - autoComplete="password" + name='password' + autoComplete='password' /> -
+
From 3147578a9cb41180d9829554d2f2d27dd05bba95 Mon Sep 17 00:00:00 2001 From: Timo Heman Date: Thu, 21 Jul 2022 11:39:18 +0100 Subject: [PATCH 2/2] display error message for login and sign up form --- src/App.js | 22 +++++++++++++++------- src/hooks/index.js | 8 +++++++- src/pages/Login/Login.js | 12 +++++++++--- src/pages/Login/SignUp.js | 9 +++++++-- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/App.js b/src/App.js index 010cba1..36be6ab 100644 --- a/src/App.js +++ b/src/App.js @@ -6,21 +6,29 @@ import { useGetUser } from "./hooks"; function App() { // eslint-disable-next-line - const [{ user, isLoading, isError }, dispatch] = useGetUser(); + const [{ user, isLoading, isError, errorMessage }, dispatch] = useGetUser(); return ( - - {user ? : } + + {user ? ( + + ) : ( + + )} - - {user ? : } + + {user ? ( + + ) : ( + + )} - + - + ); diff --git a/src/hooks/index.js b/src/hooks/index.js index 5f6c6d5..08eadba 100644 --- a/src/hooks/index.js +++ b/src/hooks/index.js @@ -68,7 +68,12 @@ export const useGetUser = () => { user: action.payload, }; case FetchState.FETCH_FAILURE: - return { ...state, isLoading: false, isError: true }; + return { + ...state, + isLoading: false, + isError: true, + errorMessage: action.payload?.message, + }; default: throw new Error(); } @@ -77,6 +82,7 @@ export const useGetUser = () => { const [state, dispatch] = useReducer(reducer, { isLoading: false, isError: true, + errorMessage: null, data: [], }); diff --git a/src/pages/Login/Login.js b/src/pages/Login/Login.js index 7cda364..c8f6be7 100644 --- a/src/pages/Login/Login.js +++ b/src/pages/Login/Login.js @@ -3,7 +3,7 @@ import api from "../../api/api"; import SignUp from "./SignUp"; import { FetchState } from "../../hooks"; -const Login = ({ dispatch }) => { +const Login = ({ dispatch, error }) => { const [email, setEmail] = useState(); const [password, setPassword] = useState(); const [register, setRegister] = useState(false); @@ -19,12 +19,16 @@ const Login = ({ dispatch }) => { dispatch({ type: FetchState.FETCH_SUCCESS, payload: data }); } catch (e) { setLoading(false); - dispatch({ type: FetchState.FETCH_FAILURE }); + console.log(e.message); + dispatch({ + type: FetchState.FETCH_FAILURE, + payload: { message: e.message }, + }); } }; return register ? ( - + ) : (
@@ -57,6 +61,8 @@ const Login = ({ dispatch }) => { autoComplete='password' /> +

{error} 

+