2

In this code

import React from "react";
import { createBrowserRouter, RouterProvider, r } from "react-router-dom";
import Home from "./pages/home/Home";
import Login from "./pages/login/Login";
import Signup from "./pages/signup/Signup";
import { action as signup } from "./pages/signup/Signup";
import { useAuthConetxt } from "./hooks/useAuthConetxt";
import { createPortal } from "react-dom";
import classes from "./App.module.css";

const router = createBrowserRouter([
  {
    path: "/",
    element: <Home />,
    children: [
      {
        path: "login",
        element: <Login />,
      },
      { path: "signup", element: <Signup />, action: signup },
    ],
  },
]);

function App() {
  const { authIsReady, user } = useAuthConetxt();
  return (
    <>
      {!authIsReady &&
        createPortal(
          <div
            style={{
              width: "100vw",
              height: "100vh",
              backgroundColor: "rgba(0,0,0,0.3)",
              position: "absolute",
              zIndex: "1",
            }}
          >
            <span className={classes.loader}></span>
          </div>,
          document.getElementById("backdrop")
        )}
      <RouterProvider router={router} />
    </>
  );
}

export default App;

I want to protect Home with path '/' such that if I'm not logged in, it redirects to '/login'.

Home.js

import React from "react";
import classes from "./Home.module.css";
import { Outlet } from "react-router-dom";
import MainNavigation from "../../components/header/MainNavigation";

const Home = () => {
  return (
    <>
      <MainNavigation />
      <Outlet />
    </>
  );
};

export default Home;

In previous versions we can say

<Route exact path="/">
   {user && <Home/>}
   {!user && <Redirect to="/login" /> 
</Route>

I can check in every component if user exists or not, but I think it's a bad approach. So, in React Router DOM version 6.4, how can I do the same thing using conditional? I know I can use loaders, but the user is inside context, I can't use hooks inside loaders.

Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197

0 Answers0