Я создаю приложение для реагирования, используя firebase для входа. Когда я вызываю метод входа в Google, я хочу иметь возможность определять, существует ли пользователь в нашей коллекции UserStorage (уже зарегистрировался ранее), если они этого не сделали, он должен направить их в компонент регистрации, в противном случае он должен направить их к фитнес-компоненту. Из компонента мы обрабатываем вход с помощью:
async handleGoogleSignIn(event) {
event.preventDefault();
this.props.googleSignIn(this.state);
try {
const bool = await this.isExistingUser()
if(bool == true) {
this.props.history.push('/fitness');
} else {
this.props.history.push('/signup');
}
} catch (error) {
this.props.history.push('/home');
}
}
isExistingUser определяется как:
isExistingUser() {
var id = ''
firebase.auth().onAuthStateChanged(function(user) {
try {
if (user) {
id = user.uid
for (var i = 0; i < this.props.fetchedUser.length; i++) {
if(this.props.fetchedUser[i].id == id) {
return true;
}
}
return false;
} else {
console.log('No user is signed in.')
}
} catch (error) {
console.log('ERROR: ', error)
}
});
return false;
}
this.props.fetchedUser должен иметь список всех пользователей, которые мы сохранили в out, а метод входа в Google, который мы получаем из реквизита:
export const googleSignIn = () => {
return (dispatch, getState, {getFirebase, getFirestore}) => {
const firebase = getFirebase();
const firestore = getFirestore();
const provider = new firebase.auth.GoogleAuthProvider()
firebase.auth().signInWithRedirect(provider).then(async result => {
var user = result.user;
console.log('GOOGLE SIGN IN: ', user)
}).then(() => {
dispatch({ type: 'GOOGLE_LOGIN_SUCCESS' });
}).catch((error) => {
dispatch({ type: 'GOOGLE_LOGIN_ERROR', error });
});
}
};
То, как у нас это есть, всегда указывает на компонент регистрации. Я думаю, это как-то связано с асинхронной аутентификацией, поэтому он перенаправляет на регистрацию до завершения аутентификации. Мы будем очень благодарны за любые решения этой проблемы.