7

내 목표는 사용자가 이미 로그인 한 경우 사용자를 Home 구성 요소로 리디렉션하는 것입니다. 이 호출 된 경우에만 사용자를 로그인하고 Home으로 리디렉션 할 수 있습니다. . 그러나 일단 Home 구성 요소로 리디렉션되면 시뮬레이터를 새로 고침하면 앱이 Login 구성 요소로 돌아갑니다.React Native - Firebase 사용자를 홈 구성 요소로 리디렉션

componentWillMount()let user = firebaseApp.auth().currentUser을 사용하여이 문제를 해결하려고했습니다. 그러나 심지어 콘솔에 user을 기록했지만 if 수표가 else 문으로 곧바로 들어가는 것처럼 보입니다. 나는 어떤 통찰력을 주셔서 감사합니다!

index.ios.js

import React, { Component } from 'react'; 
import { Scene, Router } from 'react-native-router-flux'; 
import { 
    AppRegistry, 
} from 'react-native'; 

// Components 
import Login from './components/user/login/login'; 
import Home from './components/user/home/home'; 

class AppName extends Component { 
    render() { 
    return (
     <Router> 
     <Scene key="root"> 
      <Scene key="login" component={Login} title="Login" hideNavBar={true} initial={true}/> 
      <Scene key="home" component={Home} title="Home"/> 
     </Scene> 
     </Router> 
    ); 
    } 
} 


AppRegistry.registerComponent('AppName',() => AppName); 

login.js

import React, { Component } from 'react'; 
import { 
    AlertIOS, 
    Dimensions, 
    Image, 
    ScrollView, 
    StyleSheet, 
    Text, 
    TextInput, 
    TouchableOpacity, 
    View 
} from 'react-native'; 

import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view'; 
import { Actions } from 'react-native-router-flux'; 

import firebaseApp from 'AppName/firebase_setup'; 

// Set width and height to screen dimensions 
const { width, height } = Dimensions.get("window"); 

// For Firebase Auth 
const auth = firebaseApp.auth(); 

// Removed styles for StackOverflow 

export default class Login extends Component { 
    constructor(props) { 
    super(props); 

    this.state = { 
     email: '', 
     password: '' 
    } 
    } 

    componentWillMount() { 
    let user = auth.currentUser; 
    if (user != null) { 
     console.log(user); 
     Actions.home 
    } else { 
     return; 
    } 
    } 

    render() { 
    return (
     <View style={styles.mainContainer}> 
     <KeyboardAwareScrollView 
      style={styles.scrollView} 
      keyboardShouldPersistTaps={false} 
      automaticallyAdjustContentInsets={true} 
      alwaysBonceVertical={false} 
     > 
      <View style={styles.loginContainer}> 

      <View style={styles.inputContainer}> 

       <TextInput 
       style={styles.formInput} 
       placeholder="Email" 
       keyboardType="email-address" 
       autoFocus={true} 
       autoCorrect={false} 
       autoCapitalize="none" 
       onChangeText={(email) => this.setState({email})} 
       /> 

       <TextInput 
       style={styles.formInput} 
       secureTextEntry={true} 
       placeholder="Password" 
       autoCorrect={false} 
       autoCapitalize="none" 
       onChangeText={(password) => this.setState({password})} 
       /> 

       <TouchableOpacity 
       style={styles.loginButton} 
       onPress={this._logInUser.bind(this)} 
       > 
       <Text style={styles.loginButtonText}>Log In</Text> 
       </TouchableOpacity> 

       <TouchableOpacity> 
       <Text style={styles.toSignupButton}>Dont have an account? Create one!</Text> 
       </TouchableOpacity> 

      </View> 
      </View> 

      <View style={styles.footer}> 
      <Text style={styles.footerText}> 
       By signing up, I agree to TextbookSwap's <Text style={styles.footerActionText}>Terms of Service</Text> and <Text style={styles.footerActionText}>Privacy Policy</Text>. 
      </Text> 
      </View> 
     </KeyboardAwareScrollView> 
     </View> 
    ); 
    } 

