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.
- 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
|
-
|