Last active
October 31, 2017 08:00
-
-
Save agm1984/bacf17a75cec5a88227f922f3592a5ee to your computer and use it in GitHub Desktop.
React Native, Redux, JWT & Remember Me
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//LOGIN VIEW | |
import { | |
initRememberMe, | |
toggleRememberMe | |
} from './login_actions' | |
class LoginForm extends Component { | |
componentWillMount() { | |
this.props.initRememberMe() | |
} | |
// ... | |
<CheckBox | |
style={{ opacity: 0.4 }} | |
value={this.props.isRemembered} | |
onValueChange={() => this.props.toggleRememberMe()} | |
/> | |
// ... | |
export default compose( | |
connect(mapStateToProps, { | |
initRememberMe, | |
toggleRememberMe | |
}) | |
)(LoginForm) | |
//ACTION CREATORS | |
export const initRememberMe = () => async (dispatch) => { | |
try { | |
const isRemembered = await AsyncStorage.getItem('remembered@E1') | |
if (isRemembered === 'SAVED') { | |
return dispatch({ | |
type: LOGIN_REMEMBER_ME, | |
payload: true | |
}) | |
} | |
return dispatch({ | |
type: LOGIN_REMEMBER_ME, | |
payload: false | |
}) | |
} catch (e) { | |
return null | |
} | |
} | |
export const toggleRememberMe = () => async (dispatch) => { | |
try { | |
const isRemembered = await AsyncStorage.getItem('remembered@E1') | |
if (isRemembered === 'SAVED') { | |
await AsyncStorage.removeItem('remembered@E1') | |
return dispatch({ | |
type: LOGIN_REMEMBER_ME, | |
payload: false | |
}) | |
} | |
await AsyncStorage.setItem('remembered@E1', 'SAVED') | |
return dispatch({ | |
type: LOGIN_REMEMBER_ME, | |
payload: true | |
}) | |
} catch (e) { | |
return null | |
} | |
} | |
//REDUCER | |
// ... | |
case LOGIN_REMEMBER_ME: | |
return { | |
...state, | |
isRemembered: action.payload | |
} | |
// ... | |
//INITIALIZE APP ACTION CREATOR (triggered from Splash Screen) | |
export const initializeApp = (navigation) => async (dispatch) => { | |
try { | |
dispatch({ type: INITIALIZE_APP }) | |
const user = await AsyncStorage.getItem('token@E1') | |
const isRemembered = await AsyncStorage.getItem('remembered@E1') | |
if (!user || !isRemembered) return navigation.navigate('Login') | |
dispatch({ | |
type: LOGIN_SUCCESS, | |
payload: user // this toggles state.auth.isAuthenticated to true and navigates to 'Dashboard' | |
}) // which is wrapped in a requireAuth HOC that prevents illegal access | |
return navigation.navigate('Dashboard') | |
} catch (error) { | |
dispatch({ | |
type: LOGIN_SERVER_ERROR, | |
payload: ['There was a problem initializing the app. Please sign in again.'] | |
}) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment