@etsoo/appscript 1.1.76 → 1.1.80

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.
@@ -302,8 +302,9 @@ export interface ICoreApp<S extends IAppSettings, N, C extends NotificationCallP
302
302
  * User login
303
303
  * @param user User data
304
304
  * @param refreshToken Refresh token
305
+ * @param keep Keep login or not
305
306
  */
306
- userLogin(user: IUserData, refreshToken: string): void;
307
+ userLogin(user: IUserData, refreshToken: string, keep?: boolean): void;
307
308
  /**
308
309
  * User logout
309
310
  * @param clearToken Clear refresh token or not
@@ -405,6 +406,7 @@ export declare abstract class CoreApp<S extends IAppSettings, N, C extends Notif
405
406
  * Passphrase for encryption
406
407
  */
407
408
  protected passphrase: string;
409
+ private cachedRefreshToken?;
408
410
  /**
409
411
  * Protected constructor
410
412
  * @param settings Settings
@@ -649,8 +651,9 @@ export declare abstract class CoreApp<S extends IAppSettings, N, C extends Notif
649
651
  * User login
650
652
  * @param user User data
651
653
  * @param refreshToken Refresh token
654
+ * @param keep Keep login or not
652
655
  */
653
- userLogin(user: IUserData, refreshToken: string): void;
656
+ userLogin(user: IUserData, refreshToken: string, keep?: boolean): void;
654
657
  /**
655
658
  * User logout
656
659
  * @param clearToken Clear refresh token or not
@@ -252,8 +252,10 @@ class CoreApp {
252
252
  // Token countdown
253
253
  if (this.authorized)
254
254
  this.refreshCountdown(this.userData.seconds);
255
- else
255
+ else {
256
+ this.cachedRefreshToken = undefined;
256
257
  this.refreshCountdownClear();
258
+ }
257
259
  }
258
260
  /**
259
261
  * Change country or region
@@ -315,7 +317,8 @@ class CoreApp {
315
317
  * Clear cached token
316
318
  */
317
319
  clearCacheToken() {
318
- shared_1.StorageUtils.setLocalData(this.headerTokenField, null);
320
+ this.cachedRefreshToken = undefined;
321
+ shared_1.StorageUtils.setLocalData(this.headerTokenField, undefined);
319
322
  }
320
323
  /**
321
324
  * Decrypt message
@@ -560,6 +563,9 @@ class CoreApp {
560
563
  * @returns Cached token
561
564
  */
