When I log out from the Home
page, the state gets updated and the page shows a login option, but after logging in again, the page again shows a login option untill refreshed, after refreshing the page, it displays the username? Why does the context value does not reflect immediately?
Login.js:
const submit = () => {
Axios.post("http://localhost:3001/login", data).then((res) => {
localStorage.setItem("bankDetails", res.data[0].acc_no);
navigate("/Home");
});
};
return (
<form onSubmit={submit}>
<input ... />
...
</form>
)
Home.js:
import { useContext } from "react";
import { LoginContext, DetailsContext } from "../App";
function Account() {
const isValid = useContext(LoginContext);
const userDetails = useContext(DetailsContext);
const load = () => {
localStorage.removeItem("bankDetails");
window.location.reload();
}
return isValid ? (
<div className="personal-info">
<h3>Welcome {userDetails.Username}</h3>
<h3 onClick={load}>LogOut</h3>
</div>
) : (
<h1>You Need to Login First !!!</h1>
);
}
App.js:
export const LoginContext = React.createContext();
export const DetailsContext = React.createContext();
function App() {
const username = localStorage.getItem("bankDetails");
const [userDetails, setUserDetails] = useState();
const [isValid, setisValid] = useState(false);
useEffect(() => {
if (username !== null) {
Axios.post("http://localhost:3001/userDetails", {
username: username,
}).then((res) => {
if (res.data.err) {
console.log("err");
} else {
setUserDetails(res.data.details[0]);
setisValid(true);
}
});
}
}, [username]);
return (
<LoginContext.Provider value={isValid}>
<DetailsContext.Provider value={userDetails}>
<Router>
<Routes>
<Route path="/Login" element={<Login />} />
<Route path="/Home" element={<Home />} />
</Routes>
</Router>
</DetailsContext.Provider>
</LoginContext.Provider>
);
}