tsrntemp 1.1.2 → 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,28 +1,156 @@
1
- import React from 'react';
2
- import { NavigationContainer } from '@react-navigation/native';
3
- import { createNativeStackNavigator } from '@react-navigation/native-stack';
4
- import { SafeAreaProvider } from 'react-native-safe-area-context';
5
- import RouteArr from 'config/routeConfig';
6
- import { StackParamList } from 'types/RouteParamList';
1
+ import React, {useReducer, useMemo, useEffect} from 'react';
2
+ import {StyleSheet, View, ActivityIndicator} from 'react-native';
3
+ import {NavigationContainer} from '@react-navigation/native';
4
+ import {createNativeStackNavigator} from '@react-navigation/native-stack';
5
+ import {SafeAreaProvider} from 'react-native-safe-area-context';
6
+ import Login from 'pages/Login';
7
+ import {StackParamList} from 'types/RouteParamList';
8
+ import Storage from 'utils/storage';
9
+ import color from 'config/color';
10
+ import RouteArr from 'config/routeArr';
7
11
 
8
- const Stack = createNativeStackNavigator<StackParamList>()
12
+ const Stack = createNativeStackNavigator<StackParamList>();
13
+
14
+ export const AuthContext = React.createContext<{
15
+ isSignedIn: boolean;
16
+ signIn: (T: any) => void;
17
+ signOut: () => void;
18
+ }>({
19
+ isSignedIn: false,
20
+ signIn: () => {},
21
+ signOut: () => {},
22
+ });
23
+
24
+ type State = {
25
+ isLoading: boolean;
26
+ isSignout: boolean;
27
+ userInfo: undefined | string;
28
+ };
29
+
30
+ type Action =
31
+ | {type: 'RESTORE_TOKEN'; user: undefined | string}
32
+ | {type: 'SIGN_IN'; user: string}
33
+ | {type: 'SIGN_OUT'};
34
+
35
+ // APP初始化加载登录信息
36
+ const SplashScreen = () => {
37
+ return (
38
+ <View style={styles.content}>
39
+ <ActivityIndicator />
40
+ </View>
41
+ );
42
+ };
9
43
 
10
44
  const RouterContainer: React.FC = () => {
45
+ // 初始化登录信息
46
+ const [state, dispatch] = useReducer<React.Reducer<State, Action>>(
47
+ (prevState, action) => {
48
+ switch (action.type) {
49
+ case 'RESTORE_TOKEN':
50
+ return {
51
+ ...prevState,
52
+ userInfo: action.user,
53
+ isLoading: false,
54
+ };
55
+ case 'SIGN_IN':
56
+ return {
57
+ ...prevState,
58
+ isLoading: false,
59
+ isSignout: false,
60
+ userInfo: action.user,
61
+ };
62
+ case 'SIGN_OUT':
63
+ return {
64
+ ...prevState,
65
+ isSignout: true,
66
+ isLoading: false,
67
+ userInfo: undefined,
68
+ };
69
+ }
70
+ },
71
+ {
72
+ isLoading: true,
73
+ isSignout: false,
74
+ userInfo: undefined,
75
+ },
76
+ );
77
+
78
+ // 获取当前登录信息
79
+ useEffect(() => {
80
+ Storage.getItem('userInfo').then(res => {
81
+ if (!res) {
82
+ return dispatch({type: 'SIGN_OUT'});
83
+ }
84
+ return dispatch({type: 'SIGN_IN', user: res});
85
+ });
86
+ }, []);
87
+
88
+ const isSignedIn = state.userInfo !== undefined;
89
+
90
+ const authContext = useMemo(
91
+ () => ({
92
+ isSignedIn,
93
+ signIn: (T: any) => {
94
+ dispatch({type: 'SIGN_IN', user: T});
95
+ Storage.setItem('userInfo', T);
96
+ },
97
+ signOut: () => {
98
+ dispatch({type: 'SIGN_OUT'});
99
+ Storage.clearItem('userInfo');
100
+ },
101
+ }),
102
+ [isSignedIn],
103
+ );
104
+
105
+ if (state.isLoading) {
106
+ return <SplashScreen />;
107
+ }
108
+
11
109
  return (
12
- <SafeAreaProvider>
13
- <NavigationContainer>
14
- <Stack.Navigator
15
- screenOptions={{
16
- headerBackTitleVisible: false,
17
- headerTitleAlign: 'center'
18
- }}
19
- >
20
- {
21
- RouteArr.map(v => <Stack.Screen key={v.name} name={v.name} component={v.component} options={v.options} />)
22
- }
23
- </Stack.Navigator>
24
- </NavigationContainer>
25
- </SafeAreaProvider>
26
- )
27
- }
28
- export default RouterContainer
110
+ <AuthContext.Provider value={authContext}>
111
+ <SafeAreaProvider>
112
+ <NavigationContainer>
113
+ <Stack.Navigator
114
+ screenOptions={{
115
+ headerBackTitleVisible: false,
116
+ headerTitleAlign: 'center',
117
+ headerStyle: {
118
+ backgroundColor: color.primary[400],
119
+ },
120
+ }}>
121
+ {isSignedIn ? (
122
+ <Stack.Group>
123
+ {RouteArr.map(v => (
124
+ <Stack.Screen
125
+ key={v.name}
126
+ name={v.name}
127
+ component={v.component}
128
+ options={v.options ?? {}}
129
+ />
130
+ ))}
131
+ </Stack.Group>
132
+ ) : (
133
+ <Stack.Group>
134
+ <Stack.Screen
135
+ name="Login"
136
+ component={Login}
137
+ options={{headerTitle: '登录'}}
138
+ />
139
+ </Stack.Group>
140
+ )}
141
+ </Stack.Navigator>
142
+ </NavigationContainer>
143
+ </SafeAreaProvider>
144
+ </AuthContext.Provider>
145
+ );
146
+ };
147
+
148
+ const styles = StyleSheet.create({
149
+ content: {
150
+ flex: 1,
151
+ padding: 16,
152
+ justifyContent: 'center',
153
+ },
154
+ });
155
+
156
+ export default RouterContainer;
@@ -2,8 +2,9 @@
2
2
  export type BottomTabParamList = {
3
3
  Home: undefined;
4
4
  Mine: undefined;
5
- }
5
+ };
6
6
 
