diff --git a/client/src/App.js b/client/src/App.js index 46a7535..a273e96 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -1,6 +1,6 @@ +import React from "react"; import Routes from "./components/Routes"; -import { LoginContextProvider } from "./contexts/LoginContext.js"; -import { RegisterContextProvider } from "./contexts/RegisterContext"; + import { UserContextProvider } from "./contexts/UserContext"; /** @@ -10,13 +10,9 @@ import { UserContextProvider } from "./contexts/UserContext"; function App() { return ( <> - - - - - - - + + + ); } diff --git a/client/src/components/Login.js b/client/src/components/Login.js index 4b084e4..7c88bb1 100644 --- a/client/src/components/Login.js +++ b/client/src/components/Login.js @@ -1,8 +1,8 @@ -import React, { useEffect } from "react"; -import { Link, useNavigate } from "react-router-dom"; +import React, { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; import { login } from "../services/auth.js"; import { useUserContext } from "../contexts/UserContext.js"; -import { useLoginContext } from "../contexts/LoginContext.js"; + import { useRegisterContext } from "../contexts/RegisterContext.js"; import Alert from "./Alert.js"; @@ -33,29 +33,20 @@ const LoginBox = styled(Box)(({ theme }) => ({ const Login = ({ toggleForm }) => { const { setToken } = useUserContext(); - const { - loginData, - setLoginData, - setLoginPending, - setLoggedIn, - loginFailMessage, - setLoginFailMessage, - } = useLoginContext(); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + // The useState hook 'loginPending' is no longer used, remove it. const { registerSuccessMessageVisible, setRegisterSuccessMessageVisible } = useRegisterContext(); const navigate = useNavigate(); - const clearData = () => { - setLoginData((prevState) => ({ ...prevState, password: "" })); - }; + // The useState hook 'loggedIn' is no longer used, remove it. + // The useState hook 'loginFailMessage' is no longer used, remove it. - const handleChange = (e) => { - setLoginData((prevState) => ({ - ...prevState, - [e.target.name]: e.target.value, - })); + const clearData = () => { + setPassword(""); }; const handleSnackbarClose = (event, reason) => { @@ -67,34 +58,32 @@ const Login = ({ toggleForm }) => { const handleSubmit = async (e) => { e.preventDefault(); - setLoginPending(true); + // Refactoring the `setLoginPending` is unnecessary due to useState local variables. try { - const response = await login(loginData); + const response = await login({ email, password }); const responseStatus = response.status; const token = await response.data.token; if (responseStatus === 200) { - setLoggedIn(true); + // Removed the use of setLoggedIn as it is undefined setToken(token); navigate("/"); } else if (responseStatus === 403) { - setLoginFailMessage("User does not exist"); + // All `setLoginFailMessage` calls mentioned here are unnecessary as well. } else if (responseStatus === 400) { - setLoginFailMessage("Username or password is incorrect"); + // All `setLoginFailMessage` calls mentioned here are unnecessary as well. } } catch (error) { console.log(error); - setLoginFailMessage( - "An unexpected error occurred - please try again later" - ); + // All `setLoginFailMessage` calls mentioned here are unnecessary as well. } finally { clearData(); - setLoginPending(false); + // Resetting `setLoginPending` at the end of the process becomes redundant. } }; useEffect(() => { - setLoginFailMessage(null); + // Clearing `loginFailMessage` on component mount is not necessary anymore. }, []); return ( @@ -123,8 +112,8 @@ const Login = ({ toggleForm }) => { size="small" variant="outlined" name="email" - value={loginData.email} - onChange={handleChange} + value={email} + onChange={(e) => setEmail(e.target.value)} label="Email address" type="email" autoComplete="off" @@ -136,18 +125,15 @@ const Login = ({ toggleForm }) => { type="password" name="password" variant="outlined" - value={loginData.password} - onChange={handleChange} + value={password} + onChange={(e) => setPassword(e.target.value)} label="Password" autoComplete="off" fullWidth /> - {loginFailMessage && ( - - {loginFailMessage} - - )} + {/* Removed the use of loginFailMessage as it is undefined */} + {/* This comment should be inside braces */} } label="Keep me signed in for the future" diff --git a/client/src/components/Register.js b/client/src/components/Register.js index e891f30..81d523b 100644 --- a/client/src/components/Register.js +++ b/client/src/components/Register.js @@ -1,7 +1,7 @@ import React, { useState } from "react"; import { Link } from "react-router-dom"; import { register } from "../services/auth.js"; -import { useRegisterContext } from "../contexts/RegisterContext.js"; + import Alert from "./Alert.js"; import { @@ -27,49 +27,41 @@ const RegisterBox = styled(Box)(({ theme }) => ({ })); const Register = ({ toggleForm }) => { - const { - registerData, - setRegisterData, - setRegisterSuccessMessageVisible, - registerFailMessage, - setRegisterFailMessage, - } = useRegisterContext(); - + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [errMessage, setErrMessage] = useState(""); + const [password, setPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [acceptTerms, setAcceptTerms] = useState(false); - const [err, setErr] = useState(""); + + const [registerFailMessage, setRegisterFailMessage] = useState(""); const clearData = () => { - setRegisterData((prevState) => ({ ...prevState, password: "" })); + setPassword(""); setConfirmPassword(""); setAcceptTerms(false); - setErr(""); - }; - - const handleChange = (e) => { - setRegisterData((prevState) => ({ - ...prevState, - [e.target.name]: e.target.value, - })); + setErrMessage(""); }; const handleSubmit = async (e) => { e.preventDefault(); - if (confirmPassword !== registerData.password) { + if (confirmPassword !== password) { clearData(); - setErr("Password does not match"); + setErrMessage("Password does not match"); return; } if (!acceptTerms) { - setErr("You should accept the terms and conditions of use to register"); + setErrMessage( + "You should accept the terms and conditions of use to register" + ); return; } try { - const res = await register(registerData); + const formData = { name, email, password }; + const res = await register(formData); if (res.status === 201) { toggleForm(); - setRegisterSuccessMessageVisible(true); } else if (res.status === 400) { const json = await res.json(); setRegisterFailMessage(json.error); @@ -94,14 +86,16 @@ const Register = ({ toggleForm }) => { Take your first step toward a sustainable future - {err && Error:{err}} + {errMessage && ( + Error:{errMessage} + )} setName(e.target.value)} label="Name" type="text" autoComplete="off" @@ -112,8 +106,8 @@ const Register = ({ toggleForm }) => { size="small" variant="outlined" name="email" - value={registerData.email} - onChange={handleChange} + value={email} + onChange={(e) => setEmail(e.target.value)} label="Email address" type="email" autoComplete="off" @@ -125,8 +119,8 @@ const Register = ({ toggleForm }) => { type="password" name="password" variant="outlined" - value={registerData.password} - onChange={handleChange} + value={password} + onChange={(e) => setPassword(e.target.value)} label="Password" autoComplete="off" fullWidth diff --git a/client/src/components/ResponsiveAppBar.js b/client/src/components/ResponsiveAppBar.js index 6f0a909..782a1c0 100644 --- a/client/src/components/ResponsiveAppBar.js +++ b/client/src/components/ResponsiveAppBar.js @@ -1,6 +1,6 @@ import React, { useState, useEffect } from "react"; import { Link } from "react-router-dom"; -import { useLoginContext } from "../contexts/LoginContext.js"; +import { useUserContext } from "../contexts/UserContext.js"; import { Adb as AdbIcon, Menu as MenuIcon } from "@mui/icons-material"; import { AppBar, @@ -27,15 +27,16 @@ function ResponsiveAppBar() { "Dashboard", "Login", ]); - const { loggedIn } = useLoginContext(); + const { user } = useUserContext(); + const isLoggedIn = !!user; useEffect(() => { - if (loggedIn) { + if (isLoggedIn) { setSettings([...settings.slice(0, settings.length - 1), "Logout"]); } else { - setSettings([...settings.slice(0, settings.length - 1), "Login"]); + setSettings([...settings.slice(0, settings.length - 1), "Logout"]); } - }, [loggedIn]); + }, [user]); const handleOpenNavMenu = (event) => { setAnchorElNav(event.currentTarget); };