Implement working login/logout functionality

This commit is contained in:
Curt Spark 2024-04-24 15:09:06 +01:00
parent 3efc8ba4fa
commit 7a91cde278
5 changed files with 125 additions and 18 deletions

View File

@ -7,42 +7,67 @@ import NavbarUserInfo from "./components/NavbarUserInfo.tsx";
import Home from "./pages/Home.tsx"; import Home from "./pages/Home.tsx";
import Login from "./pages/Login.tsx"; import Login from "./pages/Login.tsx";
import Logout from "./pages/Logout.tsx";
import About from "./pages/About.tsx"; import About from "./pages/About.tsx";
import { import {
usernameStorageHandlerInit, usernameStorageHandlerInit,
authTokenStorageHandlerInit, authTokenStorageHandlerInit,
userIDStorageHandlerInit,
} from "./components/storageHandler.ts"; } from "./components/storageHandler.ts";
export default function App() { function getUserIDbyAuthToken(
const usernameStorageHandler = usernameStorageHandlerInit(); authTokenStorageHandler: object,
const authTokenStorageHandler = authTokenStorageHandlerInit(); userIDStorageHandler: object,
) {
if (
authTokenStorageHandler.authTokenValue &&
!userIDStorageHandler.userIDValue
) {
fetch("http://127.0.0.1:8000/api/userIDByAuthToken", {
method: "GET",
headers: {
"Content-Type": "application/json",
authToken: authTokenStorageHandler.authTokenValue,
},
})
.then((response) => response.json())
.then((responseParsed: Object) => {
console.log(responseParsed);
if (responseParsed.success) {
userIDStorageHandler.setUserIDValue(responseParsed.userID);
}
});
}
}
function testUserButton() { function testUserButton() {
return usernameStorageHandler.usernameValue ? "" : "Test User"; return usernameStorageHandler.usernameValue ? "" : "Test User";
} }
export default function App() {
const usernameStorageHandler = usernameStorageHandlerInit();
const authTokenStorageHandler = authTokenStorageHandlerInit();
const userIDStorageHandler = userIDStorageHandlerInit();
getUserIDbyAuthToken(authTokenStorageHandler, userIDStorageHandler);
return ( return (
<> <>
<BrowserRouter> <BrowserRouter>
<Navbar> <Navbar>
<NavbarButton>Home</NavbarButton> <NavbarButton>Home</NavbarButton>
<NavbarButton>About</NavbarButton> <NavbarButton>About</NavbarButton>
{usernameStorageHandler.usernameValue ? ( {userIDStorageHandler.userIDValue ? (
<>
<NavbarUserInfo <NavbarUserInfo
username={"Logged in as " + usernameStorageHandler.usernameValue} userID={userIDStorageHandler.userIDValue}
></NavbarUserInfo> ></NavbarUserInfo>
<NavbarButton>Logout</NavbarButton>
</>
) : ( ) : (
<NavbarButton>Login</NavbarButton> <NavbarButton>Login</NavbarButton>
)} )}
<button
onClick={() =>
usernameStorageHandler.setUsernameValue(testUserButton())
}
className="navBarItem navBarItemText"
>
Click me!
</button>
</Navbar> </Navbar>
<div id="page"> <div id="page">
<Routes> <Routes>
@ -50,6 +75,7 @@ export default function App() {
<Route path="/home" exact element={<Home></Home>} /> <Route path="/home" exact element={<Home></Home>} />
<Route path="/about" exact element={<About></About>} /> <Route path="/about" exact element={<About></About>} />
<Route path="/login" exact element={<Login></Login>} /> <Route path="/login" exact element={<Login></Login>} />
<Route path="/logout" exact element={<Logout></Logout>} />
</Routes> </Routes>
</div> </div>
</BrowserRouter> </BrowserRouter>

View File

@ -1,13 +1,39 @@
import * as React from "react"; import * as React from "react";
import { usernameStorageHandlerInit } from "../components/storageHandler.ts";
interface Props { interface Props {
username: string; userID: number;
} }
export default function NavbarUserInfo({ username }: Props) { /* Implement checking whether userInfo name etc reaches a certain character size, if it does then we'll split the string and add ... to the end instead*/
export default function NavbarUserInfo({ userID }: Props) {
const usernameStorageHandler = usernameStorageHandlerInit();
if (!usernameStorageHandler.usernameValue) {
fetch("http://127.0.0.1:8000/api/publicInfo/" + userID.toString(), {
method: "GET",
headers: {
"Content-Type": "application/json",
},
})
.then((response) => response.json())
.then((responseParsed: Object) => {
console.log(responseParsed);
if (responseParsed.success) {
usernameStorageHandler.setUsernameValue(responseParsed.username);
}
});
}
return ( return (
<> <>
<p className="navBarItem navBarItemText">{username}</p> {usernameStorageHandler.usernameValue ? (
<p className="navBarItem navBarItemText">
{usernameStorageHandler.usernameValue}
</p>
) : (
<p className="navBarItem navBarItemText">Unknown User Logged In!</p>
)}
</> </>
); );
} }

View File

@ -8,6 +8,7 @@ Or could simply stop using react hooks for this role
It appears to work for now so will leave be It appears to work for now so will leave be
Confirmed that react cannot currently find and update DOM elements in other files. This will need to be changed Confirmed that react cannot currently find and update DOM elements in other files. This will need to be changed
For now when changing these values (Logging in etc) I just refresh the page
*/ */
export const usernameStorageHandlerInit = () => { export const usernameStorageHandlerInit = () => {
@ -21,6 +22,17 @@ export const usernameStorageHandlerInit = () => {
}; };
}; };
export const userIDStorageHandlerInit = () => {
const [userIDValue, setUserIDValue, deleteUserIDValue] =
useLocalStorage("userID");
return {
userIDValue,
setUserIDValue,
deleteUserIDValue,
};
};
export const authTokenStorageHandlerInit = () => { export const authTokenStorageHandlerInit = () => {
const [authTokenValue, setAuthTokenValue, deleteAuthTokenValue] = const [authTokenValue, setAuthTokenValue, deleteAuthTokenValue] =
useLocalStorage("authtoken"); useLocalStorage("authtoken");

View File

@ -1,4 +1,5 @@
import * as React from "react"; import * as React from "react";
import { Navigate } from "react-router-dom";
import { import {
usernameStorageHandlerInit, usernameStorageHandlerInit,
authTokenStorageHandlerInit, authTokenStorageHandlerInit,
@ -13,6 +14,10 @@ export default function Login() {
setUsernameFormValue(eventData.target.value); setUsernameFormValue(eventData.target.value);
} }
if (authTokenStorageHandler.authTokenValue) {
return <Navigate to="/home"></Navigate>;
}
function onUsernameInputDefocus(formEvent) { function onUsernameInputDefocus(formEvent) {
console.log("Down"); console.log("Down");
} }
@ -41,6 +46,7 @@ export default function Login() {
console.log(responseParsed); console.log(responseParsed);
if (responseParsed.success) { if (responseParsed.success) {
authTokenStorageHandler.setAuthTokenValue(responseParsed.authToken); authTokenStorageHandler.setAuthTokenValue(responseParsed.authToken);
window.location.reload();
} else { } else {
console.log("Login failure!"); console.log("Login failure!");
} }

37
src/pages/Logout.tsx Normal file
View File

@ -0,0 +1,37 @@
import * as React from "react";
import { Navigate } from "react-router-dom";
import {
usernameStorageHandlerInit,
authTokenStorageHandlerInit,
userIDStorageHandlerInit,
} from "../components/storageHandler.ts";
export default function Logout() {
const authTokenStorageHandler = authTokenStorageHandlerInit();
const userIDStorageHandler = userIDStorageHandlerInit();
const usernameStorageHandler = usernameStorageHandlerInit();
if (!authTokenStorageHandler.authTokenValue) {
return <Navigate to="/home"></Navigate>;
}
function onLogoutButtonClick() {
authTokenStorageHandler.deleteAuthTokenValue();
userIDStorageHandler.deleteUserIDValue();
usernameStorageHandler.deleteUsernameValue();
window.location.reload();
}
return (
<>
<div className="centeredBoxArea">
<div id="loginBox">
<div id="loginBoxContents">
<h1>Logout</h1>
<button onClick={onLogoutButtonClick}>Logout</button>
</div>
</div>
</div>
</>
);
}