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.