Я хочу перенаправить моего пользователя на домашнюю страницу, если он уже вошел в систему. Но проблема в том, что когда я вызываю пользовательский хук useAuth () из PrivateRoute (), useEffect () не выполняется, таким образом, ни один пользователь информация возвращается. Я использую Firebase аутентификацию для этого проекта, и это не проблема. Стоит ли вместо этого использовать локальное хранилище для хранения информации о пользователе?
const AuthContext = createContext();
export const AuthContextProvider = props => {
const auth = Auth();
return <AuthContext.Provider value={auth}>{props.children}</AuthContext.Provider>
};
export const useAuth = () => useContext(AuthContext);
export const PrivateRoute = ({ children, ...rest }) => {
const auth = useAuth();
return (
<Route
{...rest}
render={({ location }) =>
auth.user.email ? (
children
) : (
<Redirect
to={{
pathname: "/authentication",
state: { from: location }
}}
/>
)
}
/>
);
};
const getUser = user => {
const {displayName, email} = user;
return {name: displayName, email};
}
const Auth = () => {
const [user, setUser] = useState({});
useEffect(() => {
firebase.auth().onAuthStateChanged(function(usr){
if(usr) {
const currUser = getUser(usr);
setUser({...user,currUser});
} else{
//Nothing
}
});
}, [])
const signInWithGoogle = () => {
const provider = new firebase.auth.GoogleAuthProvider();
return firebase.auth().signInWithPopup(provider)
.then(result => {
const signedInUser = getUser(result.user);
setUser({...user,signedInUser});
return result.user;
})
.catch(error => {
setUser({});
const errorMessage = error.message;
return errorMessage;
})
}
const signOut = () => {
return firebase.auth().signOut()
.then(() => {
setUser({});
console.log("signed out");
return true;
})
.catch(error => {
const errorMessage = error.message;
console.log(errorMessage);
return false;
});
}
return {
user,
signInWithGoogle,
signOut
}
}
export default Auth;