Я пытаюсь создать поток аутентификации, при котором пользователь перенаправляется на домашнюю страницу после регистрации. Я использую реагирующую навигацию, чтобы направить пользователя на страницу регистрации, когда они открывают приложение и не вошли в систему.
На странице регистрации он правильно создает нового пользователя в firebase с помощью createUserWithEmailAndPassword (), но onAuthStateChanged не срабатывает. Я хочу, чтобы состояние пользователя изменилось, вызывая рендеринг «Домашнего» экрана.
Знаете ли вы, почему onAuthStateChanged может не вызывать повторную визуализацию app. js?
import 'react-native-gesture-handler';
import React, {useEffect, useState} from 'react';
import firestore from '@react-native-firebase/firestore';
import auth from '@react-native-firebase/auth';
import {NavigationContainer} from '@react-navigation/native';
import {createStackNavigator} from '@react-navigation/stack';
import {
LoginScreen,
HomeScreen,
RegistrationScreen,
HomePage,
} from './src/screens';
const Stack = createStackNavigator();
export default function App() {
const [loading, setLoading] = useState(true);
const [user, setUser] = useState(null);
useEffect(() => {
console.log('hello from home screen');
const usersRef = firestore().collection('users');
auth().onAuthStateChanged(user => {
if (user) {
usersRef
.doc(user.uid)
.get()
.then(document => {
const userData = document.data();
setLoading(false);
setUser(userData);
console.log('hello from auth');
})
.catch(error => {
setLoading(false);
});
} else {
setLoading(false);
}
});
}, []);
if (loading) {
return <></>;
}
return (
<NavigationContainer>
<Stack.Navigator>
{user ? (
<Stack.Screen name="Home">
{props => <HomePage {...props} extraData={user} />}
</Stack.Screen>
) : (
<>
<Stack.Screen name="Login" component={LoginScreen} />
<Stack.Screen name="Registration" component={RegistrationScreen} />
</>
)}
</Stack.Navigator>
</NavigationContainer>
);
}
Регистровый компонент:
import React, {useState} from 'react';
import {Image, Text, TextInput, TouchableOpacity, View} from 'react-native';
import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scroll-view';
import styles from './styles';
import firestore from '@react-native-firebase/firestore';
import auth from '@react-native-firebase/auth';
export default function RegistrationScreen({navigation}) {
const [fullName, setFullName] = useState('');
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [confirmPassword, setConfirmPassword] = useState('');
const onFooterLinkPress = () => {
navigation.navigate('Login');
};
const onRegisterPress = () => {
if (password !== confirmPassword) {
alert("Passwords don't match.");
return;
}
auth()
.createUserWithEmailAndPassword(email, password)
.then(async response => {
const uid = response.user.uid;
const data = {
id: uid,
email,
fullName,
};
const usersRef = await firestore().collection('users');
usersRef
.doc(uid)
.set(data)
.then(() => {
navigation.navigate('Home', {additionalUserInfo: data});
})
.catch(error => {
alert(error);
});
})
.catch(error => {
alert(error);
});
};
return (
<View style={styles.container}>
<KeyboardAwareScrollView
style={{flex: 1, width: '100%'}}
keyboardShouldPersistTaps="always">
<Image
style={styles.logo}
source={require('../../../assets/icon.png')}
/>
<TextInput
style={styles.input}
placeholder="Full Name"
placeholderTextColor="#aaaaaa"
onChangeText={text => setFullName(text)}
value={fullName}
underlineColorAndroid="transparent"
autoCapitalize="none"
/>
<TextInput
style={styles.input}
placeholder="E-mail"
placeholderTextColor="#aaaaaa"
onChangeText={text => setEmail(text)}
value={email}
underlineColorAndroid="transparent"
autoCapitalize="none"
/>
<TextInput
style={styles.input}
placeholderTextColor="#aaaaaa"
secureTextEntry
placeholder="Password"
onChangeText={text => setPassword(text)}
value={password}
underlineColorAndroid="transparent"
autoCapitalize="none"
/>
<TextInput
style={styles.input}
placeholderTextColor="#aaaaaa"
secureTextEntry
placeholder="Confirm Password"
onChangeText={text => setConfirmPassword(text)}
value={confirmPassword}
underlineColorAndroid="transparent"
autoCapitalize="none"
/>
<TouchableOpacity
style={styles.button}
onPress={() => onRegisterPress()}>
<Text style={styles.buttonTitle}>Create account</Text>
</TouchableOpacity>
<View style={styles.footerView}>
<Text style={styles.footerText}>
Already got an account?{' '}
<Text onPress={onFooterLinkPress} style={styles.footerLink}>
Log in
</Text>
</Text>
</View>
</KeyboardAwareScrollView>
</View>
);
}