diff --git a/frontend/src/components/AuthenticatedRoute.jsx b/frontend/src/components/AuthenticatedRoute.jsx index 9d7b5bc..5626f9a 100644 --- a/frontend/src/components/AuthenticatedRoute.jsx +++ b/frontend/src/components/AuthenticatedRoute.jsx @@ -12,7 +12,7 @@ const AuthenticatedRoute = ({ children, isAuthenticated }) => { } else if (!isAuthenticated && currentUser?.id) { setLocation("/"); } - }, [currentUser]); + }, [currentUser, setLocation, isAuthenticated]); return children; }; diff --git a/frontend/src/pages/LoginPage.jsx b/frontend/src/pages/LoginPage.jsx index 5f55e96..89b2cf0 100644 --- a/frontend/src/pages/LoginPage.jsx +++ b/frontend/src/pages/LoginPage.jsx @@ -3,7 +3,7 @@ import { Button, Col, Container, Form, Row, Alert } from "react-bootstrap"; import { Link, useLocation } from "wouter"; import MyNavbar from "../components/MyNavbar"; import UserContext from "../contexts/UserContext"; -import { makeRequest } from "../utils.ts"; +import { sendLogoutRequest, sendLoginRequest } from "../utils.ts"; const LoginPage = () => { const [username, setUsername] = useState(""); @@ -15,29 +15,28 @@ const LoginPage = () => { useEffect(() => { if (currentUser?.id) { - gotoHome(); + setLocation("/"); } - }, [currentUser]); + }, [currentUser, setLocation]); - const gotoHome = () => { - setLocation("/"); - }; - - const sendLoginRequest = async (e) => { + const formCb = async (e) => { e?.preventDefault(); - await makeRequest({ - url: "http://localhost:5000/login", - method: "POST", - body: { username, password }, - }) - .then((resp) => resp.json()) - .then((data) => { - if (data.error) { - setError(data); - return; - } - setCurrentUser(data); - }); + const res = await sendLoginRequest(username, password); + + if (res?.isError) { + if (res.message.includes("already")) { + setError({ + ...res, + message: "An error occured. Try logging in again.", + }); + await sendLogoutRequest(); + return; + } + setError(res); + return; + } + setCurrentUser(res); + setLocation("/"); }; return ( @@ -53,7 +52,7 @@ const LoginPage = () => { )}

Login


-
+ Username diff --git a/frontend/src/pages/LogoutPage.jsx b/frontend/src/pages/LogoutPage.jsx index 8512700..afcaa46 100644 --- a/frontend/src/pages/LogoutPage.jsx +++ b/frontend/src/pages/LogoutPage.jsx @@ -3,23 +3,18 @@ import { useContext, useEffect } from "react"; import { Container } from "react-bootstrap"; import MyNavbar from "../components/MyNavbar"; import UserContext from "../contexts/UserContext"; -import { makeRequest } from "../utils.ts"; +import { sendLogoutRequest } from "../utils.ts"; const LogoutPage = () => { const { setCurrentUser } = useContext(UserContext); useEffect(() => { - const cleanup = async () => { - await makeRequest({ - url: "http://localhost:5000/logout", - method: "POST", - }); - + (async () => { + await sendLogoutRequest(); await setCurrentUser({}); localStorage.removeItem("currentUser"); window.location.href = "/login"; - }; - cleanup(); - }, []); + })(); + }, [setCurrentUser]); return ( diff --git a/frontend/src/utils.ts b/frontend/src/utils.ts index c7b116f..5daef16 100644 --- a/frontend/src/utils.ts +++ b/frontend/src/utils.ts @@ -1,4 +1,4 @@ -const makeRequest = ({ url, method, body }): Promise => { +const makeRequest = ({ url, method, body = {} }): Promise => { return fetch(url, { method: method, credentials: "include", @@ -8,4 +8,41 @@ const makeRequest = ({ url, method, body }): Promise => { }); }; -export { makeRequest }; +const sendLoginRequest = async ( + username: string, + password: string +): Promise => { + const p: Promise = new Promise(async (res) => { + await makeRequest({ + url: "http://localhost:5000/login", + method: "POST", + body: { username, password }, + }) + .then((resp) => resp.json()) + .then((data) => { + if (data.error) { + res({ isError: true, ...data }); + } + res({ isError: false, ...data }); + }); + res({ isError: true }); + }); + return p; +}; + +const sendLogoutRequest = async (): Promise => { + const p: Promise = new Promise(async (res) => { + await makeRequest({ + url: "http://localhost:5000/logout", + method: "POST", + }) + .then((resp) => resp.json()) + .then((data) => { + res({ isError: false, ...data }); + }); + res({ isError: true }); + }); + return p; +}; + +export { makeRequest, sendLoginRequest, sendLogoutRequest };