реагировать навигация "навигация" функция не работает внутри firebase Асинхронный вход в систему - PullRequest
0 голосов
/ 06 октября 2018

Я следую известному учебнику «Полное реагирование на родной курс», я использую реактивную навигацию с использованием редукса и базы, моя проблема в том, что он использует устаревшую «реактивную"native-router-flux", я пытался следовать ему, но проект вообще не строится.

Я пытался пошагово перенести его на официальную реакцию-навигацию, проблема в том, что при попыткедля навигации изнутри Асинхронная функция (например, функция входа в Firebase), навигация не работает, (учитывая, что я использую приставку)

** Обновление: Решение найдено, ниже работает код:

вот мой код асинхронной функции (внутри actions.js):

import firebase from 'firebase';
import { NavigationActions } from 'react-navigation'

import {
    EMAIL_CHANGED,
    PASSWORD_CHANGED,
    LOGIN_USER_SUCCESS,
    LOGIN_USER_FAIL,
    LOGIN_USER
} from './types';

export const emailChanged = (text) => {
    return {
        type: EMAIL_CHANGED,
        payload: text

    };
};

export const passwordChanged = (text) => {
    return {
        type: PASSWORD_CHANGED,
        payload: text

    };
};

export const loginUser = ({email, password}, NavigationActions) => {
    return (dispatch) => {
        //indicate start user log in process
        dispatch({type: LOGIN_USER});

    firebase.auth().signInWithEmailAndPassword(email,password)
        .then(user => loginUserSuccess(dispatch, user, NavigationActions))
            .catch(() => {
            firebase.auth().createUserWithEmailAndPassword(email, password)
                .then(user  => loginUserSuccess(dispatch, user, NavigationActions))
                    .catch(() => loginUserFail(dispatch));
        });
    };
};

const loginUserFail = (dispatch) => {
    dispatch({type: LOGIN_USER_FAIL});
}

const loginUserSuccess = (dispatch, user, NavigationActions) => {

    dispatch({
        type: LOGIN_USER_SUCCESS,
        payload: user,

    });


      NavigationActions.navigate({ routeName: 'employeeList' })

    };

и файл моего маршрутизатора:

import React from 'react';
import { StackNavigator } from 'react-navigation';
import LoginForm from './components/LoginForm';
import EmployeeList from './components/EmployeeList';


const Router = StackNavigator({
    login: { screen: LoginForm },
    employeeList: {screen: EmployeeList },

   },
   {

    initialRouteName: 'login',
   });

export default Router;

и App.js:

import React, { Component } from 'react';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import reducers from './reducers';
import firebase from 'firebase';
import ReduxThunk from 'redux-thunk';
//import LoginForm from './components/LoginForm';
import Router from './Router';

class App extends Component {

    componentWillMount(){
        const config = {
            apiKey: "AIzaSyDV_vLg656D36E8T9GVraA6ZmZrcUi2QH4",
            authDomain: "XXXXXXXXXX.firebaseapp.com",
            databaseURL: "https://XXXXXXXXX.firebaseio.com",
            projectId: "manager-ba44d",
            storageBucket: "manager-ba44d.appspot.com",
            messagingSenderId: "200262066369"
          };
          firebase.initializeApp(config);
    }

    render() {
        const store= createStore(reducers, {}, applyMiddleware(ReduxThunk));
        return (
            <Provider store={store}>
                <Router />
            </Provider>

        );
    }
}

export default App;

мой компонент входа в систему, который вызывает функцию Asynch:

import React, { Component } from 'react';
import { View, Text } from 'react-native';
import { connect } from 'react-redux';
import { emailChanged, passwordChanged, loginUser } from '../actions';
import { Card, CardSection, Input, Button, Spinner } from './common';

class LoginForm extends Component {
    static navigationOptions = () => ({
        title: 'Login screen',
        headerTitleStyle: { 
            textAlign:"center", 
            flex:1
         }
    });

    onEmailChange(text){
        this.props.emailChanged(text);
    }

    onPasswordChange(text){
        this.props.passwordChanged(text);
    }


    onButtonPress(){
        const {email, password, navigation} = this.props;
        this.props.loginUser({email, password}, navigation);
    }

    renderError(){
        if(this.props.error){
            return(
                <View style={{backgroundColor: 'white'}}>
                    <Text style={styles.errorTextStyle}>
                        {this.props.error}
                    </Text>
                </View>
            )
        }
    }

    renderButton(){
        if(this.props.loading){
            return <Spinner size="large" />;
        }

        return (
            <Button 
                    style={styles.buttonStyle}
                    buttonText="Login" onPress={this.onButtonPress.bind(this)}>
            </Button>
        );

    }

    render(){
        return(
            <Card>
                <CardSection>
                    <Input 
                    label="Email"
                    placeholder="email@gmail.com"
                    onChangeText={this.onEmailChange.bind(this)}
                    value={this.props.email}
                    />
                </CardSection>

                <CardSection>
                    <Input 
                    secureTextEntry
                    label="password"
                    placeholder="password"
                    onChangeText={this.onPasswordChange.bind(this)}
                    value={this.props.password}
                    />

                </CardSection>

                {this.renderError()}

                <CardSection>

                    {this.renderButton()}
                </CardSection>
            </Card>

        );
    }
}

const mapStateToProps = state => {
    return {
        email: state.auth.email,
        password: state.auth.password,
        error: state.auth.error,
        loading: state.auth.loading

    };

};

export default connect(mapStateToProps, 
    { 
    emailChanged,
    passwordChanged,
    loginUser
    })(LoginForm);


    const styles = {
        errorTextStyle: {
            fontSize: 20,
            alignSelf: 'center',
            color: 'red'

        },
        buttonStyle:{
            flex: 1,
        flexDirection: 'row',
        alignSelf: 'stretch'
        }
    }

1 Ответ

0 голосов
/ 06 октября 2018

ОБНОВЛЕНИЕ

Вам нужно импортировать NavigationActions, как это

import { NavigationActions } from 'react-navigation'

export const loginUser = ({email, password}, navigation) => {
    return (dispatch) => {
        //indicate start user log in process
        dispatch({type: LOGIN_USER});

    firebase.auth().signInWithEmailAndPassword(email,password)
        .then(user => loginUserSuccess(dispatch, user))
        .then(NavigationActions.navigate('employeeList'))
        .catch(() => {
            firebase.auth().createUserWithEmailAndPassword(email, password)
                .then(user  => loginUserSuccess(dispatch, user, navigation))
                    .catch(() => loginUserFail(dispatch));
        });
    };
};

const loginUserFail = (dispatch) => {
    dispatch({type: LOGIN_USER_FAIL});
}

const loginUserSuccess = (dispatch, user, navigation) => {

    dispatch({
        type: LOGIN_USER_SUCCESS,
        payload: user,

    });

   NavigationActions.reset({
      index: 0,
      actions: [NavigationActions.navigate({ routeName: 'employeeList' })],
    }),


}; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...