router.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. import React, { PureComponent } from 'react'
  2. import { BackHandler, Animated, Easing } from 'react-native'
  3. import {
  4. StackNavigator,
  5. TabNavigator,
  6. TabBarBottom,
  7. addNavigationHelpers,
  8. NavigationActions,
  9. } from 'react-navigation'
  10. import {
  11. initializeListeners,
  12. createReduxBoundAddListener,
  13. createReactNavigationReduxMiddleware,
  14. } from 'react-navigation-redux-helpers'
  15. import { connect } from 'react-redux'
  16. import Testaa from './testaaa'
  17. import { isIphoneX } from './containers/common/theme/config'
  18. import { SETHEADER } from './containers/Global'
  19. //首页Tab里的内容
  20. import Home from './containers/home/Home'
  21. import CommodityHome from './containers/commodity/CommodityHome'
  22. import MineHome from './containers/mine/MineHome'
  23. import OrderHome from './containers/order/OrderHome'
  24. import ShoppingCartHome from './containers/shoppingcart/ShoppingCartHome'
  25. //最近浏览更多
  26. import RecentViewMore from './containers/home/RecentView'
  27. // 商家公告
  28. import Announcement from './containers/home/AnnouncementTab'
  29. import AnnounceDetail from './containers/home/announcement/AnnounceDetail'
  30. //待审核
  31. import Pending from './containers/home/pending/Pending'
  32. // 待发货
  33. import Unshipped from './containers/home/unshipped/Unshipped'
  34. // 待收货
  35. import Dispatched from './containers/home/dispatched/Dispatched'
  36. // 补货
  37. import Replenishment from './containers/home/replenishment/Replenishment'
  38. // 商品展示
  39. import CommodityShowbase from './containers/commodity/CommodityShowbase'
  40. // 商品详情
  41. /**
  42. * info:订单
  43. *
  44. **/
  45. // 订单编辑
  46. import OrderEdit from './containers/order/OrderEdit'
  47. // 订单支付
  48. import OrderPay from './containers/order/orderamanage/OrderPay'
  49. // 订单详情
  50. import OrderDetail from './containers/order/OrderDetail'
  51. // 订单日志
  52. import OrderLog from './containers/order/OrderLog'
  53. // 退货申请
  54. import ReturnApplication from './containers/order/ordertoptab/returnsign/ReturnApplication'
  55. // 退货编辑
  56. import ReturnEdit from './containers/order/ordertoptab/returnsign/ReturnEdit'
  57. // 促销选商品
  58. import OrderGifts from './containers/order/orderamanage/OrderGifts'
  59. // 退货详情
  60. import ReturnDetail from './containers/order/ordertoptab/returnsign/ReturnDetail'
  61. // 选择发票
  62. import SelectInvoice from './containers/common/SelectInvoice'
  63. // 选择地址
  64. import SelectAdress from './containers/common/SelectAdress'
  65. import CommodityTab from './containers/commodity/commoditydetail/Tab'
  66. import DeliveryDetail from './containers/order/ordertoptab/deliverysign/DeliveryDetail'
  67. import Loading from './containers/Loading'
  68. import Login from './containers/Login'
  69. import LogForget from './containers/LogForget'
  70. /**
  71. * info:我的
  72. *
  73. **/
  74. // 账户
  75. import Account from './containers/mine/header/Account'
  76. // 费用
  77. import Cost from './containers/mine/header/Cost'
  78. import CostDetail from './containers/mine/header/CostDetail'
  79. // 信用
  80. import Credit from './containers/mine/header/Credit'
  81. // 应付对账
  82. import PayReconciliation from './containers/mine/viewlist/PayReconciliation'
  83. // 费用对账
  84. import CostReconciliation from './containers/mine/viewlist/CostReconciliation'
  85. import ReconciliationDetail from './containers/mine/viewlist/ReconciliationDetail'
  86. // 基本信息
  87. import BasicInfo from './containers/mine/viewlist/BasicInfo'
  88. // 客户收货地址
  89. import CustomerAddress from './containers/mine/viewlist/CustomerAddress'
  90. // 客户联系人
  91. import CustomerContact from './containers/mine/viewlist/CustomerContact'
  92. // 我的供应商
  93. import Supplier from './containers/mine/viewlist/Supplier'
  94. // 付款单登记
  95. import PaymentRegister from './containers/mine/viewlist/paymentregister/PaymentRegister'
  96. // 付款单新增
  97. import PaymentAdd from './containers/mine/viewlist/paymentregister/PaymentAdd'
  98. // 付款单关联订单界面
  99. import PaymentAssociate from './containers/mine/viewlist/paymentregister/PaymentAssociate'
  100. // 支付单
  101. import RechargeHome from './containers/mine/viewlist/recharge/RechargeHome'
  102. // 支付单新增
  103. import RechargeAdd from './containers/mine/viewlist/recharge/RechargeAdd'
  104. import Setting from './containers/mine/Setting'
  105. const HomeNavigator = TabNavigator(
  106. {
  107. Home: {
  108. getScreen: () => Home,
  109. path: 'tab/Home',
  110. },
  111. CommodityHome: {
  112. getScreen: () => CommodityHome,
  113. path: 'tab/CommodityHome',
  114. },
  115. OrderHome: {
  116. getScreen: () => OrderHome,
  117. path: 'tab/OrderHome',
  118. },
  119. ShoppingCartHomeTab: {
  120. getScreen: () => ShoppingCartHome,
  121. path: 'tab/ShoppingCartHomeTab',
  122. },
  123. MineHome: {
  124. getScreen: () => MineHome,
  125. path: 'tab/MineHome',
  126. },
  127. },
  128. {
  129. initialRouteName: 'Home',
  130. lazy: true,
  131. tabBarComponent: TabBarBottom,
  132. tabBarPosition: 'bottom',
  133. swipeEnabled: false,
  134. animationEnabled: false,
  135. tabStyle: { backgroundColor: 'red' },
  136. tabBarOptions: {
  137. activeTintColor: '#E70013', // 文字和图片选中颜色
  138. inactiveTintColor: '#333', // 文字和图片未选中颜色
  139. showIcon: true, // android 默认不显示 icon, 需要设置为 true 才会显示
  140. },
  141. // lazy: false
  142. }
  143. )
  144. const MainNavigator = StackNavigator(
  145. {
  146. Home: {
  147. getScreen: () => HomeNavigator,
  148. path: 'tab/Home',
  149. navigationOptions: {
  150. header: null,
  151. },
  152. },
  153. CommodityHome: {
  154. getScreen: () => HomeNavigator,
  155. path: 'tab/CommodityHome',
  156. navigationOptions: {
  157. header: null,
  158. },
  159. },
  160. OrderHome: {
  161. getScreen: () => HomeNavigator,
  162. path: 'tab/OrderHome',
  163. navigationOptions: {
  164. header: null,
  165. },
  166. },
  167. ShoppingCartHomeTab: {
  168. getScreen: () => HomeNavigator,
  169. path: 'tab/ShoppingCartHome',
  170. navigationOptions: {
  171. header: null,
  172. },
  173. },
  174. MineHome: {
  175. getScreen: () => HomeNavigator,
  176. path: 'tab/MineHome',
  177. navigationOptions: {
  178. header: null,
  179. },
  180. },
  181. // HomeNavigator: {
  182. // screen: () => <HomeNavigator />,
  183. // navigationOptions: {
  184. // header: null
  185. // }
  186. // },
  187. //最近浏览更多
  188. RecentViewMore: {
  189. screen: RecentViewMore,
  190. navigationOptions: {
  191. // header: null
  192. },
  193. },
  194. // RecentViewMore: () => RecentViewMore,
  195. // 商家公告
  196. Announcement: {
  197. screen: Announcement,
  198. navigationOptions: {
  199. header: null,
  200. },
  201. },
  202. // 公告详情
  203. AnnounceDetail: {
  204. screen: AnnounceDetail,
  205. navigationOptions: {
  206. header: null,
  207. },
  208. },
  209. //待审核
  210. Pending: {
  211. screen: Pending,
  212. navigationOptions: {
  213. header: null,
  214. },
  215. },
  216. // 补货
  217. Replenishment: {
  218. screen: Replenishment,
  219. navigationOptions: {
  220. header: null,
  221. },
  222. },
  223. // 待收货
  224. Dispatched: {
  225. screen: Dispatched,
  226. navigationOptions: {
  227. header: null,
  228. },
  229. },
  230. // 待发货
  231. Unshipped: {
  232. screen: Unshipped,
  233. navigationOptions: {
  234. header: null,
  235. },
  236. },
  237. // 商品展示
  238. CommodityShowbase: {
  239. screen: CommodityShowbase,
  240. navigationOptions: {
  241. header: null,
  242. },
  243. },
  244. // 商品详情
  245. CommodityTab: {
  246. screen: CommodityTab,
  247. navigationOptions: {
  248. header: null,
  249. },
  250. },
  251. // Detail: {
  252. // screen: Detail,
  253. // navigationOptions: {
  254. // header: null
  255. // }
  256. // },
  257. ShoppingCartHome: {
  258. screen: ShoppingCartHome,
  259. navigationOptions: {
  260. header: null,
  261. },
  262. },
  263. // 订单发货详情
  264. DeliveryDetail: {
  265. screen: DeliveryDetail,
  266. navigationOptions: {
  267. header: null,
  268. },
  269. },
  270. // 订单发货详情
  271. OrderEdit: {
  272. screen: OrderEdit,
  273. navigationOptions: {
  274. header: null,
  275. },
  276. },
  277. // 订单支付
  278. OrderPay: {
  279. screen: OrderPay,
  280. navigationOptions: {
  281. header: null,
  282. },
  283. },
  284. // 订单详情
  285. OrderDetail: {
  286. screen: OrderDetail,
  287. navigationOptions: {
  288. header: null,
  289. },
  290. },
  291. // 订单日志
  292. OrderLog: {
  293. screen: OrderLog,
  294. navigationOptions: {
  295. header: null,
  296. },
  297. },
  298. // 退货申请
  299. ReturnApplication: {
  300. screen: ReturnApplication,
  301. navigationOptions: {
  302. header: null,
  303. },
  304. },
  305. // 促销选商品
  306. OrderGifts: {
  307. screen: OrderGifts,
  308. navigationOptions: {
  309. header: null,
  310. },
  311. },
  312. // 选择发票
  313. SelectInvoice: {
  314. screen: SelectInvoice,
  315. navigationOptions: {
  316. header: null,
  317. },
  318. },
  319. // 选择地址
  320. SelectAdress: {
  321. screen: SelectAdress,
  322. navigationOptions: {
  323. header: null,
  324. },
  325. },
  326. // 退货详情
  327. ReturnDetail: {
  328. screen: ReturnDetail,
  329. navigationOptions: {
  330. header: null,
  331. },
  332. },
  333. // 退货编辑
  334. ReturnEdit: {
  335. screen: ReturnEdit,
  336. navigationOptions: {
  337. header: null,
  338. },
  339. },
  340. // 我的
  341. // 账户-我的
  342. Account: {
  343. screen: Account,
  344. navigationOptions: {
  345. header: null,
  346. },
  347. },
  348. // 费用-我的
  349. Cost: {
  350. screen: Cost,
  351. navigationOptions: {
  352. header: null,
  353. },
  354. },
  355. // 费用详情-我的
  356. CostDetail: {
  357. screen: CostDetail,
  358. navigationOptions: {
  359. header: null,
  360. },
  361. },
  362. // 信用-我的
  363. Credit: {
  364. screen: Credit,
  365. navigationOptions: {
  366. header: null,
  367. },
  368. },
  369. // 应付对账-我的
  370. PayReconciliation: {
  371. screen: PayReconciliation,
  372. navigationOptions: {
  373. header: null,
  374. },
  375. },
  376. // 费用对账-我的
  377. CostReconciliation: {
  378. screen: CostReconciliation,
  379. navigationOptions: {
  380. header: null,
  381. },
  382. },
  383. // 对账详情-我的
  384. ReconciliationDetail: {
  385. screen: ReconciliationDetail,
  386. navigationOptions: {
  387. header: null,
  388. },
  389. },
  390. // 基本信息-我的
  391. BasicInfo: {
  392. screen: BasicInfo,
  393. navigationOptions: {
  394. header: null,
  395. },
  396. },
  397. // 客户收货地址-我的
  398. CustomerAddress: {
  399. screen: CustomerAddress,
  400. navigationOptions: {
  401. header: null,
  402. },
  403. },
  404. // 客户联系人-我的
  405. CustomerContact: {
  406. screen: CustomerContact,
  407. navigationOptions: {
  408. header: null,
  409. },
  410. },
  411. // 付款单登记-我的
  412. PaymentRegister: {
  413. screen: PaymentRegister,
  414. navigationOptions: {
  415. header: null,
  416. },
  417. },
  418. // 付款单登记-关联订单界面
  419. PaymentAssociate: {
  420. screen: PaymentAssociate,
  421. navigationOptions: {
  422. header: null,
  423. },
  424. },
  425. // 付款单新增-我的
  426. PaymentAdd: {
  427. screen: PaymentAdd,
  428. navigationOptions: {
  429. header: null,
  430. },
  431. },
  432. // 支付单-我的
  433. RechargeHome: {
  434. screen: RechargeHome,
  435. navigationOptions: {
  436. header: null,
  437. },
  438. },
  439. // 支付单新增-我的
  440. RechargeAdd: {
  441. screen: RechargeAdd,
  442. navigationOptions: {
  443. header: null,
  444. },
  445. },
  446. // 供应商-我的
  447. Supplier: {
  448. screen: Supplier,
  449. navigationOptions: {
  450. header: null,
  451. },
  452. },
  453. },
  454. {
  455. initialRouteName: 'Home',
  456. // initialRouteName: "HomeNavigator",
  457. headerMode: 'float',
  458. }
  459. )
  460. const AppNavigator = StackNavigator(
  461. {
  462. Main: {
  463. screen: MainNavigator,
  464. },
  465. Login: {
  466. screen: Login,
  467. navigationOptions: {
  468. header: null,
  469. },
  470. },
  471. Testaa: {
  472. screen: Testaa,
  473. navigationOptions: {
  474. header: null,
  475. },
  476. },
  477. LogForget: {
  478. screen: LogForget,
  479. navigationOptions: {
  480. header: null,
  481. },
  482. },
  483. Setting: {
  484. screen: Setting,
  485. navigationOptions: {
  486. header: null,
  487. },
  488. },
  489. },
  490. {
  491. initialRouteName: 'Login',
  492. // initialRouteName: "Testaa",
  493. lazy: true,
  494. headerMode: 'none',
  495. mode: 'modal',
  496. navigationOptions: {
  497. gesturesEnabled: false,
  498. },
  499. transitionConfig: () => ({
  500. transitionSpec: {
  501. duration: 300,
  502. easing: Easing.out(Easing.poly(4)),
  503. timing: Animated.timing,
  504. },
  505. screenInterpolator: sceneProps => {
  506. const { layout, position, scene } = sceneProps
  507. const { index } = scene
  508. const height = layout.initHeight
  509. const translateY = position.interpolate({
  510. inputRange: [index - 1, index, index + 1],
  511. outputRange: [height, 0, 0],
  512. })
  513. const opacity = position.interpolate({
  514. inputRange: [index - 1, index - 0.99, index],
  515. outputRange: [0, 1, 1],
  516. })
  517. return { opacity, transform: [{ translateY }] }
  518. },
  519. }),
  520. }
  521. )
  522. const defaultGetStateForAction = MainNavigator.router.getStateForAction
  523. MainNavigator.router.getStateForAction = (action, state) => {
  524. // goBack返回指定页面
  525. if (state && action.type === 'Navigation/BACK' && action.key) {
  526. const backRoute = state.routes.find(route => route.routeName === action.key)
  527. if (backRoute) {
  528. const backRouteIndex = state.routes.indexOf(backRoute)
  529. const purposeState = {
  530. ...state,
  531. routes: state.routes.slice(0, backRouteIndex + 1),
  532. index: backRouteIndex,
  533. }
  534. return purposeState
  535. }
  536. }
  537. return defaultGetStateForAction(action, state)
  538. }
  539. function getCurrentScreen(navigationState) {
  540. if (!navigationState) {
  541. return null
  542. }
  543. const route = navigationState.routes[navigationState.index]
  544. if (route.routes) {
  545. return getCurrentScreen(route)
  546. }
  547. return route.routeName
  548. }
  549. export const routerMiddleware = createReactNavigationReduxMiddleware(
  550. 'root',
  551. state => state.router
  552. )
  553. const addListener = createReduxBoundAddListener('root')
  554. @connect(({ app, router }) => ({ app, router }))
  555. class Router extends PureComponent {
  556. componentWillMount() {
  557. BackHandler.addEventListener('hardwareBackPress', this.backHandle)
  558. let hederStyle = {
  559. height: 60,
  560. paddingTop: 10,
  561. paddingBottom: 0,
  562. }
  563. if (isIphoneX()) {
  564. hederStyle.height = 77
  565. hederStyle.paddingTop = 17
  566. hederStyle.paddingBottom = 34
  567. }
  568. SETHEADER(hederStyle)
  569. }
  570. componentDidMount() {
  571. initializeListeners('root', this.props.router)
  572. }
  573. componentWillUnmount() {
  574. BackHandler.removeEventListener('hardwareBackPress', this.backHandle)
  575. }
  576. backHandle = () => {
  577. const currentScreen = getCurrentScreen(this.props.router)
  578. if (currentScreen === 'Login') {
  579. return true
  580. }
  581. if (currentScreen !== 'Home') {
  582. this.props.dispatch(NavigationActions.back())
  583. return true
  584. }
  585. return false
  586. }
  587. render() {
  588. const { dispatch, app, router } = this.props
  589. if (app.loading) return <Loading />
  590. const navigation = addNavigationHelpers({
  591. dispatch,
  592. state: router,
  593. addListener,
  594. })
  595. return <AppNavigator navigation={navigation} />
  596. }
  597. }
  598. export function routerReducer(state, action = {}) {
  599. return AppNavigator.router.getStateForAction(action, state)
  600. }
  601. export default Router