0

I am trying to implement Protected route that will check if the user is logged in before accessing some paths, and if it is not the user will be redirected to login.

I tried to follow this article: https://ui.dev/react-router-protected-routes-authentication/

But still my code is somehow not accessing that component and renders without checking for authentication.

Code: App.js

import './App.css';
import { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { Routes, Route, BrowserRouter } from 'react-router-dom';
import axios from 'axios';
import { logout } from './redux/authSlice';
import { Header, ProtectedRoute } from './components/index';
import { Dashboard, Home, Login, Signup } from './pages/index';

axios.defaults.withCredentials = true;

function App() {
  const dispatch = useDispatch();

  // Add event listener that gets triggered when logout is called in one of the tabs.
  // This will call logout in all of the tabs.
  useEffect(() => {
    const syncLogout = (event) => {
      if (event.key === 'logout') {
        console.log('Logged out from storage :)');
        dispatch(logout());
      }
    };

    window.addEventListener('storage', syncLogout);
    return () => window.removeEventListener('storage', syncLogout);
  }, [dispatch]);

  return (
    <>
      <Header />
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/login" element={<Login />} />
        <Route path="/signup" element={<Signup />} />
        <ProtectedRoute path="/dashboard" element={<Dashboard />} />
      </Routes>
    </>
  );
}

export default App;

components/ProtectedRoute.js (note i have added console to check if this component is getting called)

import { useSelector } from 'react-redux';
import { Navigate, Route } from 'react-router-dom';

export const ProtectedRoute = ({element, path}) => {
  const name = useSelector(state => state.auth.name);
  console.log("in protected route");

  const elementToRender = (name ? element : <Navigate to="/login" replace state={{path}} />);
  console.log(elementToRender);
  return <Route path={path} element={elementToRender} />
}

components/index.js

export { Header } from './Header';
export { Footer } from './Footer';
export { QuizzesCreated } from './QuizzesCreated';
export { DisplayQuiz } from './DisplayQuiz';
export { CreateQuiz } from './CreateQuiz';
export { ProtectedRoute } from './ProtectedRoute';

If I load dashboard, there is no console and no authentication or redirection happening. /dashboard screenshot of console

Drew Reese
  • 103,803
  • 12
  • 69
  • 96

0 Answers0