562
565
  getCacheToken() {
566
+ // Temp refresh token
567
+ if (this.cachedRefreshToken)
568
+ return this.cachedRefreshToken;
563
569
  const refreshToken = shared_1.StorageUtils.getLocalData(this.headerTokenField, '');
564
570
  if (refreshToken === '')
565
571
  return null;
@@ -740,7 +746,7 @@ class CoreApp {
740
746
  return url;
741
747
  // From relative root, like home:/react/, url: /about => /react/about
742
748
  if (url.startsWith('/'))
743
- return home + url.substr(1);
749
+ return home + url.substring(1);
744
750
  const pathname = window.location.pathname;
745
751
  // Relative
746
752
  const pos = pathname.indexOf(home);
@@ -764,10 +770,17 @@ class CoreApp {
764
770
  * User login
765
771
  * @param user User data
766
772
  * @param refreshToken Refresh token
773
+ * @param keep Keep login or not
767
774
  */
768
- userLogin(user, refreshToken) {
775
+ userLogin(user, refreshToken, keep) {
769
776
  this.userData = user;
770
- this.authorize(user.token, refreshToken);
777
+ if (keep) {
778
+ this.authorize(user.token, refreshToken);
779
+ }
780
+ else {
781
+ this.cachedRefreshToken = refreshToken;
782
+ this.authorize(user.token, undefined);
783
+ }
771
784
  }
772
785
  /**
773
786
  * User logout
@@ -28,6 +28,10 @@ export interface IUserData {
28
28
  */
29
29
  readonly token: string;
30
30
  }
31
+ /**
32
+ * User data property keys
33
+ */
34
+ export declare type UserKey = keyof IUserData;
31
35
  /**
32
36
  * User interface
33
37
  */
@@ -36,4 +40,8 @@ export interface IUser extends IUserData, IState {
36
40
  * Authorized or not
37
41
  */
38
42
  authorized: boolean;
43
+ /**
44
+ * Last update changed fields
45
+ */
46
+ lastChangedFields?: UserKey[];
39
47
  }
@@ -302,8 +302,9 @@ export interface ICoreApp<S extends IAppSettings, N, C extends NotificationCallP
302
302
  * User login
303
303
  * @param user User data
304
304
  * @param refreshToken Refresh token
305
+ * @param keep Keep login or not
305
306
  */
306
- userLogin(user: IUserData, refreshToken: string): void;
307
+ userLogin(user: IUserData, refreshToken: string, keep?: boolean): void;
307
308
  /**
308
309
  * User logout
309
310
  * @param clearToken Clear refresh token or not
@@ -405,6 +406,7 @@ export declare abstract class CoreApp<S extends IAppSettings, N, C extends Notif
405
406
  * Passphrase for encryption
406
407
  */
407
408
  protected passphrase: string;
409
+ private cachedRefreshToken?;
408
410
  /**
409
411
  * Protected constructor
410
412
  * @param settings Settings
@@ -649,8 +651,9 @@ export declare abstract class CoreApp<S extends IAppSettings, N, C extends Notif
649
651
  * User login
650
652
  * @param user User data
651
653
  * @param refreshToken Refresh token
654
+ * @param keep Keep login or not
652
655
  */
653
- userLogin(user: IUserData, refreshToken: string): void;
656
+ userLogin(user: IUserData, refreshToken: string, keep?: boolean): void;
654
657
  /**
655
658
  * User logout
656
659
  * @param clearToken Clear refresh token or not
@@ -249,8 +249,10 @@ export class CoreApp {
249
249
  // Token countdown
250
250
  if (this.authorized)
251
251
  this.refreshCountdown(this.userData.seconds);
252
- else
252
+ else {
253
+ this.cachedRefreshToken = undefined;
253
254
  this.refreshCountdownClear();
255
+ }
254
256
  }
255
257
  /**
256
258
  * Change country or region
@@ -312,7 +314,8 @@ export class CoreApp {
312
314
  * Clear cached token
313
315
  */
314
316
  clearCacheToken() {
315
- StorageUtils.setLocalData(this.headerTokenField, null);
317
+ this.cachedRefreshToken = undefined;
318
+ StorageUtils.setLocalData(this.headerTokenField, undefined);
316
319
  }
317
320
  /**
318
321
  * Decrypt message
@@ -557,6 +560,9 @@ export class CoreApp {
557
560
  * @returns Cached token
558
561
  */
559
562
  getCacheToken() {
563
+ // Temp refresh token
564
+ if (this.cachedRefreshToken)
565
+ return this.cachedRefreshToken;
560
566
  const refreshToken = StorageUtils.getLocalData(this.headerTokenField, '');
561
567
  if (refreshToken === '')
562
568
  return null;
@@ -737,7 +743,7 @@ export class CoreApp {
737
743
  return url;
738
744
  // From relative root, like home:/react/, url: /about => /react/about
739
745
  if (url.startsWith('/'))
740
- return home + url.substr(1);
746
+ return home + url.substring(1);
741
747
  const pathname = window.location.pathname;
742
748
  // Relative
743
749
  const pos = pathname.indexOf(home);
@@ -761,10 +767,17 @@ export class CoreApp {
761
767
  * User login
762
768
  * @param user User data
763
769
  * @param refreshToken Refresh token
770
+ * @param keep Keep login or not
764
771
  */
765
- userLogin(user, refreshToken) {
772
+ userLogin(user, refreshToken, keep) {
766
773
  this.userData = user;
767
- this.authorize(user.token, refreshToken);
774
+ if (keep) {
775
+ this.authorize(user.token, refreshToken);
776
+ }
777
+ else {
778
+ this.cachedRefreshToken = refreshToken;
779
+ this.authorize(user.token, undefined);
780
+ }
768
781
  }
769
782
  /**
770
783
  * User logout
@@ -28,6 +28,10 @@ export interface IUserData {
28
28
  */
29
29
  readonly token: string;
30
30
  }
31
+ /**
32
+ * User data property keys
33
+ */
34
+ export declare type UserKey = keyof IUserData;
31
35
  /**
32
36
  * User interface
33
37
  */
@@ -36,4 +40,8 @@ export interface IUser extends IUserData, IState {
36
40
  * Authorized or not
37
41
  */
38
42
  authorized: boolean;
43
+ /**
44
+ * Last update changed fields
45
+ */
46
+ lastChangedFields?: UserKey[];
39
47
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etsoo/appscript",
3
- "version": "1.1.76",
3
+ "version": "1.1.80",
4
4
  "description": "Applications shared TypeScript framework",
5
5
  "main": "lib/cjs/index.js",
6
6
  "module": "lib/mjs/index.js",
@@ -54,24 +54,24 @@
54
54
  "dependencies": {
55
55
  "@etsoo/notificationbase": "^1.0.94",
56
56
  "@etsoo/restclient": "^1.0.62",
57
- "@etsoo/shared": "^1.0.76",
57
+ "@etsoo/shared": "^1.0.78",
58
58
  "@types/crypto-js": "^4.0.2",
59
59
  "crypto-js": "^4.1.1"
60
60
  },
61
61
  "devDependencies": {
62
62
  "@babel/cli": "^7.16.0",
63
- "@babel/core": "^7.16.0",
64
- "@babel/plugin-transform-runtime": "^7.16.4",
65
- "@babel/preset-env": "^7.16.4",
66
- "@babel/runtime-corejs3": "^7.16.3",
63
+ "@babel/core": "^7.16.5",
64
+ "@babel/plugin-transform-runtime": "^7.16.5",
65
+ "@babel/preset-env": "^7.16.5",
66
+ "@babel/runtime-corejs3": "^7.16.5",
67
67
  "@types/jest": "^27.0.3",
68
- "@typescript-eslint/eslint-plugin": "^5.6.0",
69
- "@typescript-eslint/parser": "^5.6.0",
70
- "eslint": "^8.4.1",
68
+ "@typescript-eslint/eslint-plugin": "^5.7.0",
69
+ "@typescript-eslint/parser": "^5.7.0",
70
+ "eslint": "^8.5.0",
71
71
  "eslint-config-airbnb-base": "^15.0.0",
72
72
  "eslint-plugin-import": "^2.25.3",
73
- "jest": "^27.4.4",
74
- "ts-jest": "^27.1.1",
75
- "typescript": "^4.5.3"
73
+ "jest": "^27.4.5",
74
+ "ts-jest": "^27.1.2",
75
+ "typescript": "^4.5.4"
76
76
  }
77
77
  }
@@ -411,8 +411,9 @@ export interface ICoreApp<
411
411
  * User login
412
412
  * @param user User data
413
413
  * @param refreshToken Refresh token
414
+ * @param keep Keep login or not
414
415
  */
415
- userLogin(user: IUserData, refreshToken: string): void;
416
+ userLogin(user: IUserData, refreshToken: string, keep?: boolean): void;
416
417
 
417
418
  /**
418
419
  * User logout
@@ -561,6 +562,8 @@ export abstract class CoreApp<
561
562
  */
562
563
  protected passphrase: string = '***';
563
564
 
565
+ private cachedRefreshToken?: string;
566
+
564
567
  /**
565
568
  * Protected constructor
566
569
  * @param settings Settings
@@ -777,12 +780,16 @@ export abstract class CoreApp<
777
780
  if (refreshToken != null) refreshToken = this.encrypt(refreshToken);
778
781
  StorageUtils.setLocalData(this.headerTokenField, refreshToken);
779
782
  }
783
+
780
784
  // Reset tryLogin state
781
785
  this._isTryingLogin = false;
782
786
 
783
787
  // Token countdown
784
788
  if (this.authorized) this.refreshCountdown(this.userData!.seconds);
785
- else this.refreshCountdownClear();
789
+ else {
790
+ this.cachedRefreshToken = undefined;
791
+ this.refreshCountdownClear();
792
+ }
786
793
  }
787
794
 
788
795
  /**
@@ -858,7 +865,8 @@ export abstract class CoreApp<
858
865
  * Clear cached token
859
866
  */
860
867
  clearCacheToken() {
861
- StorageUtils.setLocalData(this.headerTokenField, null);
868
+ this.cachedRefreshToken = undefined;
869
+ StorageUtils.setLocalData(this.headerTokenField, undefined);
862
870
  }
863
871
 
864
872
  /**
@@ -1162,6 +1170,9 @@ export abstract class CoreApp<
1162
1170
  * @returns Cached token
1163
1171
  */
1164
1172
  getCacheToken(): string | null {
1173
+ // Temp refresh token
1174
+ if (this.cachedRefreshToken) return this.cachedRefreshToken;
1175
+
1165
1176
  const refreshToken = StorageUtils.getLocalData<string>(
1166
1177
  this.headerTokenField,
1167
1178
  ''
@@ -1364,7 +1375,7 @@ export abstract class CoreApp<
1364
1375
  if (home === '') return url;
1365
1376
 
1366
1377
  // From relative root, like home:/react/, url: /about => /react/about
1367
- if (url.startsWith('/')) return home + url.substr(1);
1378
+ if (url.startsWith('/')) return home + url.substring(1);
1368
1379
 
1369
1380
  const pathname = window.location.pathname;
1370
1381
 
@@ -1391,10 +1402,17 @@ export abstract class CoreApp<
1391
1402
  * User login
1392
1403
  * @param user User data
1393
1404
  * @param refreshToken Refresh token
1405
+ * @param keep Keep login or not
1394
1406
  */
1395
- userLogin(user: IUserData, refreshToken: string) {
1407
+ userLogin(user: IUserData, refreshToken: string, keep?: boolean) {
1396
1408
  this.userData = user;
1397
- this.authorize(user.token, refreshToken);
1409
+
1410
+ if (keep) {
1411
+ this.authorize(user.token, refreshToken);
1412
+ } else {
1413
+ this.cachedRefreshToken = refreshToken;
1414
+ this.authorize(user.token, undefined);
1415
+ }
1398
1416
  }
1399
1417
 
1400
1418
  /**
package/src/state/User.ts CHANGED
@@ -35,6 +35,11 @@ export interface IUserData {
35
35
  readonly token: string;
36
36
  }
37
37
 
38
+ /**
39
+ * User data property keys
40
+ */
41
+ export type UserKey = keyof IUserData;
42
+
38
43
  /**
39
44
  * User interface
40
45
  */
@@ -43,4 +48,9 @@ export interface IUser extends IUserData, IState {
43
48
  * Authorized or not
44
49
  */
45
50
  authorized: boolean;
51
+
52
+ /**
53
+ * Last update changed fields
54
+ */
55
+ lastChangedFields?: UserKey[];
46
56
  }