Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@agm1984
Last active October 31, 2017 08:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save agm1984/bacf17a75cec5a88227f922f3592a5ee to your computer and use it in GitHub Desktop.
Save agm1984/bacf17a75cec5a88227f922f3592a5ee to your computer and use it in GitHub Desktop.
React Native, Redux, JWT & Remember Me
//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