router.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import React from 'react';
  2. import {
  3. ToastAndroid,
  4. BackHandler,
  5. DeviceEventEmitter,
  6. Platform
  7. } from 'react-native';
  8. import {connect} from 'react-redux';
  9. import {
  10. createReduxContainer,
  11. createReactNavigationReduxMiddleware,
  12. createNavigationReducer,
  13. } from 'react-navigation-redux-helpers';
  14. import {
  15. NavigationActions,
  16. } from 'react-navigation';
  17. import RootStack from './root'
  18. import {getUrlParameter} from './utils/index';
  19. export const routerReducer = createNavigationReducer(RootStack);
  20. export const routerMiddleware = createReactNavigationReduxMiddleware(
  21. Platform.OS === 'ios' ? (state) => state.router : state => state.nav ,
  22. );
  23. const AppStack = createReduxContainer(RootStack, 'root');
  24. let lastBackPressed = 0;
  25. function getActiveRouteName(navigationState) {
  26. if (!navigationState) {
  27. return null;
  28. }
  29. const route = navigationState.routes[navigationState.index];
  30. if (route.routes) {
  31. return getActiveRouteName(route);
  32. }
  33. return route.routeName;
  34. }
  35. @connect(({app, router}) => ({app, router}))
  36. class Router extends React.PureComponent {
  37. componentDidMount() {
  38. DeviceEventEmitter.addListener('PushFromAndroid', this.handleAndroidMessage.bind(this));
  39. BackHandler.addEventListener('hardwareBackPress', this.backHandle);
  40. }
  41. componentWillUnmount() {
  42. BackHandler.removeEventListener('hardwareBackPress', this.backHandle);
  43. }
  44. handleAndroidMessage(message) {
  45. const type = getUrlParameter('type', message);
  46. const targetId = getUrlParameter('target_id', message);
  47. switch (type) {
  48. case "ASKEXPERT": //学霸问题
  49. this.props.dispatch(NavigationActions.navigate({
  50. routeName: 'QuestionDetail',
  51. params: {question_id: targetId,},
  52. action: NavigationActions.navigate({routeName: 'DiscoverHome'})
  53. })
  54. );
  55. break;
  56. }
  57. }
  58. backHandle = () => {
  59. const currentScreen = getActiveRouteName(this.props.router);
  60. if (currentScreen === 'Login') {
  61. return true;
  62. }
  63. const MainRouteNames = ['SalesHome', 'MineHome', 'Login',];
  64. if (MainRouteNames.indexOf(currentScreen) === -1) {
  65. this.props.dispatch(NavigationActions.back());
  66. return true;
  67. } else {
  68. if (lastBackPressed && lastBackPressed + 2000 >= Date.now()) {
  69. //最近2秒内按过back键,可以退出应用。
  70. return false;
  71. }
  72. lastBackPressed = Date.now();
  73. ToastAndroid.show('再按一次退出应用', ToastAndroid.SHORT);
  74. return true;
  75. }
  76. };
  77. render() {
  78. const {dispatch, router} = this.props;
  79. return <AppStack
  80. dispatch={dispatch}
  81. state={router}
  82. />;
  83. }
  84. }
  85. export default Router;