У меня есть несколько 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, чтобы приложение работало должным образом), или мне нужно позаботиться об этом вручную?