Login logout finally working
This commit is contained in:
+21
-13
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
@@ -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
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user