#13-login-page #19

Merged
juggy1233 merged 4 commits from #13-login-page into master 2023-03-19 14:59:33 -04:00
5 changed files with 66 additions and 14 deletions
Showing only changes of commit 8b9bc96b93 - Show all commits

View File

@@ -2,12 +2,15 @@ import "./App.css";
import { Route } from "wouter"; import { Route } from "wouter";
import HomePage from "./pages/HomePage"; import HomePage from "./pages/HomePage";
import LoginPage from "./pages/LoginPage"; import LoginPage from "./pages/LoginPage";
import { UserContextProvider } from "./contexts/UserContext";
function App() { function App() {
return ( return (
<div className="App"> <div className="App">
<UserContextProvider>
<Route path="/" component={HomePage} /> <Route path="/" component={HomePage} />
<Route path="/login" component={LoginPage} /> <Route path="/login" component={LoginPage} />
</UserContextProvider>
</div> </div>
); );
} }

View File

@@ -1,6 +1,9 @@
import { useContext } from "react";
import { Nav, Container, Navbar } from "react-bootstrap"; import { Nav, Container, Navbar } from "react-bootstrap";
import UserContext from "../contexts/UserContext";
const MyNavbar = () => { const MyNavbar = () => {
const { currentUser } = useContext(UserContext);
return ( return (
<Navbar variant="dark" bg="dark" expand="lg"> <Navbar variant="dark" bg="dark" expand="lg">
<Container> <Container>
@@ -9,7 +12,9 @@ const MyNavbar = () => {
<Navbar.Collapse id="navbar-nav"> <Navbar.Collapse id="navbar-nav">
<Nav className="ms-auto"> <Nav className="ms-auto">
<Nav.Link href="/">Home</Nav.Link> <Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/login">Login</Nav.Link> {(currentUser?.id && (
<Nav.Link href="/logout">Logout</Nav.Link>
)) || <Nav.Link href="/login">Login</Nav.Link>}
</Nav> </Nav>
</Navbar.Collapse> </Navbar.Collapse>
</Container> </Container>

View File

@@ -0,0 +1,30 @@
import { createContext, useMemo, useState } from "react";
const UserContext = createContext({});
const UserContextProvider = ({ children }) => {
const [currentUser, setCurrentUser] = useState(undefined);
// useMemo does not wait for after render, like useEffect.
useMemo(()=>{
setCurrentUser(JSON.parse(localStorage.getItem("currentUser")));
},[]);
const contextValues = {
currentUser,
setCurrentUser: (data) => {
localStorage.setItem("currentUser", JSON.stringify(data))
setCurrentUser(data);
},
};
return (
<UserContext.Provider value={contextValues}>
{children}
</UserContext.Provider>
);
};
export default UserContext;
export { UserContextProvider };

View File

@@ -1,16 +1,17 @@
import { useEffect } from "react"; import { useContext, useEffect } from "react";
import { Container } from "react-bootstrap"; import { Container } from "react-bootstrap";
import MyNavbar from "../components/MyNavbar"; import MyNavbar from "../components/MyNavbar";
import UserContext from "../contexts/UserContext";
const HomePage = () => { const HomePage = () => {
{/*{current_user} = use context*/} const { currentUser } = useContext(UserContext);
const current_user = null;
useEffect(()=>{ useEffect(() => {
if (!current_user) { if (!currentUser?.id) {
window.location.replace("/login"); window.location.replace("/login");
} }
}, []); }, [currentUser]);
return ( return (
<div> <div>
<MyNavbar /> <MyNavbar />

View File

@@ -1,6 +1,7 @@
import React, { useState } from "react"; import React, { useContext, useEffect, useState } from "react";
import { Button, Col, Container, Form, Row, Alert } from "react-bootstrap"; import { Button, Col, Container, Form, Row, Alert } from "react-bootstrap";
import MyNavbar from "../components/MyNavbar"; import MyNavbar from "../components/MyNavbar";
import UserContext from "../contexts/UserContext";
import { makeRequest } from "../utils.ts"; import { makeRequest } from "../utils.ts";
const LoginPage = () => { const LoginPage = () => {
@@ -8,6 +9,19 @@ const LoginPage = () => {
const [password, setPassword] = useState(""); const [password, setPassword] = useState("");
const [error, setError] = useState(null); const [error, setError] = useState(null);
const { currentUser, setCurrentUser } = useContext(UserContext);
useEffect(() => {
console.log(currentUser);
if (currentUser?.id) {
gotoHome();
}
}, [currentUser]);
const gotoHome = () => {
window.location.href = "/";
};
const sendLoginRequest = async (e) => { const sendLoginRequest = async (e) => {
e?.preventDefault(); e?.preventDefault();
await makeRequest({ await makeRequest({
@@ -21,8 +35,7 @@ const LoginPage = () => {
setError(data); setError(data);
return; return;
} }
console.log(data); setCurrentUser(data);
window.location.href = "/";
}); });
}; };