Ujjwal Gaihre
Ujjwal Gaihre

Reputation: 19

I'm using React Router v7.20 and getting this error in my Account.jsx component

The error happens when I refresh the page or navigate between "/account", "/account/bookings", and "/account/places".

import React, { useContext } from 'react';
import { UserContext } from '../UserContext/usercontext';
import { Navigate, useParams, useLocation } from 'react-router-dom';
import { Link } from 'react-router-dom';

export default function Account() {
  const { user, ready } = useContext(UserContext);
  const location = useLocation();

  if (!ready) return <div>Loading...</div>;
  if (!user) return <Navigate to="/login" />;

  const { subpage } = useParams();

  function isActive(path) {
    return location.pathname === path ? "bg-primary text-white" : " ";
  }

  return (
    <div>
      <nav>
        <Link className={isActive("/account")} to="/account">Profile</Link>
        <Link className={isActive("/account/bookings")} to="/account/bookings">Bookings</Link>
        <Link className={isActive("/account/places")} to="/account/places">Places</Link>
      </nav>

      {!subpage && <h2>Welcome, {user.name}!</h2>}
    </div>
  );
}

Questions:

Environment Details:

Upvotes: 2

Views: 64

Answers (2)

Shubham Sharma
Shubham Sharma

Reputation: 320

Hooks should always be called at top level.In your case you are returning

if (!ready) return <div>Loading...</div>;
if (!user) return <Navigate to="/login" />;

before calling useParams()

Upvotes: 2

Drew Reese
Drew Reese

Reputation: 203322

You cannot conditionally call React hooks. Move the useParams hook call above any early returns.

import React, { useContext } from 'react';
import { UserContext } from '../UserContext/usercontext';
import { Link, Navigate, useParams, useLocation } from 'react-router-dom';

export default function Account() {
  const { user, ready } = useContext(UserContext);
  const location = useLocation();

  const { subpage } = useParams(); // <-- before any early returns

  if (!ready) return <div>Loading...</div>;

  if (!user) return <Navigate to="/login" />;
  
  function isActive(path) {
    return location.pathname === path ? "bg-primary text-white" : " ";
  }

  return (
    <div>
      <nav>
        <Link className={isActive("/account")} to="/account">Profile</Link>
        <Link
          className={isActive("/account/bookings")}
          to="/account/bookings"
        >
          Bookings
        </Link>
        <Link
          className={isActive("/account/places")}
          to="/account/places"
        >
          Places
        </Link>
      </nav>

      {!subpage && <h2>Welcome, {user.name}!</h2>}
    </div>
  );
}

Upvotes: 2

Related Questions