    _logInUser() { 
    let email = this.state.email; 
    let password = this.state.password; 

    auth.signInWithEmailAndPassword(email, password) 
     .then(Actions.home) 
     .catch((error) => { 
     AlertIOS.alert(
      `${error.code}`, 
      `${error.message}` 
     ); 
     }); 
    } 
} 
+0

죄송합니다. 완전한 답변을 말씀 드릴 수 없습니다. 그러나 [스위치 기능] (https://github.com/aksonov/react-native-router-flux/blob/master/docs/OTHER_INFO.md#switch-new-feature)이 여기 유용 할 수 있다고 생각합니다. –

답변

5

첫째,에 : 여기

내 (내가 라우팅 react-native-router-flux을 사용하고 있습니다) 코드 동기 구성 요소로 currentUser를 확인하는 로그인 구성 요소가 있지만 아직 사용 가능하지 않을 수 있습니다. 가능하다면 componentWillMount. 당신은 비동기 적으로 공급받을 수 있습니다 :.

firebase.auth().onAuthStateChanged(function(user) { 
    if (user) { 
    // User is signed in. 
    } else { 
    // No user is signed in. 
    } 
}); 

는 사용자가 로그인되어있는 경우 Actions.home()를 호출하기에 충분합니다 대부분의 경우 그러나 앱이 사용자가 로그인 화면에서까지이 논리를 이동 할 수 있습니다 성장함에 따라. Kyle이 제안했듯이 Switch 기능을 사용할 수 있습니다. 그것은 일반적으로 같은 REDUX 사용, (인용 문서에) : 당신이 REDUX를 사용하지 않을 경우

const RootSwitch = connect(state => ({loggedIn: state.transient.loggedIn}))(Switch); 
const rootSelector = props => props.loggedIn ? 'workScreens' : 'authScreens'; 

const scenes = Actions.create(
    <Scene key="root" tabs={true} component={RootSwitch} selector={rootSelector}> 
    <Scene key="authScreens" hideNavBar={true}> 
     <Scene key="login" component={Login} initial={true}/> 
     <Scene key="register" component={Register} /> 
     ... 
    </Scene> 
    <Scene key="workScreens"> 
     <Scene key="home" component={Home} initial={true}/> 
     <Scene key="profile" component={ProfileMain}/> 
     ... 
    </Scene> 
    </Scene> 
); 

, 당신은 대신 수동으로 반응-REDUX의 연결을 사용하는 스위치를 감싸고 스위치에 소품 loggedIn 전달할 수 있습니다 . 예를 들어, 다음 래퍼에서 firebase onAuthStateChanged를들을 수 있습니다.

class FirebaseSwitch extends Component { 

    state = { 
    loggenIn: false 
    } 

    componentWillMount() { 
    firebase.auth().onAuthStateChanged(user => 
     this.setState({loggedIn: !!user}) 
    ); 
    } 

    render() { 
    return <Switch loggedIn={this.state.loggedIn} {...this.props}/>; 
    } 
} 
+0

나는 당신의 해결책을 좋아합니다. 나는 Redux없이 구현하려고하는데'connect is undefined'라고하는이 에러가 발생합니다. 이것은 Redux 방법입니까? Redux없이 어떻게해야합니까? 필자는'FirebaseSwitch' 컴포넌트를 생성하여 여러분이 제안한 것처럼'index.ios.js' 파일로 가져 왔습니다. 다시 한 번 감사드립니다! – szier

+0

예, 연결은 react-redux입니다. 라우터 장면에서 RootSwitch를 FirebaseSwitch로 바꾸십시오. –

+0

고맙습니다. 나는 시뮬레이터를 다시로드 할 때마다로드되는 초기 'Scene'이 항상'authScreens'이므로'rootSelector'가'props.loggedIn'을 어떻게 호출 할 수 있는지 궁금합니다. – szier

관련 문제