diff --git a/src/api/user.ts b/src/api/user.ts index 71ccf84..7c0a382 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -19,5 +19,5 @@ export const loginAPI = async (email: string, password: string) => { email, password, }); - response.data; + return response.data; }; diff --git a/src/components/LoginPage/LoginPage.tsx b/src/components/LoginPage/LoginPage.tsx index f9807de..0803ec5 100755 --- a/src/components/LoginPage/LoginPage.tsx +++ b/src/components/LoginPage/LoginPage.tsx @@ -1,16 +1,19 @@ import SpinnerLogin from "../SpinnerLogin"; -import React, { useEffect, useState } from "react"; -import env from "../../enviroment/envFrontEnd"; -import { getUserAPI } from "../../api/user"; +import React, { useEffect, useMemo, useState } from "react"; +import { getUserAPI, loginAPI } from "../../api/user"; import { useLocation, useNavigate } from "react-router-dom"; import { setUser } from "../../reducers/user"; import { useAppDispatch } from "../../hooks/store"; +import { capitalize } from "lodash"; +import AlertIcon from "../../icons/AlertIcon"; -const LoginPage = (props) => { +const LoginPage = () => { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [verifyPassword, setVerifyPassword] = useState(""); + const [mode, setMode] = useState<"login" | "create" | "reset">("login"); const [attemptingLogin, setAttemptingLogin] = useState(false); + const [loginExpired, setLoginExpired] = useState(false); const dispatch = useAppDispatch(); const location = useLocation(); const navigate = useNavigate(); @@ -35,10 +38,56 @@ const LoginPage = (props) => { } catch (e) { console.log("Login Error", e); setAttemptingLogin(false); + if (window.localStorage.getItem("hasPreviouslyLoggedIn")) { + setLoginExpired(true); + } } }; - const onSubmit = () => {}; + const login = async () => { + try { + const loginResponse = await loginAPI(email, password); + console.log("login response", loginResponse); + window.localStorage.setItem("hasPreviouslyLoggedIn", "true"); + dispatch(setUser(loginResponse)); + navigate("/home"); + } catch (e) { + console.log("Login Error", e); + } + }; + + const isSubmitDisabled = useMemo(() => { + switch (mode) { + case "login": + return !email || !password; + case "create": + return !email || !password || !verifyPassword; + case "reset": + return !email; + default: + return false; + } + }, [email, password, verifyPassword, mode]); + + const onSubmit = (e: any) => { + e.preventDefault(); + if (mode === "login") { + login(); + } + }; + + const headerTitle = useMemo(() => { + switch (mode) { + case "login": + return "Login to your account"; + case "create": + return "Create an account"; + case "reset": + return "Reset Password"; + default: + return "Login to your account"; + } + }, [mode]); useEffect(() => { attemptLoginWithToken(); @@ -58,103 +107,102 @@ const LoginPage = (props) => { return (
-
-
-
-
- logo -
- - {/* */} -
-

- {props.state.loginMode - ? "Login to your account" - : "Create an account"} -

-
-
- setEmail(e.target.value)} - value={email} - /> -
- {!props.state.resetPasswordMode ? ( -
- setPassword(e.target.value)} - value={password} - /> - {props.state.loginMode ? ( - Forgot? - ) : undefined} -
- ) : undefined} - {props.state.loginMode ? undefined : ( -
- setVerifyPassword(e.target.value)} - value={verifyPassword} - /> -
- )} -
- -
- - {!props.state.resetPasswordMode ? ( -
- {props.state.loginMode ? ( -

- Don't have an account?{" "} - Create account -

- ) : ( -

- Back to Login -

- )} -
- ) : ( -
-

- Back to{" "} - Login -

-
- )} - - {props.loginFailed && ( -
- -

{props.loginFailed}

-
- )} -
+
+
+
+
+ logo
+
+

+ {headerTitle} +

+ {/* Email Address */} + setEmail(e.target.value)} + value={email} + /> + + {/* Password */} + {(mode === "login" || mode === "create") && ( +
+ setPassword(e.target.value)} + value={password} + /> + {mode === "login" && ( + + )} +
+ )} + + {/* Verify Password */} + {mode === "create" && ( + setVerifyPassword(e.target.value)} + value={verifyPassword} + /> + )} + +
+ +
+ +
+ {mode === "login" && ( +

+ Don't have an account?{" "} + setMode("create")} + className="text-[#3c85ee] text-[15px] font-medium no-underline" + > + Create account + +

+ )} + {(mode === "create" || mode === "reset") && ( +

+ Back to{" "} + setMode("login")} + className="text-[#3c85ee] text-[15px] font-medium no-underline" + > + Login + +

+ )} +
+ {loginExpired && ( +
+
+ +

Login expired

+
+
+ )} +
diff --git a/src/icons/AlertIcon.tsx b/src/icons/AlertIcon.tsx new file mode 100644 index 0000000..9c64752 --- /dev/null +++ b/src/icons/AlertIcon.tsx @@ -0,0 +1,15 @@ +type AlertIconType = React.SVGAttributes; + +const AlertIcon: React.FC = (props) => { + return ( + + alert-circle + + + ); +}; + +export default AlertIcon;