Login logout finally working

This commit is contained in:
hz
2025-05-13 00:12:13 -07:00
parent fbd48297e2
commit 8f1cba5f82
5 changed files with 135 additions and 55 deletions
+21 -13
View File
@@ -1,25 +1,33 @@
import React from "react"; import React, { useState, useEffect } from "react";
import { Routes, Route, Navigate } from "react-router-dom"; import { Routes, Route, Navigate } from "react-router-dom";
import Login from "./pages/Login"; import Login from "./pages/Login";
import Register from "./pages/Register"; import Register from "./pages/Register";
import Dashboard from "./pages/Dashboard"; import Dashboard from "./pages/Dashboard";
import Layout from "./components/Layout"; import Layout from "./components/Layout";
import ProtectedRoute from "./components/ProtectedRoute";
const App = () => { const App = () => {
const token = localStorage.getItem("token"); const [token, setToken] = useState(null);
useEffect(() => {
const storedToken = localStorage.getItem("token");
setToken(storedToken);
}, []);
return ( return (
<Layout> <Routes>
<Routes> <Route path="/login" element={<Login setToken={setToken} />} />
<Route path="/login" element={<Login />} /> <Route path="/register" element={<Register />} />
<Route path="/register" element={<Register />} /> <Route
<Route path="/dashboard"
path="/dashboard" element={
element={token ? <Dashboard /> : <Navigate to="/login" />} <ProtectedRoute>
/> <Dashboard />
<Route path="*" element={<Navigate to="/login" />} /> </ProtectedRoute>
</Routes> }
</Layout> />
<Route path="*" element={<Navigate to="/login" />} />
</Routes>
); );
}; };
+2 -8
View File
@@ -1,15 +1,9 @@
import React, { useEffect, useState } from "react"; import React from "react";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
const Layout = ({ children }) => { const Layout = ({ children, token, setToken }) => {
const [token, setToken] = useState(null);
const navigate = useNavigate(); const navigate = useNavigate();
useEffect(() => {
const t = localStorage.getItem("token");
setToken(t);
}, []);
const handleLogout = () => { const handleLogout = () => {
localStorage.removeItem("token"); localStorage.removeItem("token");
setToken(null); setToken(null);
+21
View File
@@ -0,0 +1,21 @@
import React from "react";
const PageWrapper = ({ children, center = false }) => (
<div
style={{
height: "100vh",
margin: 0,
padding: 0,
display: "flex",
flexDirection: "column",
alignItems: center ? "center" : "stretch",
justifyContent: center ? "center" : "flex-start",
backgroundColor: "#242424",
position: "relative",
}}
>
{children}
</div>
);
export default PageWrapper;
+54
View File
@@ -0,0 +1,54 @@
import React from "react";
import { Navigate, useNavigate } from "react-router-dom";
import PageWrapper from "./PageWrapper";
const ProtectedRoute = ({ children }) => {
const token = localStorage.getItem("token");
const navigate = useNavigate();
const handleLogout = () => {
localStorage.removeItem("token");
navigate("/login");
};
if (!token) {
return <Navigate to="/login" />;
}
return (
<PageWrapper>
<div
style={{
height: "100vh",
margin: 0,
padding: 0,
display: "flex",
alignItems: "center",
justifyContent: "center",
backgroundColor: "#242424",
position: "relative",
}}
>
<button
onClick={handleLogout}
style={{
position: "absolute",
top: "1rem",
right: "1rem",
backgroundColor: "#1a1a1a",
color: "#fff",
padding: "0.5rem 1rem",
border: "none",
borderRadius: "4px",
cursor: "pointer",
}}
>
Logout
</button>
{children}
</div>
</PageWrapper>
);
};
export default ProtectedRoute;
+37 -34
View File
@@ -2,6 +2,7 @@ import React, { useState } from "react";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import config from "../config"; import config from "../config";
import { useAuth } from "../AuthContext"; import { useAuth } from "../AuthContext";
import PageWrapper from "../components/PageWrapper";
const styles = { const styles = {
form: { form: {
@@ -81,7 +82,7 @@ const Login = () => {
} }
const data = await res.json(); const data = await res.json();
login(data.token); login(data.token);
navigate("/dashboard"); navigate("/dashboard");
} catch (err) { } catch (err) {
console.error("Login error:", err); console.error("Login error:", err);
@@ -90,39 +91,41 @@ const Login = () => {
}; };
return ( return (
<form onSubmit={handleSubmit} style={styles.form}> <PageWrapper center>
<h2 style={styles.title}>Login</h2> <form onSubmit={handleSubmit} style={styles.form}>
<input <h2 style={styles.title}>Login</h2>
type="text" <input
name="username" type="text"
placeholder="Username" name="username"
value={form.username} placeholder="Username"
onChange={handleChange} value={form.username}
style={styles.input} onChange={handleChange}
required style={styles.input}
/> required
<input />
type="password" <input
name="password" type="password"
placeholder="Password" name="password"
value={form.password} placeholder="Password"
onChange={handleChange} value={form.password}
style={styles.input} onChange={handleChange}
required style={styles.input}
/> required
<div style={styles.buttonRow}> />
<button type="submit" style={styles.button}> <div style={styles.buttonRow}>
Login <button type="submit" style={styles.button}>
</button> Login
<button </button>
type="button" <button
onClick={() => navigate("/register")} type="button"
style={styles.button} onClick={() => navigate("/register")}
> style={styles.button}
Register >
</button> Register
</div> </button>
</form> </div>
</form>
</PageWrapper>
); );
}; };