In my React app, when the user is successfully signed, his/her information is being saved in the local storage. And a token is being saved in the session storage only when the user is successfully logged in.
Now I know that the token will be in the session storage only if the user has successfully logged in. On the basis of this token I want to set up my private routing.
I have attempted something like that if token is null then it should remain on login form and if token is not null then go to home page But doing something like this is not setting my routing.
I think maybe I am doing some mistake with App.js file where I am running Router, Routes and Route or where I am checking token is null or not null I am making some mistake there.
please help me to rectify my mistake. Thanks.
Here is my code.
Login.js
import React, { useState } from "react";
import { Form, Button } from "react-bootstrap";
import { Link } from "react-router-dom";
const Login = ({ setTokenData }) => {
const initialValues = {
email: "",
password: "",
};
const [userData, setUserData] = useState(initialValues);
const authenticateUser = () => {
const localInfo = JSON.parse(localStorage.getItem("signUpUser"));
localInfo?.map((item) => {
const userName = item.email;
const userPassword = item.password;
if (userName === userData.email && userPassword === userData.password) {
console.log("success");
const token = Math.random().toString(36).substr(2, 5);
console.log("token is:", token);
sessionStorage.setItem("token", JSON.stringify(token));
setTokenData(token);
} else {
console.log("failure");
return false;
}
});
setUserData(initialValues);
};
return (
<>
<Form className="loginForm">
<Form.Group className="mb-3" controlId="formBasicEmail">
<Form.Label>Email Address</Form.Label>
<Form.Control
type="email"
placeholder="Enter email"
value={userData.email}
name="email"
onChange={(e) =>
setUserData({ ...userData, [e.target.name]: e.target.value })
}
/>
</Form.Group>
<Form.Group className="mb-3" controlId="formBasicPassword">
<Form.Label>Password</Form.Label>
<Form.Control
type="password"
placeholder="Password"
name="password"
value={userData.password}
onChange={(e) =>
setUserData({ ...userData, [e.target.name]: e.target.value })
}
/>
</Form.Group>
<Form.Group className="mb-3" controlId="formBasicCheckbox"></Form.Group>
<Button
variant="primary"
type="submit"
onClick={() => authenticateUser()}
>
Login
</Button>
<div className="txtToSignUpBtn">
<span>OR</span> <Link to="/signUp">Click here to Register</Link>
</div>
</Form>
</>
);
};
export default Login;
PrivateRoute.js
import React from 'react'
import { Navigate } from 'react-router-dom';
import Login from "./Login";
import Header from "./Header";
const getTokenData = () => {
const token = JSON.parse(sessionStorage.getItem("token"));
if (token) {
return JSON.parse(sessionStorage.getItem("token"));
} else {
return null;
}
};
const RequireAuth = () => {
const [tokenData, setTokenData] = useState(getTokenData());
if (tokenData === null) {
return <Login setTokenData={setTokenData} />,
<Navigate to='/' />
} else {
return <Header setTokenData={setTokenData} />,
<Navigate to='/home' />
}
export default RequireAuth;
App.js
import { Layout } from "antd";
import React from "react";
import SignUp from "./SignUp";
import Login from "./Login";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Header from "./Header";
import UsersTable from "./UsersTable";
import RequireAuth from "./PrivateRoute";
const AppWrapper = () => {
return (
<>
<Layout>
<Router>
<Routes>
<Route
exact
path="/home"
element={
<RequireAuth>
<Header />
</RequireAuth>
}
/>
<Route exact path="/signUp" element={<SignUp />} />
<Route exact path="/" element={<Login />} />
<Route exact path="/usersTable" element={<UsersTable />} />
</Routes>
</Router>
</Layout>
</>
);
};
export default AppWrapper;