App.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import * as React from "react";
  2. import * as eva from "@eva-design/eva";
  3. import {
  4. ApplicationProvider,
  5. Layout,
  6. Button,
  7. IconRegistry,
  8. Text,
  9. Modal,
  10. } from "@ui-kitten/components";
  11. import { EvaIconsPack } from "@ui-kitten/eva-icons";
  12. import { default as theme } from "./theme.json"; // <-- Import app theme
  13. import { default as customMapping } from "./mapping.json"; // <-- Import app theme
  14. import { SplashScreen } from "expo";
  15. import * as Font from "expo-font";
  16. import { Ionicons } from "@expo/vector-icons";
  17. import { NavigationContainer, useNavigation } from "@react-navigation/native";
  18. import { createStackNavigator } from "@react-navigation/stack";
  19. import Dialog from "./components/Dialog";
  20. import { useModel } from "flooks";
  21. import * as models from "./models";
  22. import BottomTabNavigator from "./navigation/BottomTabNavigator";
  23. import LoginStackNavigator from "./navigation/LoginStackNavigator";
  24. import GuideStackNavigator from "./navigation/GuideStackNavigator";
  25. import HomeStackNavigator from "./navigation/HomeStackNavigator";
  26. import * as ApplyStatus from "./config/ApplyStatus";
  27. const Stack = createStackNavigator();
  28. export default function App(props) {
  29. const [isLoadingComplete, setLoadingComplete] = React.useState(false);
  30. const { checkLogin, isLogin, status, guideStep } = useModel("userModel");
  31. const { getWords } = useModel("wordsModel", true);
  32. const { getToken } = useModel("httpModel", true);
  33. // Load any resources or data that we need prior to rendering the app
  34. React.useEffect(() => {
  35. async function loadResourcesAndDataAsync() {
  36. try {
  37. SplashScreen.preventAutoHide();
  38. // Load fonts
  39. await Font.loadAsync({
  40. ...Ionicons.font,
  41. "space-mono": require("./assets/fonts/SpaceMono-Regular.ttf"),
  42. });
  43. getWords();
  44. await checkLogin();
  45. } catch (e) {
  46. // We might want to provide this error information to an error reporting service
  47. console.warn(e);
  48. } finally {
  49. setLoadingComplete(true);
  50. SplashScreen.hide();
  51. }
  52. }
  53. loadResourcesAndDataAsync();
  54. }, [props.skipLoadingScreen]);
  55. const initialRouteName = React.useMemo(() => {
  56. console.log(isLogin);
  57. if (isLogin) {
  58. if (status !== "PASS") {
  59. return "Guide";
  60. } else {
  61. return "Root";
  62. }
  63. } else {
  64. return "Login";
  65. }
  66. }, [isLogin, status]);
  67. if (!isLoadingComplete && !props.skipLoadingScreen) {
  68. return null;
  69. } else {
  70. return (
  71. <>
  72. <IconRegistry icons={EvaIconsPack} />
  73. <ApplicationProvider
  74. {...eva}
  75. theme={{ ...eva.light, ...theme }}
  76. customMapping={customMapping}
  77. >
  78. <Dialog />
  79. <Layout style={{ flex: 1 }}>
  80. <NavigationContainer>
  81. <Stack.Navigator
  82. headerMode='none'
  83. initialRouteName={initialRouteName}
  84. >
  85. <Stack.Screen
  86. name='Home'
  87. component={HomeStackNavigator}
  88. />
  89. <Stack.Screen
  90. name='Root'
  91. component={BottomTabNavigator}
  92. />
  93. <Stack.Screen
  94. name='Guide'
  95. component={GuideStackNavigator}
  96. />
  97. <Stack.Screen
  98. name='Login'
  99. component={LoginStackNavigator}
  100. />
  101. </Stack.Navigator>
  102. </NavigationContainer>
  103. </Layout>
  104. </ApplicationProvider>
  105. </>
  106. );
  107. }
  108. }
  109. const container = {
  110. flex: 1,
  111. backgroundColor: "#fff",
  112. };