Implement login post to endpoint, storage handling via react hooks which stores the authToken in localstorage
This commit is contained in:
parent
f09d7f1eb2
commit
5691e0dc8b
16
src/App.tsx
16
src/App.tsx
|
|
@ -8,18 +8,14 @@ import Home from "./pages/Home.tsx";
|
||||||
import Login from "./pages/Login.tsx";
|
import Login from "./pages/Login.tsx";
|
||||||
import About from "./pages/About.tsx";
|
import About from "./pages/About.tsx";
|
||||||
|
|
||||||
import useLocalStorage from "./components/useLocalStorage.ts";
|
import {
|
||||||
|
usernameStorageHandlerInit,
|
||||||
|
authTokenStorageHandlerInit,
|
||||||
|
} from "./components/storageHandler.ts";
|
||||||
|
|
||||||
export default function App() {
|
export default function App() {
|
||||||
const [usernameValue, setUsernameValue, deleteUsernameValue] =
|
const usernameStorageHandler = usernameStorageHandlerInit();
|
||||||
useLocalStorage("username");
|
const authTokenStorageHandler = authTokenStorageHandlerInit();
|
||||||
|
|
||||||
if (localStorage.getItem("username") === null) {
|
|
||||||
console.log("Username does not exist, creating!");
|
|
||||||
} else {
|
|
||||||
console.log("Username does exist!");
|
|
||||||
console.log(usernameValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
import * as React from "react";
|
||||||
|
import useLocalStorage from "./useLocalStorage.ts";
|
||||||
|
|
||||||
|
/*
|
||||||
|
React Hooks may not be a good fit for this role as these functions need to be recalled within every page to be accessible
|
||||||
|
Could look at using global variables to avoid this (But it appears to be frowned upon? And react has trouble updating usestate hooks when it comes to globals it seems)
|
||||||
|
Or could simply stop using react hooks for this role
|
||||||
|
It appears to work for now so will leave be
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const usernameStorageHandlerInit = () => {
|
||||||
|
const [usernameValue, setUsernameValue, deleteUsernameValue] =
|
||||||
|
useLocalStorage("username");
|
||||||
|
|
||||||
|
return {
|
||||||
|
usernameValue,
|
||||||
|
setUsernameValue,
|
||||||
|
deleteUsernameValue,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export const authTokenStorageHandlerInit = () => {
|
||||||
|
const [authTokenValue, setAuthTokenValue, deleteAuthTokenValue] =
|
||||||
|
useLocalStorage("authtoken");
|
||||||
|
|
||||||
|
return {
|
||||||
|
authTokenValue,
|
||||||
|
setAuthTokenValue,
|
||||||
|
deleteAuthTokenValue,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { useState, useEffect } from "react";
|
||||||
|
|
||||||
|
export default function useCookie(cookieName) {
|
||||||
|
const [cookieValue, setCookieValue] = useState("");
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const cookie = document.cookie
|
||||||
|
.split("; ")
|
||||||
|
.find((row) => row.startsWith(`${cookieName}=`));
|
||||||
|
|
||||||
|
setCookieValue(cookie ? cookie.split("=")[1] : "");
|
||||||
|
}, [cookieName]);
|
||||||
|
|
||||||
|
const setCookie = (value: string, daysTillExpiry: int) => {
|
||||||
|
const expirationDate = new Date();
|
||||||
|
expirationDate.setDate(expirationDate.getDate() + daysTillExpiry);
|
||||||
|
document.cookie = `${cookieName}=${value}; expires=${expirationDate.toUTCString()}; path=/`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const deleteCookie = () => {
|
||||||
|
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
|
||||||
|
};
|
||||||
|
|
||||||
|
return [cookieValue, setCookie, deleteCookie];
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,16 @@
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
|
import {
|
||||||
|
usernameStorageHandlerInit,
|
||||||
|
authTokenStorageHandlerInit,
|
||||||
|
} from "../components/storageHandler.ts";
|
||||||
|
|
||||||
export default function Login() {
|
export default function Login() {
|
||||||
const [usernameValue, setUsernameValue] = React.useState("");
|
const usernameStorageHandler = usernameStorageHandlerInit();
|
||||||
function handleUsernameChange(eventData) {
|
const authTokenStorageHandler = authTokenStorageHandlerInit();
|
||||||
setUsernameValue(eventData.target.value);
|
|
||||||
|
const [usernameFormValue, setUsernameFormValue] = React.useState("");
|
||||||
|
function handleUsernameFormChange(eventData) {
|
||||||
|
setUsernameFormValue(eventData.target.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onUsernameInputDefocus(formEvent) {
|
function onUsernameInputDefocus(formEvent) {
|
||||||
|
|
@ -14,17 +21,29 @@ export default function Login() {
|
||||||
formEvent.preventDefault();
|
formEvent.preventDefault();
|
||||||
|
|
||||||
const formData = new FormData(formEvent.target);
|
const formData = new FormData(formEvent.target);
|
||||||
|
const formDataObject = Object.fromEntries(formData);
|
||||||
|
|
||||||
fetch("http://127.0.0.1:8000/api", {
|
const bodyRequest = {
|
||||||
|
username: formDataObject.username,
|
||||||
|
password: formDataObject.password,
|
||||||
|
rememberMe: formDataObject.rememberMe ? true : false,
|
||||||
|
};
|
||||||
|
|
||||||
|
fetch("http://127.0.0.1:8000/api/login", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
},
|
},
|
||||||
body: JSON.stringify(Object.fromEntries(formData)),
|
body: JSON.stringify(bodyRequest),
|
||||||
})
|
})
|
||||||
.then((response) => response.json())
|
.then((response) => response.json())
|
||||||
.then((responseParsed: Object) => {
|
.then((responseParsed: Object) => {
|
||||||
console.log(responseParsed);
|
console.log(responseParsed);
|
||||||
|
if (responseParsed.success) {
|
||||||
|
authTokenStorageHandler.setAuthTokenValue(responseParsed.authToken);
|
||||||
|
} else {
|
||||||
|
console.log("Login failure!");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -38,11 +57,12 @@ export default function Login() {
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
name="username"
|
name="username"
|
||||||
value={usernameValue}
|
value={usernameFormValue}
|
||||||
onChange={handleUsernameChange}
|
onChange={handleUsernameFormChange}
|
||||||
onBlur={onUsernameInputDefocus}
|
onBlur={onUsernameInputDefocus}
|
||||||
></input>
|
></input>
|
||||||
<input type="password" name="password"></input>
|
<input type="password" name="password"></input>
|
||||||
|
<input type="checkbox" name="rememberMe"></input>
|
||||||
<button type="submit">Login</button>
|
<button type="submit">Login</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue