On submitting a form the useNavigate hook should detect the isAuthenticated state and redirect to "/app/dashboard" route, but it remains on the "/login" route
App.js Here isAuthenticated is passed to the routes and renders relevant routes depending on its global boolean value
import React from "react";
import jwtDecode from "jwt-decode";
// Routing
import { useRoutes } from "react-router-dom";
import routes from "./routes"
const token = localStorage.FBIdToken;
let isAuthenticated;
if (token) {
const decodedToken = jwtDecode(token);
console.log(decodedToken);
// Check whether the token is expired
if (decodedToken.exp * 1000 < Date.now()) {
window.location.href = "/login";
isAuthenticated = false;
} else {
isAuthenticated = true;
}
}
function App() {
const routing = useRoutes(routes(isAuthenticated));
return (
<ThemeProvider theme={theme}>
<GlobalStyles />
{routing}
</ThemeProvider>
);
}
export default App;
routes.js the isAuthenticated is passed to determine which view will be displayed
import React from "react";
import { Navigate } from "react-router-dom";
const routes = (isAuthenticated) => [
{
path: "/app",
element:
isAuthenticated === true ? <DashboardLayout /> : <Navigate to="/login" />,
children: [{ path: "dashboard", element: <Dashboard /> }],
},
{
path: "/",
element: !isAuthenticated ? (
<MainLayout />
) : (
<Navigate to="/app/dashboard" />
),
children: [
{ path: "login", element: <Login /> },
{ path: "signup", element: <Signup /> },
{ path: "/", element: <Navigate to="/app/dashboard" /> },
],
},
];
export default routes;
login.js an axios request is sent and a successful response should lead to a page redirect to the "/app/dashboard" route
import React, { useState } from "react";
import { Link as RouterLink, useNavigate } from "react-router-dom";
const Login = () => {
const classes = useStyles();
const navigate = useNavigate();
const [state, setState] = useState({
email: "",
password: "",
loading: false,
errors: {},
});
const handleChange = (e) => {
// Set the value of state to corresponding input
setState({
...state,
[e.target.name]: e.target.value,
});
};
const handleSubmit = (e) => {
e.preventDefault();
setState({
...state,
loading: true,
});
const userData = {
email: state.email,
password: state.password,
};
axios
.post("/login", userData)
.then((response) => {
console.log(response.data);
localStorage.setItem("FBIdToken", `Bearer ${response.data.token}`);
setState({
...state,
loading: false,
});
navigate("/app/dashboard", { replace: true });
})
.catch((err) => {
setState({
...state,
errors: err.response.data,
loading: false,
});
});
};
return (
// Some form
);
};
export default Login;