index.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. "use strict";
  2. import React, {Component} from 'react';
  3. import {
  4. createReactNavigationReduxMiddleware,
  5. createReduxBoundAddListener,
  6. createNavigationReducer
  7. } from 'react-navigation-redux-helpers';
  8. import {connect} from 'react-redux';
  9. export const navigatorPieces = (BareNavigator, name = "root") => {
  10. const middleware = createReactNavigationReduxMiddleware(name, x => x);
  11. const addListener = createReduxBoundAddListener(name);
  12. const reducer = createNavigationReducer(BareNavigator);
  13. class Navigator extends Component {
  14. render () {
  15. const {dispatch, navigationState} = this.props;
  16. return <BareNavigator
  17. navigation={{dispatch, state: navigationState, addListener}}
  18. />;
  19. }
  20. }
  21. return {Navigator, reducer, middleware};
  22. };
  23. export const connectNavigator = selectorFn => connect(state => ({navigationState: selectorFn(state)}));
  24. import {NavigationActions, StackActions} from 'react-navigation';
  25. const {navigate, back} = NavigationActions;
  26. const {reset} = StackActions;
  27. export const backButtonHandler = ({dispatch, getState}) => {
  28. if (getState().index === 0) return false;
  29. dispatch(back());
  30. return true;
  31. };
  32. const topOfNavigationStack = ({routes}) => routes[routes.length - 1] || {};
  33. const isRoute = expected => ({routeName}) => routeName === expected;
  34. const isTopRoute = expected => state => isRoute(expected)(topOfNavigationStack(state));
  35. export const navigationHelpers = {
  36. topOfNavigationStack,
  37. resetRoutes: routeNames => reset({
  38. actions: routeNames.map(routeName => navigate({routeName})),
  39. index: routeNames.length - 1
  40. }),
  41. isRoute,
  42. isTopRoute,
  43. goBackFrom: routeName => ({dispatch, getState}) => {
  44. if (isTopRoute(routeName)(getState())) {
  45. dispatch(back());
  46. }
  47. },
  48. };