index.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import {
  2. NavigationContainer,
  3. DefaultTheme,
  4. DarkTheme,
  5. CommonActions,
  6. } from '@react-navigation/native';
  7. import {
  8. createStackNavigator,
  9. CardStyleInterpolators,
  10. } from '@react-navigation/stack';
  11. import * as React from 'react';
  12. import { ColorSchemeName } from 'react-native';
  13. import { useTranslation } from 'react-i18next';
  14. import useModel from 'flooks';
  15. //弹窗模块
  16. import AlertModalScreen from '../modals/AlertModalScreen';
  17. import ModalStackNavigator from './ModalStackNavigator';
  18. //登录模块堆栈
  19. import LoginStackNavigator from './LoginStackNavigator';
  20. //首页堆栈
  21. import MainTabNavigator from './MianTabNavigator';
  22. //我的模块堆栈
  23. import MineStackNavigator from './MineStackNavigator';
  24. import { useCreation } from 'ahooks';
  25. import { RootStackParamList } from '../types';
  26. import LinkingConfiguration from './LinkingConfiguration';
  27. import User from '../stores/User';
  28. export default function Navigation({
  29. colorScheme,
  30. }: {
  31. colorScheme: ColorSchemeName;
  32. }) {
  33. const { initialRouteName } = useModel(User, ['initialRouteName']);
  34. const navRef = React.useRef();
  35. const initRoute = useCreation(() => {
  36. if (__DEV__) {
  37. return {
  38. name: 'Main',
  39. };
  40. } else {
  41. return {
  42. name: initialRouteName !== 'Main' ? 'Login' : initialRouteName,
  43. screen: initialRouteName !== 'Main' ? initialRouteName : 'Order',
  44. };
  45. }
  46. }, [__DEV__, initialRouteName]);
  47. React.useEffect(() => {
  48. if (navRef.current) {
  49. navRef.current.dispatch(
  50. CommonActions.reset({
  51. index: 0,
  52. routes: [
  53. {
  54. name: initRoute.name,
  55. screen: initRoute.screen,
  56. },
  57. ],
  58. })
  59. );
  60. }
  61. }, [navRef, initialRouteName]);
  62. return (
  63. <NavigationContainer
  64. ref={navRef}
  65. linking={LinkingConfiguration}
  66. theme={colorScheme === 'dark' ? DarkTheme : DefaultTheme}
  67. >
  68. <RootNavigator initRoute={initRoute} />
  69. </NavigationContainer>
  70. );
  71. }
  72. const Stack = createStackNavigator<RootStackParamList>();
  73. function RootNavigator({ initRoute }) {
  74. const { t } = useTranslation();
  75. return (
  76. <Stack.Navigator
  77. initialRouteName={initRoute.name}
  78. screenOptions={{
  79. stackPresentation: 'push',
  80. headerShown: false,
  81. }}
  82. >
  83. <Stack.Screen name="Login" component={LoginStackNavigator} />
  84. <Stack.Screen
  85. name="Main"
  86. component={MainTabNavigator}
  87. options={{
  88. cardStyleInterpolator: CardStyleInterpolators.forHorizontalIOS,
  89. }}
  90. />
  91. <Stack.Screen
  92. name="MineStack"
  93. component={MineStackNavigator}
  94. options={{
  95. cardStyleInterpolator: CardStyleInterpolators.forHorizontalIOS,
  96. }}
  97. />
  98. <Stack.Screen
  99. name="Modal"
  100. mode="modals"
  101. component={ModalStackNavigator}
  102. options={{
  103. cardStyle: { backgroundColor: 'transparent' },
  104. animationEnabled: false,
  105. }}
  106. />
  107. </Stack.Navigator>
  108. );
  109. }