Firebase, регистрация пользователей и проблема навигации - PullRequest
0 голосов
/ 15 марта 2020

Я использую React Native, Firebase и реагировать навигатор.

В компоненте LoadingScreen я наблюдаю изменения состояния (onAuthStateChanged)

    componentDidMount() {
        this.timer = setInterval(
            () => firebase.auth().onAuthStateChanged(user => {
                user ? this.props.navigation.navigate("App") : this.props.navigation.navigate("Auth");
            }),
            30,
        );
    }

В моем AuthStack в компоненте ChooseRole у меня есть функция, в которой я хочу зарегистрировать пользователя вместе с ролью должно быть выполнено.

if (this.state.role === 'child') {
                Firebase
                    .auth ()
                    .createUserWithEmailAndPassword (email, password)
                    .then (() => {
                        const addChildRole = fc.httpsCallable (('addChildRole'));
                        addChildRole ({email: this.state.email}). then ((result) =>
                            this.setState ({role: result}));
                    })
                    .catch (errorMessage => {
                        console.log (errorMessage)
                    });
            })

Проблема в том, что перед тем, как .then () вызывает, когда я добавляю роль, состояние Auth, вероятно, изменяется и перемещается в приложение. В AppStack, компонент Direction, основанный на роли, я хочу нацелить на дочерний или родительский компонент, но вызывая

firebase.auth (). CurrentUser.getIdTokenResult ()
         .then ((idTokenResult) => {
         if (idTokenResult.claims.parent || idTokenResult.claims.child) {
}

idTokenResult.claims.parent и idTokenResult.claims.child дает undefined.

Я хочу справиться с предоставлением пользователям роли регистрации и входа в систему, а затем переходить к соответствующему компоненту с помощью Direction. js.

У вас есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 15 марта 2020

Не обязательно причина вашей проблемы, но слишком долго, чтобы оставить комментарий.

Нет необходимости повторно вызывать onAuthStateChanged. Вы можете вызвать его только один раз, и он будет прослушивать изменения состояния аутентификации с этого момента. Вызов его через короткие промежутки времени, когда вы делаете это, обязательно вызовет проблемы.

Сделайте это в componentDidMount вместо:

componentDidMount() {
    firebase.auth().onAuthStateChanged(user => {
        user ? this.props.navigation.navigate("App") : this.props.navigation.navigate("Auth");
    });
}

Что может быть причиной Проблема действительно в том, что onAuthStateChanged запускается до того, как запись в вашу базу данных завершится. Вы можете легко проверить это, добавив некоторые операторы регистрации.

Если это так, у вас есть два основных способа решения проблемы:

  1. Не используйте прослушиватель onAuthStateChanged в componentDidMount, но просто проверьте значение firebase.auth().currentUser. При этом не используется прослушиватель, поэтому он не мешает записи в базу данных.
  2. Удалите onAuthStateChanged непосредственно перед созданием пользователя, чтобы он не срабатывал. Вы можете сделать это, сохранив возвращаемое значение от вызова до onAuthStateChanged, который является функцией отмены подписки. Так что-то вроде:

    componentDidMount() {
        stopAuthStateListener = firebase.auth().onAuthStateChanged(user => {
            ...
    

    А потом:

    if (this.state.role === 'child') {
        stopAuthStateListener();
        Firebase
            .auth ()
            .createUserWithEmailAndPassword (email, password)
            ...
    
...