@etsoo/materialui 1.4.5 → 1.4.7

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,4 +1,4 @@
1
- import { IAppSettings, IUser, RefreshTokenProps } from "@etsoo/appscript";
1
+ import { AppTryLoginParams, IAppSettings, IUser } from "@etsoo/appscript";
2
2
  import { IPageData } from "@etsoo/react";
3
3
  import { ReactApp } from "./ReactApp";
4
4
  /**
@@ -15,15 +15,10 @@ export declare abstract class CommonApp<U extends IUser = IUser, P extends IPage
15
15
  * @returns Fields
16
16
  */
17
17
  protected initCallEncryptedUpdateFields(): string[];
18
- /**
19
- * Refresh token
20
- * @param props Props
21
- */
22
- refreshToken(props?: RefreshTokenProps): Promise<boolean>;
23
18
  /**
24
19
  * Try login
25
20
  * @param showLoading Show loading bar or not
26
21
  * @returns Result
27
22
  */
28
- tryLogin(showLoading?: boolean): Promise<boolean>;
23
+ tryLogin(params?: AppTryLoginParams): Promise<boolean>;
29
24
  }
@@ -20,82 +20,32 @@ export class CommonApp extends ReactApp {
20
20
  fields.push(CoreConstants.FieldUserIdSaved);
21
21
  return fields;
22
22
  }
23
- /**
24
- * Refresh token
25
- * @param props Props
26
- */
27
- async refreshToken(props) {
28
- // Destruct
29
- const { callback, showLoading = false } = props ?? {};
30
- // Token
31
- const token = this.getCacheToken();
32
- if (token == null || token === "") {
33
- if (callback)
34
- callback(false);
35
- return false;
36
- }
37
- // Reqest data
38
- const rq = {
39
- deviceId: this.deviceId
40
- };
41
- // Payload
42
- const payload = {
43
- // No loading bar needed to avoid screen flicks
44
- showLoading,
45
- config: { headers: { [CoreConstants.TokenHeaderRefresh]: token } },
46
- onError: (error) => {
47
- if (callback)
48
- callback(error);
49
- // Prevent further processing
50
- return false;
51
- }
52
- };
53
- // Success callback
54
- const success = (result, failCallback) => {
55
- // Token
56
- const refreshToken = this.getResponseToken(payload.response);
57
- if (refreshToken == null || result.data == null) {
58
- if (failCallback)
59
- failCallback(this.get("noData"));
60
- return false;
61
- }
62
- // Keep
63
- const keep = this.storage.getData(CoreConstants.FieldLoginKeep, false);
64
- // User login
65
- this.userLogin(result.data, refreshToken, keep);
66
- // Callback
67
- if (failCallback)
68
- failCallback(true);
69
- return true;
70
- };
71
- // Call API
72
- const result = await this.api.put("Auth/RefreshToken", rq, payload);
73
- if (result == null)
74
- return false;
75
- if (!result.ok) {
76
- // Remove the wrong token
77
- this.clearCacheToken();
78
- // Callback
79
- if (callback)
80
- callback(result);
81
- return false;
82
- }
83
- return success(result, callback);
84
- }
85
23
  /**
86
24
  * Try login
87
25
  * @param showLoading Show loading bar or not
88
26
  * @returns Result
89
27
  */
