@norcy/react-native-toolkit 0.3.18 → 0.3.20

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.
@@ -0,0 +1,133 @@
1
+ import { User } from 'leancloud-storage';
2
+ import { Platform } from 'react-native';
3
+ import {
4
+ LoginAuthDataType,
5
+ LoginType,
6
+ LoginUserDataType,
7
+ UserType,
8
+ } from './constant';
9
+
10
+ const AV = require('leancloud-storage');
11
+
12
+ const AVUserToLocalUser = (user: User): UserType => {
13
+ return {
14
+ id: user.get('objectId') ?? user.id ?? '',
15
+ nickname: user.get('nickname'),
16
+ email: user.get('email'),
17
+ headimgurl: user.get('headimgurl'),
18
+ type: user.get('type'),
19
+ vipType: user.get('vipType'),
20
+ vipEndTime: user.get('vipEndTime'),
21
+ createdAt: user.getCreatedAt(),
22
+ attr: user.get('attr'),
23
+ webdav: user.get('webdav'),
24
+ };
25
+ };
26
+
27
+ const getLoginTypeNum = (loginType?: string) => {
28
+ if (loginType === 'wechat') {
29
+ return LoginType.LoginTypeWeChat;
30
+ }
31
+ if (loginType === 'visitor') {
32
+ return LoginType.LoginTypeVisitor;
33
+ }
34
+ if (loginType === 'huawei') {
35
+ return LoginType.LoginTypeHuawei;
36
+ }
37
+ return LoginType.LoginTypeApple;
38
+ };
39
+
40
+ export const LeanCloudAuth = {
41
+ getCurrentUser: async (): Promise<UserType | null> => {
42
+ const user = await AV.User.currentAsync();
43
+ return user ? AVUserToLocalUser(user) : null;
44
+ },
45
+
46
+ loginWithAuthData: async (
47
+ authData: LoginAuthDataType,
48
+ userData?: LoginUserDataType
49
+ ): Promise<UserType> => {
50
+ console.log('Lean Cloud 开始登录', userData);
51
+ // loginType 空说明是老用户
52
+ const loginType = authData.loginType || 'apple';
53
+
54
+ try {
55
+ const user: User = await AV.User.loginWithAuthData(authData, loginType, {
56
+ failOnNotExist: true,
57
+ });
58
+ console.log('Lean Cloud 登录成功');
59
+ // 每次重新鉴权都更新头像和昵称,避免微信头像过期
60
+ // if (userData?.nickname) {
61
+ // user.set('nickname', userData?.nickname);
62
+ // }
63
+ // if (userData?.headimgurl) {
64
+ // user.set('headimgurl', userData?.headimgurl);
65
+ // }
66
+ // user.save();
67
+ return AVUserToLocalUser(user);
68
+ } catch (error: any) {
69
+ if (error.code !== 211) {
70
+ console.log('Lean Cloud 登录失败', error);
71
+ throw error;
72
+ }
73
+
74
+ // 创建用户,并补充资料
75
+ console.log('创建用户,并补充资料');
76
+ const newUser = new AV.User();
77
+ if (userData?.email) {
78
+ newUser.setEmail(userData.email);
79
+ }
80
+ newUser.set('nickname', userData?.nickname);
81
+ newUser.set('headimgurl', userData?.headimgurl);
82
+ newUser.set('type', getLoginTypeNum(loginType));
83
+ if (Platform.OS === 'android') {
84
+ newUser.set('source', 2);
85
+ }
86
+ try {
87
+ const user: User = await newUser.loginWithAuthData(authData, loginType);
88
+ console.log('Lean Cloud 注册成功');
89
+ const localUser = AVUserToLocalUser(user);
90
+ localUser.isNew = true;
91
+ return localUser;
92
+ } catch (error2) {
93
+ console.log('Lean Cloud 登录失败', error2);
94
+ throw error2;
95
+ }
96
+ }
97
+ },
98
+
99
+ logout: () => {
100
+ AV.User.logOut();
101
+ },
102
+
103
+ updateUser: async (keys: string[], values: any[]): Promise<UserType> => {
104
+ const user = await AV.User.currentAsync();
105
+ if (!user) {
106
+ throw new Error('User Not Login Yet');
107
+ }
108
+ const oldValues: any[] = [];
109
+ for (let i = 0; i < keys.length; i++) {
110
+ oldValues.push(user.get(keys[i]));
111
+ user.set(keys[i], values[i]);
112
+ }
113
+ try {
114
+ const newUser = await user.save();
115
+ return AVUserToLocalUser(newUser);
116
+ } catch (error) {
117
+ for (let i = 0; i < keys.length; i++) {
118
+ user.set(keys[i], oldValues[i]);
119
+ }
120
+ throw error;
121
+ }
122
+ },
123
+
124
+ destroyUser: async () => {
125
+ const user = await AV.User.currentAsync();
126
+ if (!user) {
127
+ throw new Error('User Not Login Yet');
128
+ }
129
+ console.log('get user success');
130
+ await user.destroy();
131
+ console.log('delete user success');
132
+ },
133
+ };
@@ -1,7 +1,6 @@
1
- import { User } from 'leancloud-storage';
2
- import { Platform } from 'react-native';
3
1
  import { getUniqueIdSync } from 'react-native-device-info';
