Правильный ли мой способ проверки сеанса реакции / редукции пользователя? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть несколько PrivateRoutes и один не приватный маршрут. Прямо сейчас я проверяю, какой из них загрузить в основной компонент, например:

render() {
    const { currentUser, isSessionChecked } = this.props;
    return (
      <div>
        <Header />
        <Switch>
          <PrivateRoute exact path="/" component={CockpitPage} />
          <PrivateRoute path="/trip" component={TripPage} />
          <Route
            path="/signin"
            render={() => {
              if (isSessionChecked) {
                return currentUser ? <Redirect to="/" /> : <SignInAndUpPage />;
              }
            }}
          />
        </Switch>
      </div>
    );
  }
}

, что меня беспокоит, так это если (isSessionChecked) в / signin route render (и у меня тот же лог c в компоненте PrivateRoute ) правильный подход к вещам. Моя главная проблема заключается в том, что происходит, если проверка сеанса занимает слишком много времени. Я проверяю, был ли проверен сеанс, потому что без этого, если у пользователя есть активный сеанс и он входит / входит в маршрут, страница входа мигает некоторое время (и я не хочу, чтобы это происходило), потому что проверка сеанса выполняется, и нет currentUser установлен между тем. Я использую Firebase аутентификацию с электронной почтой и паролем или Google. Моя часть сеанса user.reducer:

case UserActionTypes.CHECK_USER_SESSION_SUCCESS:
      return {
        ...state,
        isSessionChecked: true
      };
    case UserActionTypes.CHECK_USER_SESSION_FAILURE:
      return {
        ...state,
        isSessionChecked: true,
        error: action.payload
      };

моя сага checkUserSession (в saveUserAndSignIn есть этот «saveUser», потому что, если кто-то впервые регистрируется в Google, я создаю его профиль в моей базе данных FireStore - это не относится к этому случаю сеанса проверки, но для входа в систему в целом):

export function* checkUserSession() {
  try {
    const user = yield call(getCurrentUser);

    if (!user) {
      yield put(checkUserSessionSuccess());
      return;
    }
    yield call(saveUserAndSignIn, user);
    yield put(checkUserSessionSuccess());
  } catch (error) {
    yield put(checkUserSessionFailure(error));
  }
}

и метод getCurrentUser:

export const getCurrentUser = () => {
  return new Promise((resolve, reject) => {
    const unsubscribe = auth.onAuthStateChanged(AuthData => {
      unsubscribe();
      resolve(AuthData);
    }, reject);
  });
};

Это нормально? Я предполагаю, что если проверка сеанса занимает слишком много времени (она установлена ​​на false слишком долго), это означает, что firebase не отвечает - но я не знаю, будет ли она автоматически, через некоторое время, выбросить отклонение в Promise (что выдает ошибку, вызывая checkUserSessionFailure, которая устанавливает isSessionChecked в true, чтобы приложение работало должным образом), или мне нужно позаботиться об этом вручную?

...