90
- async tryLogin(showLoading) {
91
- // Reset user state
92
- const result = await super.tryLogin(showLoading);
93
- if (!result)
28
+ async tryLogin(params) {
29
+ // Check status
30
+ const result = await super.tryLogin(params);
31
+ if (!result) {
94
32
  return false;
33
+ }
34
+ // Destruct
35
+ const { onFailure = () => {
36
+ this.toLoginPage(rest);
37
+ }, onSuccess, ...rest } = params ?? {};
95
38
  // Refresh token
96
- return await this.refreshToken({
97
- callback: (result) => this.doRefreshTokenResult(result),
98
- showLoading
39
+ await this.refreshToken({
40
+ showLoading: params?.showLoading
41
+ }, (result) => {
42
+ if (result === true) {
43
+ onSuccess?.();
44
+ }
45
+ else {
46
+ onFailure();
47
+ }
99
48
  });
49
+ return true;
100
50
  }
101
51
  }
@@ -211,10 +211,9 @@ export declare class ReactApp<S extends IAppSettings, D extends IUser, P extends
211
211
  * User login extended
212
212
  * @param user New user
213
213
  * @param refreshToken Refresh token
214
- * @param keep Keep in local storage or not
215
214
  * @param dispatch User state dispatch
216
215
  */
217
- userLogin(user: D, refreshToken: string, keep?: boolean, dispatch?: boolean): void;
216
+ userLogin(user: D, refreshToken: string, dispatch?: boolean): void;
218
217
  /**
219
218
  * User logout
220
219
  * @param clearToken Clear refresh token or not
@@ -257,12 +257,11 @@ export class ReactApp extends CoreApp {
257
257
  * User login extended
258
258
  * @param user New user
259
259
  * @param refreshToken Refresh token
260
- * @param keep Keep in local storage or not
261
260
  * @param dispatch User state dispatch
262
261
  */
263
- userLogin(user, refreshToken, keep, dispatch) {
262
+ userLogin(user, refreshToken, dispatch) {
264
263
  // Super call, set token
265
- super.userLogin(user, refreshToken, keep);
264
+ super.userLogin(user, refreshToken);
266
265
  // Dispatch action
267
266
  if (this.userStateDispatch != null && dispatch !== false)
268
267
  this.userStateDispatch({
@@ -1,4 +1,4 @@
1
- import { ApiRefreshTokenDto, ExternalEndpoint, IApi } from "@etsoo/appscript";
1
+ import { ApiRefreshTokenDto, AppLoginParams, AppTryLoginParams, ExternalEndpoint, IApi } from "@etsoo/appscript";
2
2
  import { IServiceApp } from "./IServiceApp";
3
3
  import { IServiceAppSettings } from "./IServiceAppSettings";
4
4
  import { IServicePageData } from "./IServicePage";
@@ -36,18 +36,16 @@ export declare class ServiceApp<U extends IServiceUser = IServiceUser, P extends
36
36
  loadCore(): void;
37
37
  /**
38
38
  * Go to the login page
39
- * @param tryLogin Try to login again
40
- * @param removeUrl Remove current URL for reuse
39
+ * @params Login parameters
41
40
  */
42
- toLoginPage(tryLogin?: boolean, removeUrl?: boolean): void;
41
+ toLoginPage(params?: AppLoginParams): void;
43
42
  /**
44
43
  * User login extended
45
44
  * @param user New user
46
45
  * @param refreshToken Refresh token
47
- * @param keep Keep in local storage or not
48
46
  * @param dispatch User state dispatch
49
47
  */
50
- userLogin(user: U, refreshToken: string, keep?: boolean, dispatch?: boolean): void;
48
+ userLogin(user: U, refreshToken: string, dispatch?: boolean): void;
51
49
  /**
52
50
  *
53
51
  * @param user Current user
@@ -55,5 +53,10 @@ export declare class ServiceApp<U extends IServiceUser = IServiceUser, P extends
55
53
  * @param keep Keep in local storage or not
56
54
  * @param dispatch User state dispatch
57
55
  */
58
- userLoginEx(user: U & ServiceUserToken, core?: ApiRefreshTokenDto, keep?: boolean, dispatch?: boolean): void;
56
+ userLoginEx(user: U & ServiceUserToken, core?: ApiRefreshTokenDto, dispatch?: boolean): void;
57
+ /**
58
+ * Try login
59
+ * @param params Login parameters
60
+ */
61
+ tryLogin(params?: AppTryLoginParams): Promise<boolean>;
59
62
  }
@@ -1,6 +1,7 @@
1
1
  import { AuthApi, BridgeUtils } from "@etsoo/appscript";
2
2
  import { ReactApp } from "./ReactApp";
3
3
  const coreName = "core";
4
+ const coreTokenKey = "core-refresh-token";
4
5
  /**
5
6
  * Core Service App
6
7
  * Service login to core system, get the refesh token and access token
@@ -37,10 +38,11 @@ export class ServiceApp extends ReactApp {
37
38
  }
38
39
  /**
39
40
  * Go to the login page
40
- * @param tryLogin Try to login again
41
- * @param removeUrl Remove current URL for reuse
41
+ * @params Login parameters
42
42
  */
43
- toLoginPage(tryLogin, removeUrl) {
43
+ toLoginPage(params) {
44
+ // Destruct
45
+ const { removeUrl, showLoading, ...rest } = params ?? {};
44
46
  // Cache current URL
45
47
  this.cachedUrl = removeUrl ? undefined : globalThis.location.href;
46
48
  // Get the redirect URL
@@ -53,7 +55,7 @@ export class ServiceApp extends ReactApp {
53
55
  if (!url)
54
56
  return;
55
57
  // Add try login flag
56
- url = url.addUrlParam("tryLogin", tryLogin ?? false);
58
+ url = url.addUrlParams(rest);
57
59
  // Is it embeded?
58
60
  if (this.embedded) {
59
61
  globalThis.parent.postMessage(["login", url], this.coreOrigin);
@@ -74,10 +76,9 @@ export class ServiceApp extends ReactApp {
74
76
  * User login extended
75
77
  * @param user New user
76
78
  * @param refreshToken Refresh token
77
- * @param keep Keep in local storage or not
78
79
  * @param dispatch User state dispatch
79
80
  */
80
- userLogin(user, refreshToken, keep, dispatch) {
81
+ userLogin(user, refreshToken, dispatch) {
81
82
  if (user.clientDeviceId && user.passphrase) {
82
83
  // Save the passphrase
83
84
  // Interpolated string expressions are different between TypeScript and C# for the null value
@@ -88,7 +89,7 @@ export class ServiceApp extends ReactApp {
88
89
  }
89
90
  }
90
91
  // Super call, set token
91
- super.userLogin(user, refreshToken, keep, dispatch);
92
+ super.userLogin(user, refreshToken, dispatch);
92
93
  }
93
94
  /**
94
95
  *
@@ -97,10 +98,10 @@ export class ServiceApp extends ReactApp {
97
98
  * @param keep Keep in local storage or not
98
99
  * @param dispatch User state dispatch
99
100
  */
100
- userLoginEx(user, core, keep, dispatch) {
101
+ userLoginEx(user, core, dispatch) {
101
102
  // User login
102
103
  const { refreshToken } = user;
103
- this.userLogin(user, refreshToken, keep, dispatch);
104
+ this.userLogin(user, refreshToken, dispatch);
104
105
  // Core system login
105
106
  core ?? (core = {
106
107
  refreshToken,
@@ -108,6 +109,30 @@ export class ServiceApp extends ReactApp {
108
109
  tokenType: user.tokenScheme ?? "Bearer",
109
110
  expiresIn: user.seconds
110
111
  });
112
+ // Cache the core system refresh token
113
+ this.storage.setData(coreTokenKey, core.refreshToken);
111
114
  this.exchangeTokenAll(core, coreName);
112
115
  }
116
+ /**
117
+ * Try login
118
+ * @param params Login parameters
119
+ */
120
+ async tryLogin(params) {
121
+ // Check core system token
122
+ const coreToken = this.storage.getData(coreTokenKey);
123
+ if (!coreToken)
124
+ return false;
125
+ params ?? (params = {});
126
+ const onSuccess = params.onSuccess;
127
+ params.onSuccess = () => {
128
+ // Call the core system API refresh token
129
+ this.apiRefreshTokenData(this.coreApi, coreToken).then((data) => {
130
+ if (data == null)
131
+ return;
132
+ this.exchangeTokenAll(data, coreName);
133
+ onSuccess?.();
134
+ });
135
+ };
136
+ return await super.tryLogin(params);
137
+ }
113
138
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@etsoo/materialui",
3
- "version": "1.4.5",
3
+ "version": "1.4.7",
4
4
  "description": "TypeScript Material-UI Implementation",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -50,14 +50,14 @@
50
50
  "@emotion/css": "^11.13.4",
51
51
  "@emotion/react": "^11.13.3",
52
52
  "@emotion/styled": "^11.13.0",
53
- "@etsoo/appscript": "^1.5.39",
53
+ "@etsoo/appscript": "^1.5.49",
54
54
  "@etsoo/notificationbase": "^1.1.49",
55
- "@etsoo/react": "^1.7.75",
55
+ "@etsoo/react": "^1.7.82",
56
56
  "@etsoo/shared": "^1.2.48",
57
- "@mui/icons-material": "^6.1.3",
58
- "@mui/material": "^6.1.3",
57
+ "@mui/icons-material": "^6.1.4",
58
+ "@mui/material": "^6.1.4",
59
59
  "@mui/x-data-grid": "^7.20.0",
60
- "chart.js": "^4.4.4",
60
+ "chart.js": "^4.4.5",
61
61
  "chartjs-plugin-datalabels": "^2.2.0",
62
62
  "eventemitter3": "^5.0.1",
63
63
  "pica": "^9.0.1",
@@ -87,8 +87,8 @@
87
87
  "@types/react-dom": "^18.3.1",
88
88
  "@types/react-input-mask": "^3.0.5",
89
89
  "@types/react-window": "^1.8.8",
90
- "@typescript-eslint/eslint-plugin": "^8.8.1",
91
- "@typescript-eslint/parser": "^8.8.1",
90
+ "@typescript-eslint/eslint-plugin": "^8.9.0",
91
+ "@typescript-eslint/parser": "^8.9.0",
92
92
  "jest": "^29.7.0",
93
93
  "jest-environment-jsdom": "^29.7.0",
94
94
  "typescript": "^5.6.3"
@@ -1,14 +1,6 @@
1
- import {
2
- IApiPayload,
3
- IAppSettings,
4
- IUser,
5
- RefreshTokenProps,
6
- RefreshTokenResult,
7
- RefreshTokenRQ
8
- } from "@etsoo/appscript";
1
+ import { AppTryLoginParams, IAppSettings, IUser } from "@etsoo/appscript";
9
2
  import { CoreConstants, IPageData } from "@etsoo/react";
10
3
  import { ReactApp } from "./ReactApp";
11
- import { IActionResult } from "@etsoo/shared";
12
4
 
13
5
  /**
14
6
  * Common independent application
@@ -37,101 +29,40 @@ export abstract class CommonApp<
37
29
  }
38
30
 
39
31
  /**
40
- * Refresh token
41
- * @param props Props
32
+ * Try login
33
+ * @param showLoading Show loading bar or not
34
+ * @returns Result
42
35
  */
43
- override async refreshToken(props?: RefreshTokenProps) {
44
- // Destruct
45
- const { callback, showLoading = false } = props ?? {};
46
-
47
- // Token
48
- const token = this.getCacheToken();
49
- if (token == null || token === "") {
50
- if (callback) callback(false);
36
+ override async tryLogin(params?: AppTryLoginParams) {
37
+ // Check status
38
+ const result = await super.tryLogin(params);
39
+ if (!result) {
51
40
  return false;
52
41
  }
53
42
 
54
- // Reqest data
55
- const rq: RefreshTokenRQ = {
56
- deviceId: this.deviceId
57
- };
58
-
59
- // Login result type
60
- type LoginResult = IActionResult<U>;
61
-
62
- // Payload
63
- const payload: IApiPayload<LoginResult, any> = {
64
- // No loading bar needed to avoid screen flicks
65
- showLoading,
66
- config: { headers: { [CoreConstants.TokenHeaderRefresh]: token } },
67
- onError: (error) => {
68
- if (callback) callback(error);
69
-
70
- // Prevent further processing
71
- return false;
72
- }
73
- };
43
+ // Destruct
44
+ const {
45
+ onFailure = () => {
46
+ this.toLoginPage(rest);
47
+ },
48
+ onSuccess,
49
+ ...rest
50
+ } = params ?? {};
74
51
 
75
- // Success callback
76
- const success = (
77
- result: LoginResult,
78
- failCallback?: (result: RefreshTokenResult) => void
79
- ) => {
80
- // Token
81
- const refreshToken = this.getResponseToken(payload.response);
82
- if (refreshToken == null || result.data == null) {
83
- if (failCallback) failCallback(this.get("noData")!);
84
- return false;
52
+ // Refresh token
53
+ await this.refreshToken(
54
+ {
55
+ showLoading: params?.showLoading
56
+ },
57
+ (result) => {
58
+ if (result === true) {
59
+ onSuccess?.();
60
+ } else {
61
+ onFailure();
62
+ }
85
63
  }
86
-
87
- // Keep
88
- const keep = this.storage.getData(CoreConstants.FieldLoginKeep, false);
89
-
90
- // User login
91
- this.userLogin(result.data, refreshToken, keep);
92
-
93
- // Callback
94
- if (failCallback) failCallback(true);
95
-
96
- return true;
97
- };
98
-
99
- // Call API
100
- const result = await this.api.put<LoginResult>(
101
- "Auth/RefreshToken",
102
- rq,
103
- payload
104
64
  );
105
65
 
106
- if (result == null) return false;
107
-
108
- if (!result.ok) {
109
- // Remove the wrong token
110
- this.clearCacheToken();
111
-
112
- // Callback
113
- if (callback) callback(result);
114
-
115
- return false;
116
- }
117
-
118
- return success(result, callback);
119
- }
120
-
121
- /**
122
- * Try login
123
- * @param showLoading Show loading bar or not
124
- * @returns Result
125
- */
126
- override async tryLogin(showLoading?: boolean) {
127
- // Reset user state
128
- const result = await super.tryLogin(showLoading);
129
- if (!result) return false;
130
-
131
- // Refresh token
132
- return await this.refreshToken({
133
- callback: (result) => this.doRefreshTokenResult(result),
134
- showLoading
135
- });
66
+ return true;
136
67
  }
137
68
  }
@@ -494,17 +494,11 @@ export class ReactApp<
494
494
  * User login extended
495
495
  * @param user New user
496
496
  * @param refreshToken Refresh token
497
- * @param keep Keep in local storage or not
498
497
  * @param dispatch User state dispatch
499
498
  */
500
- override userLogin(
501
- user: D,
502
- refreshToken: string,
503
- keep?: boolean,
504
- dispatch?: boolean
505
- ): void {
499
+ override userLogin(user: D, refreshToken: string, dispatch?: boolean): void {
506
500
  // Super call, set token
507
- super.userLogin(user, refreshToken, keep);
501
+ super.userLogin(user, refreshToken);
508
502
 
509
503
  // Dispatch action
510
504
  if (this.userStateDispatch != null && dispatch !== false)
@@ -1,5 +1,7 @@
1
1
  import {
2
2
  ApiRefreshTokenDto,
3
+ AppLoginParams,
4
+ AppTryLoginParams,
3
5
  AuthApi,
4
6
  BridgeUtils,
5
7
  ExternalEndpoint,
@@ -12,6 +14,7 @@ import { IServiceUser, ServiceUserToken } from "./IServiceUser";
12
14
  import { ReactApp } from "./ReactApp";
13
15
 
14
16
  const coreName = "core";
17
+ const coreTokenKey = "core-refresh-token";
15
18
 
16
19
  /**
17
20
  * Core Service App
@@ -73,10 +76,12 @@ export class ServiceApp<
73
76
 
74
77
  /**
75
78
  * Go to the login page
76
- * @param tryLogin Try to login again
77
- * @param removeUrl Remove current URL for reuse
79
+ * @params Login parameters
78
80
  */
79
- override toLoginPage(tryLogin?: boolean, removeUrl?: boolean) {
81
+ override toLoginPage(params?: AppLoginParams) {
82
+ // Destruct
83
+ const { removeUrl, showLoading, ...rest } = params ?? {};
84
+
80
85
  // Cache current URL
81
86
  this.cachedUrl = removeUrl ? undefined : globalThis.location.href;
82
87
 
@@ -90,7 +95,7 @@ export class ServiceApp<
90
95
  if (!url) return;
91
96
 
92
97
  // Add try login flag
93
- url = url.addUrlParam("tryLogin", tryLogin ?? false);
98
+ url = url.addUrlParams(rest);
94
99
 
95
100
  // Is it embeded?
96
101
  if (this.embedded) {
@@ -112,15 +117,9 @@ export class ServiceApp<
112
117
  * User login extended
113
118
  * @param user New user
114
119
  * @param refreshToken Refresh token
115
- * @param keep Keep in local storage or not
116
120
  * @param dispatch User state dispatch
117
121
  */
118
- override userLogin(
119
- user: U,
120
- refreshToken: string,
121
- keep?: boolean,
122
- dispatch?: boolean
123
- ): void {
122
+ override userLogin(user: U, refreshToken: string, dispatch?: boolean): void {
124
123
  if (user.clientDeviceId && user.passphrase) {
125
124
  // Save the passphrase
126
125
  // Interpolated string expressions are different between TypeScript and C# for the null value
@@ -135,7 +134,7 @@ export class ServiceApp<
135
134
  }
136
135
 
137
136
  // Super call, set token
138
- super.userLogin(user, refreshToken, keep, dispatch);
137
+ super.userLogin(user, refreshToken, dispatch);
139
138
  }
140
139
 
141
140
  /**
@@ -148,12 +147,11 @@ export class ServiceApp<
148
147
  userLoginEx(
149
148
  user: U & ServiceUserToken,
150
149
  core?: ApiRefreshTokenDto,
151
- keep?: boolean,
152
150
  dispatch?: boolean
153
151
  ) {
154
152
  // User login
155
153
  const { refreshToken } = user;
156
- this.userLogin(user, refreshToken, keep, dispatch);
154
+ this.userLogin(user, refreshToken, dispatch);
157
155
 
158
156
  // Core system login
159
157
  core ??= {
@@ -163,6 +161,33 @@ export class ServiceApp<
163
161
  expiresIn: user.seconds
164
162
  };
165
163
 
164
+ // Cache the core system refresh token
165
+ this.storage.setData(coreTokenKey, core.refreshToken);
166
+
166
167
  this.exchangeTokenAll(core, coreName);
167
168
  }
169
+
170
+ /**
171
+ * Try login
172
+ * @param params Login parameters
173
+ */
174
+ override async tryLogin(params?: AppTryLoginParams) {
175
+ // Check core system token
176
+ const coreToken = this.storage.getData<string>(coreTokenKey);
177
+ if (!coreToken) return false;
178
+
179
+ params ??= {};
180
+ const onSuccess = params.onSuccess;
181
+ params.onSuccess = () => {
182
+ // Call the core system API refresh token
183
+ this.apiRefreshTokenData(this.coreApi, coreToken).then((data) => {
184
+ if (data == null) return;
185
+
186
+ this.exchangeTokenAll(data, coreName);
187
+
188
+ onSuccess?.();
189
+ });
190
+ };
191
+ return await super.tryLogin(params);
192
+ }
168
193
  }