4
2
  import { AppleLoginUtil } from './AppleLoginUtil';
3
+ import { Auth } from './Auth';
5
4
  import { HuaweiLoginUtil } from './HuaweiLoginUtil';
6
5
  import { Notification } from './Notification';
7
6
  import { BuildInPrefs, PrefData } from './PrefData';
@@ -20,7 +19,7 @@ export type LoginSuccessResultType = {
20
19
  isAuto?: boolean;
21
20
  user: UserType;
22
21
  };
23
- export type LoginFailResulType = {
22
+ export type LoginFailResultType = {
24
23
  isAuto?: boolean;
25
24
  error: string | object;
26
25
  code?: string;
@@ -33,25 +32,6 @@ type LoginFinishParams = {
33
32
  code?: string;
34
33
  };
35
34
 
36
- const AV = require('leancloud-storage');
37
-
38
- let CURRENT_USER: UserType | null = null;
39
-
40
- const AVUserToLocalUser = (user: User) => {
41
- return {
42
- id: user.get('objectId') ?? user.id ?? '',
43
- nickname: user.get('nickname'),
44
- email: user.get('email'),
45
- headimgurl: user.get('headimgurl'),
46
- type: user.get('type'),
47
- vipType: user.get('vipType'),
48
- vipEndTime: user.get('vipEndTime'),
49
- createdAt: user.getCreatedAt(),
50
- attr: user.get('attr'),
51
- webdav: user.get('webdav'),
52
- };
53
- };
54
-
55
35
  const onLoginFinish = ({
56
36
  isAuto = false,
57
37
  user,
@@ -70,88 +50,27 @@ const onLoginFinish = ({
70
50
  }
71
51
  };
72
52
 
73
- const doLeanCloudLogin = async (
53
+ const doLogin = async (
74
54
  authData: LoginAuthDataType,
75
- userData: LoginUserDataType | undefined,
76
- callback: ({ user, error }: { user?: UserType; error?: any }) => void
55
+ userData?: LoginUserDataType
77
56
  ) => {
78
- console.log('Lean Cloud 开始登录', userData);
79
- // loginType 空说明是老用户
80
- const loginType = authData.loginType ? authData.loginType : 'apple';
81
- let loginTypeNum = LoginType.LoginTypeApple;
82
- if (loginType === 'wechat') {
83
- loginTypeNum = LoginType.LoginTypeWeChat;
84
- } else if (loginType === 'visitor') {
85
- loginTypeNum = LoginType.LoginTypeVisitor;
86
- } else if (loginType === 'huawei') {
87
- loginTypeNum = LoginType.LoginTypeHuawei;
57
+ try {
58
+ const user = await Auth.loginWithAuthData(authData, userData);
59
+ onLoginFinish({ user });
60
+ } catch (error: any) {
61
+ onLoginFinish({ error });
88
62
  }
89
-
90
- AV.User.loginWithAuthData(authData, loginType, { failOnNotExist: true }).then(
91
- (user: User) => {
92
- // 登录成功
93
- console.log('Lean Cloud 登录成功');
94
- // 每次重新鉴权都更新头像和昵称,避免微信头像过期
95
- // if (userData?.nickname) {
96
- // user.set('nickname', userData?.nickname);
97
- // }
98
- // if (userData?.headimgurl) {
99
- // user.set('headimgurl', userData?.headimgurl);
100
- // }
101
- // user.save();
102
- CURRENT_USER = AVUserToLocalUser(user);
103
- callback({ user: CURRENT_USER });
104
- },
105
- (error: any) => {
106
- if (error.code === 211) {
107
- // 创建用户,并补充资料
108
- console.log('创建用户,并补充资料');
109
- const newUser = new AV.User();
110
- const email = userData?.email;
111
- if (email) {
112
- newUser.setEmail(email);
113
- }
114
- newUser.set('nickname', userData?.nickname);
115
- newUser.set('headimgurl', userData?.headimgurl);
116
- newUser.set('type', loginTypeNum);
117
- if (Platform.OS === 'android') {
118
- newUser.set('source', 2);
119
- }
120
- newUser.loginWithAuthData(authData, loginType).then(
121
- (user: User) => {
122
- // 登录成功
123
- console.log('Lean Cloud 注册成功');
124
- CURRENT_USER = AVUserToLocalUser(user);
125
- CURRENT_USER.isNew = true;
126
- // 标记为当前用户是在本机注册的 TODO
127
- PrefData.setValue(BuildInPrefs.RegisterInThisDevice, true);
128
- callback({ user: CURRENT_USER });
129
- },
130
- (error2: any) => {
131
- // 登录失败
132
- console.log('Lean Cloud 登录失败', error2);
133
- callback({ error: error2 });
134
- }
135
- );
136
- } else {
137
- // 登录失败
138
- console.log('Lean Cloud 登录失败', error);
139
- callback({ error: error });
140
- }
141
- }
142
- );
143
63
  };
144
64
 
145
65
  export const LoginManager = {
146
66
  // 自动根据已有的 User 信息进行登录鉴权,如果 User 为空则失败
147
67
  autoLogin: async () => {
148
- const user = await AV.User.currentAsync();
149
- if (user) {
68
+ try {
69
+ const user = await Auth.autoLogin();
150
70
  console.log('自动登录成功');
151
- CURRENT_USER = AVUserToLocalUser(user);
152
- onLoginFinish({ isAuto: true, user: CURRENT_USER });
153
- } else {
154
- onLoginFinish({ isAuto: true, error: 'User Not Login Yet' });
71
+ onLoginFinish({ isAuto: true, user });
72
+ } catch (error: any) {
73
+ onLoginFinish({ isAuto: true, error });
155
74
  }
156
75
  },
157
76
 
@@ -163,18 +82,18 @@ export const LoginManager = {
163
82
  qrcodeCallback?: (qrcode: string) => void
164
83
  ) => {
165
84
  // 如果之前已经鉴权过,则直接使用上次鉴权的 AuthData
166
- const cuurentUser = await AV.User.currentAsync();
167
- if (cuurentUser) {
168
- await LoginManager.autoLogin();
85
+ try {
86
+ const user = await Auth.autoLogin();
87
+ onLoginFinish({ isAuto: true, user });
169
88
  return;
89
+ } catch (_) {
90
+ // 自动登录失败,继续正常登录流程
170
91
  }
171
92
 
172
93
  // 改为注入 delegate
173
94
  if (__DEV__) {
174
95
  if (devAuthData) {
175
- doLeanCloudLogin(devAuthData, undefined, ({ user, error }) => {
176
- onLoginFinish({ user, error });
177
- });
96
+ await doLogin(devAuthData);
178
97
  return;
179
98
  }
180
99
  }
@@ -202,13 +121,7 @@ export const LoginManager = {
202
121
  onLoginFinish({ error: error2 });
203
122
  } else {
204
123
  loadingCallback && loadingCallback();
205
- doLeanCloudLogin(
206
- userData.authData,
207
- userData,
208
- ({ user: loginUser, error: error3 }) => {
209
- onLoginFinish({ user: loginUser, error: error3 });
210
- }
211
- );
124
+ doLogin(userData.authData, userData);
212
125
  }
213
126
  }
214
127
  );
@@ -243,13 +156,7 @@ export const LoginManager = {
243
156
  },
244
157
  };
245
158
  loadingCallback && loadingCallback();
246
- doLeanCloudLogin(
247
- userData.authData,
248
- userData,
249
- ({ user, error: error2 }) => {
250
- onLoginFinish({ user, error: error2 });
251
- }
252
- );
159
+ doLogin(userData.authData, userData);
253
160
  }
254
161
  }
255
162
  );
@@ -284,13 +191,7 @@ export const LoginManager = {
284
191
  },
285
192
  };
286
193
  loadingCallback && loadingCallback();
287
- doLeanCloudLogin(
288
- userData.authData,
289
- userData,
290
- ({ user, error: error2 }) => {
291
- onLoginFinish({ user, error: error2 });
292
- }
293
- );
194
+ doLogin(userData.authData, userData);
294
195
  }
295
196
  }
296
197
  );
