Авторизация по 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() чтобы обновить пользователя после регистрации?