tsrntemp 1.1.2 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +1 -1
- package/template/.node-version +1 -1
- package/template/.prettierrc.js +15 -7
- package/template/Gemfile +6 -6
- package/template/Gemfile.lock +98 -0
- package/template/android/app/src/main/java/com/template/MainActivity.java +35 -40
- package/template/android/gradlew +234 -234
- package/template/ios/Podfile.lock +652 -0
- package/template/ios/template.xcodeproj/project.pbxproj +704 -702
- package/template/ios/template.xcworkspace/contents.xcworkspacedata +10 -0
- package/template/package.json +50 -49
- package/template/src/config/color.ts +37 -37
- package/template/src/config/routeArr.ts +25 -0
- package/template/src/pages/Home/index.tsx +24 -14
- package/template/src/pages/Login/index.tsx +58 -0
- package/template/src/pages/Mine/index.tsx +27 -14
- package/template/src/route/BottomTab.tsx +42 -9
- package/template/src/route/RouteContainer.tsx +152 -24
- package/template/src/types/RouteParamList.ts +4 -3
- package/template/src/utils/request.ts +5 -6
- package/template/src/utils/storage.ts +13 -15
- package/template/yarn.lock +1344 -1228
- package/template/.ruby-version +0 -1
- package/template/jest.config.js +0 -4
- package/template/src/config/routeConfig.ts +0 -11
- package/template/src/types/RoteConfig.ts +0 -9
@@ -1,28 +1,156 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
import {
|
5
|
-
import
|
6
|
-
import
|
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
|
-
<
|
13
|
-
<
|
14
|
-
<
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
}
|
28
|
-
|
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,7 +2,7 @@
|
|
2
2
|
/**
|
3
3
|
* 使用可参照https://www.npmjs.com/package/umi-request
|
4
4
|
*/
|
5
|
-
import {
|
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
|
-
|
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
|
-
|