Я использую FacebookAuthProvider
firebase для входа моих пользователей с моей платформы.
Я использую реакцию native в expo с firestore, и она отлично работает, пока я не попытался добавить некоторые проверки, чтобы перенаправить пользователей на правильные экраны после входа в систему. Существуют две разные роли (администраторы и пользователи), которые должны быть раздельными сразу после входа в систему.
if (/* user is administrator */) {
this.props.navigation.navigate('Admin');
} else {
this.props.navigation.navigate('Main');
}
После добавления этого метода для разделения пользователей этими ролями я получил эту ошибку:
реагировать на родной TypeError: не удается прочитать свойство "навигация" неопределенного
Позже я добавлю несколько подробностей (файлы журналов и т.д., Как только узнаю, как их удалить из моей языковой машины).
Чтобы лучше понять, я поставил здесь весь свой код (извините за плохие отступы, которые уменьшают читаемость):
const auth = firebase.auth();
const firebaseUser = '';
const usersRef = firebase.firestore().collection('users');
async handleFacebookButton() {
const { type, token, } = await Facebook.logInWithReadPermissionsAsync(FACEBOOK_APP_ID, {
permissions: ['public_profile', 'email']
});
if (type === 'success') {
//Firebase credential is created with the Facebook access token.
const credential = firebase.auth.FacebookAuthProvider.credential(token);
auth.signInAndRetrieveDataWithCredential(credential)
.then(function(userCredential) {
newUserCheck = userCredential.additionalUserInfo.isNewUser;
console.log('newUserCheck = ', newUserCheck)
});
this.setState({loggedIn: "You are signed in"})
this.setState({signedIn: true})
console.log('you are signed in');
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
firebaseUser = {name: user.displayName, uid: user.uid, email: user.email}
console.log(firebaseUser.name, ' and ', firebaseUser.uid);
var existingRef = usersRef.doc(firebaseUser.uid);
existingRef.get().then(function(documentSnapshot) {
// check if user is registered
if(documentSnapshot) {
data = documentSnapshot.data();
console.log('existing user exists!!');
// check if user is an administrator
if (data.administrator == true) {
console.log('existing administrator exists!!');
this.props.navigation.navigate('Admin');
} else { this.props.navigation.navigate('Main');
}
}
});
(error => {
console.log('user not accessed: ', error);
});
//User is not yet in firebase database and needs to be saved
// double check that user is a new user
if (newUserCheck == true) {
this.ref
.doc(uid)
.set({
id: firebaseUser.uid,
username: firebaseUser.name,
email: firebaseUser.email,
})
this.props.navigation.navigate('ChooseRoute')
}
}
})
}
// If login type is not success:
(error => {
this.setState({loggedIn: "Login failed: log in again"})
this.setState({ errorMessage: error.message });
});
}
Я починил это!! 3 дня спустя - это была проблема с привязкой - после нескольких неудачных попыток разобраться, какие были правильные части функций для привязки, я преобразовал как "auth(), так и onAuthStateChanged" и "documentSnapshot" в функции толстых стрелок, и ошибки исчезли !! Слава богу за ES6...! Надеюсь, это поможет кому-то еще по линии...