Авторизация по Email и паролю в мобильное приложение с использованием firebase

Пишу авторизацию по email/password в firebase. Не понимаю как правильно сделать. Так храню state:

 const [userEmail, setStateEmail] = useState({});
    const [userPassword, setStatePassword] = useState({});

Написал такой метод с регистрацией пользователя:

  async function signUp() {
        try {
            await firebase
                .auth()
                .createUserWithEmailAndPassword(userEmail.toString(), userPassword.toString())
                .then();
        } catch (error) {
            console.log(error.toString());
            switch (error.code) {
                case 'auth/email-already-in-use': {
                    alert('Пользователь уже зарегистрирован')
                    break
                }
            }
        }
        const user = firebase.auth().currentUser;
        const emailVerified = user.emailVerified;
        if (emailVerified === false) {
            firebase.auth().onAuthStateChanged(function (user) {
                user.sendEmailVerification();
                alert("Мы отправили письмо с подтверждением Вам на электронную почту:" + userEmail)
            })
        }
    }

Такой метод с авторизацией пользователя:

 async function LogIn() {
        await firebase.auth().onAuthStateChanged(function (user) {
            if (user){
                firebase.auth().currentUser.reload()
                const userAfterReload = firebase.auth().currentUser;
                const emailVerified = userAfterReload.emailVerified;
                if (emailVerified) {
                    try {
                        firebase
                            .auth()
                            .signInWithEmailAndPassword(userEmail.toString(), userPassword.toString())
                            .then(() => navigation.navigate('UserInformation'))
                    } catch (error) {
                        switch (error.code) {
                            case 'auth/wrong-password': {
                                alert('Вы ввели неверный пароль')
                                break
                            }
                            case 'auth/invalid-email': {
                                alert('Вы ввели некорректный Email')
                                break
                            }
                            case 'auth/user-not-found': {
                                alert('Пользователь с таким адресом электронной почты не зарегистрирован')
                                break
                            }
                        }
                    }
                } else
                    alert("Пожалуйста, подтвердите электронную почту, мы уже направили Вам письмо на " + userEmail + "!:)")
            } else alert("пользователь не авторизован")
        });
    }

JSX который возвращает компонента:

return (
        <Container>
            <Form>
                <Item floatingLabel>
                    <Label>Email</Label>
                    <Input autoCapitalize="none"
                           autoCorrect={false}
                           onChangeText={userEmail => setStateEmail(userEmail)}
                    />
                </Item>
                <Item floatingLabel>
                    <Label>Пароль</Label>
                    <Input
                        secureTextEntry={true}
                        autoCapitalize="none"
                        autoCorrect={false}
                        onChangeText={userPassword => setStatePassword(userPassword)}
                    />
                </Item>
                <Button full rounded success onPress={() => LogIn(setStateEmail, setStatePassword)}>
                    <Text>Войти</Text>
                </Button>
                <Button full rounded success style={{marginTop: 20}}
                        onPress={() => signUp(setStateEmail, setStatePassword)}>
                    <Text>Создать аккаунт</Text>
                </Button>
                <Button full rounded success style={{marginTop: 20}}
                        onPress={() => navigation.navigate('ForgotPassword')}>
                    <Text>Забыли пароль?</Text>
                </Button>
            </Form>
        </Container>
    );

Когда пользователь регистрируется я отправляю ему на почту письмо с подтверждением, и если пользователь подтвердит и нажмёт "Войти" то emailVerified останется false и его не пустит, поэтому я при каждом вызове метода "LogIn" я вызываю firebase.auth().currentUser.reload() - чтобы обновить пользователя и он смог войти сразу после регистрации. Я сталкиваюсь с ошибкой когда хочу просто авторизоваться в приложении, ведь при нажатии LogIn и проверке подтверждён ли у пользователя email самого пользователя ещё нет он не авторизован ведь метод .signInWithEmailAndPassword вызывается ниже моей проверки, в то же время я же не могу авторизовывать пользователя с неподтверджённым emailом. Возможно надо всё таки сначала вызывать .signInWithEmailAndPassword а потом уже все проверки проводить, но в таком случае как и когда вызывать firebase.auth().currentUser.reload() чтобы обновить пользователя после регистрации?


Ответы (0 шт):