Reputation: 19
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
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
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