7
7
  export type StackParamList = {
8
- BottomTab: undefined
9
- }
8
+ BottomTab: undefined;
9
+ Login: undefined;
10
+ };
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * 使用可参照https://www.npmjs.com/package/umi-request
4
4
  */
5
- import { extend, ResponseError } from 'umi-request';
5
+ import {extend, ResponseError} from 'umi-request';
6
6
 
7
7
  //错误处理
8
8
  const errorHandler = (error: ResponseError) => {
@@ -17,13 +17,12 @@ const errorHandler = (error: ResponseError) => {
17
17
  // The request was made but no response was received or error occurs when setting up the request.
18
18
  console.log(error.message);
19
19
  }
20
- }
20
+ };
21
21
 
22
22
  const request = extend({
23
23
  // prefix:'',
24
24
  timeout: 1000,
25
- errorHandler
26
- })
25
+ errorHandler,
26
+ });
27
27
 
28
-
29
- export default request
28
+ export default request;
@@ -6,64 +6,62 @@
6
6
  import AsyncStorage from '@react-native-async-storage/async-storage';
7
7
 
8
8
  export default class Storage {
9
-
10
9
  //读取数据
11
10
  static async getItem(key: string) {
12
11
  try {
13
- return AsyncStorage.getItem(key)
12
+ return AsyncStorage.getItem(key);
14
13
  } catch (error) {
15
- console.log(error)
14
+ console.log(error);
16
15
  }
17
16
  }
18
17
 
19
18
  //保存数据
20
19
  static async setItem(key: string, val: string) {
21
- return AsyncStorage.setItem(key, val)
20
+ const value = typeof val === 'string' ? val : JSON.stringify(val);
21
+ return AsyncStorage.setItem(key, value);
22
22
  }
23
23
 
24
24
  //更新保存数据
25
25
  static async updateItem(key: string, val: string) {
26
26
  try {
27
- return AsyncStorage.mergeItem(key, val)
27
+ return AsyncStorage.mergeItem(key, val);
28
28
  } catch (error) {
29
- console.log(error)
29
+ console.log(error);
30
30
  }
31
31
  }
32
32
 
33
33
  //清除指缓存
34
34
  static async clearItem(key: string) {
35
- return AsyncStorage.removeItem(key)
35
+ return AsyncStorage.removeItem(key);
36
36
  }
37
37
 
38
38
  // 获取所有已存储的键
39
39
  static async getAllKeys() {
40
- return AsyncStorage.getAllKeys()
40
+ return AsyncStorage.getAllKeys();
41
41
  }
42
42
 
43
43
  // 批量获取数据
44
44
  static async getMultiple(key: readonly string[]) {
45
- return AsyncStorage.multiGet(key)
45
+ return AsyncStorage.multiGet(key);
46
46
  }
47
47
 
48
48
  // 批量设置数据
49
49
  static async multiSet(keyValuePairs: [string, string][]) {
50
- return AsyncStorage.multiSet(keyValuePairs)
50
+ return AsyncStorage.multiSet(keyValuePairs);
51
51
  }
52
52
 
53
53
  // 批量更新数据
54
54
  static async updateMultiple(keyValuePairs: [string, string][]) {
55
- return AsyncStorage.multiMerge(keyValuePairs)
55
+ return AsyncStorage.multiMerge(keyValuePairs);
56
56
  }
57
57
 
58
58
  //批量移除
59
59
  static async multiClear(key: string[]) {
60
- return AsyncStorage.multiRemove(key)
60
+ return AsyncStorage.multiRemove(key);
61
61
  }
62
62
 
63
63
  // 清除所有缓存
64
64
  static async clearAll() {
65
- return AsyncStorage.clear()
65
+ return AsyncStorage.clear();
66
66
  }
67
-
68
67
  }
69
-