useEffect () не вызывается из частного маршрута в приложении реакции - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу перенаправить моего пользователя на домашнюю страницу, если он уже вошел в систему. Но проблема в том, что когда я вызываю пользовательский хук 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...