import { effects } from 'redux-saga'; import { NavigationActions } from 'react-navigation'; import { redirect } from './action'; import NavigationConfiguration from '../configuration/NavigationConfiguration'; import { REDIRECT, AUTHENTICATE, UNAUTHENTICATE, } from './constants'; const navConfig = new NavigationConfiguration(); const isAuthenticatedRouteName = navConfig.isAuthenticatedRouteName; const isUnauthenticatedRouteName = navConfig.isUnauthenticatedRouteName; const initialAuthenticatedRouteName = navConfig.getInitialAuthenticatedRouteName(); const initialUnauthenticatedRouteName = navConfig.getInitialUnauthenticatedRouteName(); function* redirectFlow() { const state = yield effects.select(); const authenticated = state.auth.authenticated; const index = state.nav.index; const routeName = state.nav.routes[index].routeName; const redirectRoute = (name, childRouteName) => NavigationActions.reset({ index: 0, actions: [ NavigationActions.navigate({ routeName: name }) ], }); if (authenticated && !isAuthenticatedRouteName(routeName)) { yield effects.put(redirectRoute(initialAuthenticatedRouteName)) } else if (!authenticated && !isUnauthenticatedRouteName(routeName)) { yield effects.put(redirectRoute(initialUnauthenticatedRouteName)) } } function* authenticateFlow() { yield effects.put(redirect()); } function* unauthenticateFlow() { yield effects.put(redirect()); } export default function* root() { yield effects.takeLatest(REDIRECT, redirectFlow); yield effects.takeLatest(AUTHENTICATE, authenticateFlow); yield effects.takeLatest(UNAUTHENTICATE, unauthenticateFlow); }