So ive been scratching my head over this one. When i login the user is not immediately displayed and i still see login and signup even though the user was successfully logged in but when i refresh the page manually the user and logout gets displayed and everything works fine. What am i doing wrong?
const NavBar = (props) => {
const { user, setUser } = useContext(AuthContext);
useEffect(
() => {
const config = {
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${localStorage.getItem('authToken')}`
}
};
fetch(`${process.env.REACT_APP_BACKEND}/api/private`, config)
.then((res) => {
return res.json();
})
.then((data) => {
setUser(data);
});
},
[ setUser ]
);
return (
<nav className="navbar navbar-expand-lg navbar-dark" style={{ background: '#1F2128' }}>
<div className="container-fluid container-lg">
<div className="collapse navbar-collapse" id="navbarNav">
{user && (
<ul className="navbar-nav" style={{ marginLeft: 'auto' }}>
<li className="nav-item">
<Link className="nav-link" aria-current="page" to="/private">
{user.email}
</Link>
</li>
<li className="nav-item">
<Link className="nav-link" aria-current="page" to="/logout">
Logout
</Link>
</li>
</ul>
)}
{!user && (
<ul className="navbar-nav" style={{ marginLeft: 'auto' }}>
<li className="nav-item">
<Link className="nav-link" aria-current="page" to="/login">
Login
</Link>
</li>
<li className="nav-item">
<Link className="nav-link" to="/signup">
Sign up
</Link>
</li>
</ul>
)}
</div>
</div>
</nav>
);
};
export default NavBar;
For the Context by default im setting the user as null.
const AuthState = (props) => {
const [ user, setUser ] = useState(null);
const value = useMemo(() => ({ user, setUser }), [ user, setUser ]);
return <AuthContext.Provider value={value}>{props.children}</AuthContext.Provider>;
};
And also the context:
import { createContext } from 'react';
const authContext = createContext();
export default authContext;