1

when user is false i want to use useNavigate to direct user to /register page instead of going to home page but it keeps giving me an error: (useNavigate() may be used only in the context of a <Router> component.) Keep in mind I do not want to use redirect because my current version of react-router-dom does not support it. here is my code:

const App = () => {
  const user = false;
  const navigate = useNavigate();
  return (
    <div className="bg-[#0b0b0b]">
      <Router>
        <Routes>
          {user ? (<Route path="/" element={<Home />} />) : (navigate("/register"))}
          <Route path="/movies" element={<Home type="movie" />} />
          <Route path="/series" element={<Home type="series" />} />
          <Route path="/watch" element={<Watch />} />
          <Route path="/register" element={<Register />} />
          <Route path="/login" element={<Login />} />
        </Routes>
      </Router>
    </div>
  )
}

export default App

1 Answers1

0

The useNavigate hook can't be used outside any router that provides the routing context for it. To resolve the error you should promote the Router component that provides the routing context higher in the ReactTree than the App component so it can be used there.

You don't need to use the useNavigate hook in the App component though. Simply render a Navigate component in its place to issue a declarative navigation action.

import {
  BrowserRouter as Router,
  Routes,
  Navigate
} from 'react-router-dom';

const App = () => {
  const user = false;
  return (
    <div className="bg-[#0b0b0b]">
      <Router>
        <Routes>
          {user
            ? <Route path="/" element={<Home />} />
            : <Navigate to="/register" replace />
          }
          <Route path="/movies" element={<Home type="movie" />} />
          <Route path="/series" element={<Home type="series" />} />
          <Route path="/watch" element={<Watch />} />
          <Route path="/register" element={<Register />} />
          <Route path="/login" element={<Login />} />
        </Routes>
      </Router>
    </div>
  );
};

It seems the code is heading in the direction of a route protection implementation. See my answer here for a complete example.

Drew Reese
  • 165,259
  • 14
  • 153
  • 181