Reputation: 1400
I am trying to setState using redux. I am using facebook to login and once I get the facebookAccessToken
I want to set that to global state using redux and call back the global state using a button. Below is my code:
App.js
import { createStore } from 'redux'
import { Provider } from 'react-redux'
import { createDrawerNavigator, createStackNavigator, } from 'react-navigation'
const reducer = (state = '', action) => {
switch (action.type) {
case 'UPDATE':
return { facebookToken: action.payload}
}
return state
}
const store = createStore(reducer)
class App extends Component {
render(){
return(
<Provider store={store}>
<View style={{flex:1,backgroundColor:'transparent'}}>
<AppDrawerNavigator/>
</View>
</Provider>
)
}
}
LoginScreen.js
import { LoginButton, AccessToken } from 'react-native-fbsdk';
import {connect} from 'react-redux'
class LoginScreen extends Component{
render() {
return(
<View>
<LoginButton
onLoginFinished={
(error, result) => {
if (error) {
console.log("login has error: " + result.error);
} else if (result.isCancelled) {
console.log("login is cancelled.");
} else {
this.props.navigation.navigate('VerifyScreen')
AccessToken.getCurrentAccessToken().then(
(data) => {
this.setState({facebookToken:data.accessToken},
() => console.log('facebookToken.state',this.state.facebookToken),
//Here I am getting undefined for 'this.props.facebookToken'
() => console.log('facebookToken.props',this.props.facebookToken),
console.log('facebook login success!'),
console.log('facebook token is:',data.accessToken.toString()))
}
)
}
}
}
onLogoutFinished={() => console.log("logout.")}/>
//I created a button to see if I could call global state. but this would give me an error "state is not defined"
<Button
title="call global state"
onPress={() => this.props.updateState()}/>
</View>
)
}
}
function mapStateToProps(state) {
return {
facebookToken: state.facebookToken
}
}
function mapDispatchToProps(dispatch) {
return {
updateState: () => dispatch({ type: 'UPDATE',payload: state.facebookToken }),
}
}
export default connect(mapStateToProps, mapDispatchToProps)(LoginScreen)
My question:
1) In my LoginScreen
why am I getting undefined
for "this.props.facebookToken" is this because I haven't call the function "updateState"?
2) In my 'LoginScreen' once I successfully login with facebook, I get AccessToken
and assuming that this.props.facebookToken
is set to data.accessToken
. So when I press the button,I am expecting to get globalState
but it gives me an error state
is not defined.
I am really new to redux so any comments or advise would be really helpful. Thanks in advance!
Upvotes: 0
Views: 698
Reputation: 109
For your # 1 question, you are correct because you did not call the updateState method.
For your # 2 question try this. The state is never defined in that block of code, because you did not pass a state object.
function mapDispatchToProps(dispatch) {
return {
updateState: () => dispatch({ type: 'UPDATE', payload: state.facebookToken }),
}
}
change that to
function mapDispatchToProps(dispatch) {
return {
updateState: (state) => dispatch({ type: 'UPDATE', payload: state.facebookToken }),
}
}
then change the
onPress={() => this.props.updateState()}
to
onPress={() => this.props.updateState(this.state)}
Upvotes: 1