index.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. "use strict";
  2. import React, {Component} from 'react';
  3. import {NavigationActions, StackActions} from 'react-navigation';
  4. export default BareNavigator => {
  5. let navigator, state;
  6. const refNavigator = me => navigator = me;
  7. const refState = (prevState, newState) => state = newState;
  8. class Navigator extends Component {
  9. render () {
  10. return <BareNavigator
  11. ref={refNavigator}
  12. onNavigationStateChange={refState}
  13. />;
  14. }
  15. }
  16. const {navigate, back} = NavigationActions;
  17. const {reset} = StackActions;
  18. const topOfNavigationStack = () => state.routes[state.routes.length - 1] || {};
  19. const isRoute = expected => ({routeName}) => routeName === expected;
  20. const isTopRoute = expected => isRoute(expected)(topOfNavigationStack());
  21. const navigationHelpers = {
  22. topOfNavigationStack,
  23. navigate: (...args) => navigator.dispatch(navigate(...args)),
  24. back: (...args) => navigator.dispatch(back(...args)),
  25. reset: (...args) => navigator.dispatch(reset(...args)),
  26. resetRoutes: routeNames => navigator.dispatch(reset({
  27. actions: routeNames.map(routeName => navigate({routeName})),
  28. index: routeNames.length - 1
  29. })),
  30. isRoute,
  31. isTopRoute,
  32. goBackFrom: routeName => {
  33. if (isTopRoute(routeName)) {
  34. navigator.dispatch(back());
  35. }
  36. },
  37. };
  38. return {Navigator, navigationHelpers};
  39. };