index.js 1.8 KB

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