@@ -305,9 +206,7 @@ export const LoginManager = {
305
206
  },
306
207
  };
307
208
  loadingCallback && loadingCallback();
308
- doLeanCloudLogin(userData.authData, userData, ({ user, error }) => {
309
- onLoginFinish({ user, error });
310
- });
209
+ doLogin(userData.authData, userData);
311
210
  } else if (type === LoginType.LoginTypeHuawei) {
312
211
  HuaweiLoginUtil.doLogin(
313
212
  ({ nickname, headimgurl, openid, unionid, error }) => {
@@ -324,13 +223,7 @@ export const LoginManager = {
324
223
  },
325
224
  };
326
225
  loadingCallback && loadingCallback();
327
- doLeanCloudLogin(
328
- userData.authData,
329
- userData,
330
- ({ user, error: error2 }) => {
331
- onLoginFinish({ user, error: error2 });
332
- }
333
- );
226
+ doLogin(userData.authData, userData);
334
227
  }
335
228
  }
336
229
  );
@@ -341,8 +234,7 @@ export const LoginManager = {
341
234
 
342
235
  logOut: (callback?: Function) => {
343
236
  console.log('onLogout');
344
- AV.User.logOut();
345
- CURRENT_USER = null;
237
+ Auth.logOut();
346
238
  callback && callback();
347
239
  Notification.postNotification('onLogout');
348
240
  },
@@ -359,8 +251,7 @@ export const LoginManager = {
359
251
  },
360
252
 
361
253
  currentUser: () => {
362
- // console.log('current user is ', CURRENT_USER);
363
- return CURRENT_USER;
254
+ return Auth.currentUser();
364
255
  },
365
256
 
366
257
  batchUpdateUser: async (
@@ -368,26 +259,13 @@ export const LoginManager = {
368
259
  values: any[],
369
260
  callback?: Function
370
261
  ) => {
371
- console.log('Batch Update User Begin: ' + keys + ' ' + values);
372
- const user = await AV.User.currentAsync();
373
- if (!user) {
374
- return;
375
- }
376
- const oldValues = [];
377
- for (let i = 0; i < keys.length; i++) {
378
- oldValues.push(user.get(keys[i]));
379
- user.set(keys[i], values[i]);
380
- }
381
262
  try {
382
- const newUser = await user.save();
383
- CURRENT_USER = AVUserToLocalUser(newUser);
263
+ console.log('Batch Update User Begin: ' + keys + ' ' + values);
264
+ const user = await Auth.batchUpdateUser(keys, values);
384
265
  console.log('Batch Update User End', user);
385
266
  callback && callback();
386
267
  } catch (e) {
387
268
  console.error(e);
388
- for (let i = 0; i < keys.length; i++) {
389
- user.set(keys[i], oldValues[i]);
390
- }
391
269
  callback && callback(e);
392
270
  }
393
271
  },
@@ -398,16 +276,14 @@ export const LoginManager = {
398
276
 
399
277
  deleteUser: async (callback: Function) => {
400
278
  try {
401
- if (!CURRENT_USER) {
279
+ const currentUser = Auth.currentUser();
280
+ if (!currentUser) {
402
281
  return;
403
282
  }
404
- if (CURRENT_USER.type === LoginType.LoginTypeApple) {
283
+ if (currentUser.type === LoginType.LoginTypeApple) {
405
284
  await AppleLoginUtil.requestDeleteAccount();
406
285
  }
407
- const user = await AV.User.currentAsync();
408
- console.log('get user success');
409
- await user.destroy();
410
- console.log('delete user success');
286
+ await Auth.deleteUser();
411
287
  callback();
412
288
  } catch (error) {
413
289
  console.error(error);
@@ -433,7 +309,6 @@ export const LoginManager = {
433
309
  );
434
310
  },
435
311
 
436
- // 已注册天数
437
312
  getRegisterDays: () => {
438
313
  if (!LoginManager.isLogin()) {
439
314
  return 0;