@digitaldefiance/express-suite-react-components 2.1.42 → 2.1.47

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.
Files changed (53) hide show
  1. package/README.md +6 -0
  2. package/package.json +2 -2
  3. package/src/components/ApiAccess.js +1 -1
  4. package/src/components/BackupCodeLoginForm.js +1 -1
  5. package/src/components/DropdownMenu.d.ts +4 -10
  6. package/src/components/DropdownMenu.d.ts.map +1 -1
  7. package/src/components/DropdownMenu.js +19 -7
  8. package/src/components/Flag.d.ts +12 -2
  9. package/src/components/Flag.d.ts.map +1 -1
  10. package/src/components/Flag.js +17 -4
  11. package/src/components/ForgotPasswordForm.js +1 -1
  12. package/src/components/LoginForm.js +1 -1
  13. package/src/components/SideMenu.d.ts +2 -7
  14. package/src/components/SideMenu.d.ts.map +1 -1
  15. package/src/components/SideMenu.js +7 -2
  16. package/src/components/TopMenu.d.ts +3 -14
  17. package/src/components/TopMenu.d.ts.map +1 -1
  18. package/src/components/TopMenu.js +23 -2
  19. package/src/components/TranslatedTitle.d.ts +5 -5
  20. package/src/components/TranslatedTitle.d.ts.map +1 -1
  21. package/src/components/TranslatedTitle.js +7 -5
  22. package/src/components/UserLanguageSelector.d.ts +1 -12
  23. package/src/components/UserLanguageSelector.d.ts.map +1 -1
  24. package/src/components/UserLanguageSelector.js +7 -4
  25. package/src/components/UserMenu.d.ts +4 -0
  26. package/src/components/UserMenu.d.ts.map +1 -0
  27. package/src/components/UserMenu.js +12 -0
  28. package/src/components/index.d.ts +1 -0
  29. package/src/components/index.d.ts.map +1 -1
  30. package/src/components/index.js +1 -0
  31. package/src/contexts/AuthProvider.d.ts +146 -0
  32. package/src/contexts/AuthProvider.d.ts.map +1 -0
  33. package/src/contexts/AuthProvider.js +406 -0
  34. package/src/contexts/I18nProvider.d.ts +6 -6
  35. package/src/contexts/I18nProvider.d.ts.map +1 -1
  36. package/src/contexts/I18nProvider.js +4 -4
  37. package/src/contexts/MenuContext.d.ts +16 -0
  38. package/src/contexts/MenuContext.d.ts.map +1 -0
  39. package/src/contexts/MenuContext.js +215 -0
  40. package/src/contexts/index.d.ts +2 -0
  41. package/src/contexts/index.d.ts.map +1 -1
  42. package/src/contexts/index.js +2 -0
  43. package/src/interfaces/AppConfig.d.ts +0 -2
  44. package/src/interfaces/AppConfig.d.ts.map +1 -1
  45. package/src/services/__mocks__/authService.d.ts +21 -0
  46. package/src/services/__mocks__/authService.d.ts.map +1 -0
  47. package/src/services/__mocks__/authService.js +15 -0
  48. package/src/services/authService.d.ts +80 -0
  49. package/src/services/authService.d.ts.map +1 -0
  50. package/src/services/authService.js +339 -0
  51. package/src/services/index.d.ts +1 -0
  52. package/src/services/index.d.ts.map +1 -1
  53. package/src/services/index.js +1 -0
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAuthService = exports.AuthService = void 0;
4
+ // services/authService.js
5
+ const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
6
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
7
+ const axios_1 = require("axios");
8
+ const api_1 = require("./api");
9
+ const authenticatedApi_1 = require("./authenticatedApi");
10
+ class AuthService {
11
+ constants;
12
+ baseUrl;
13
+ authContextFunctions = null;
14
+ eciesService;
15
+ cryptoCore;
16
+ apiClient;
17
+ authenticatedApiClient;
18
+ constructor(constants, baseUrl, eciesConfig) {
19
+ this.constants = constants;
20
+ this.baseUrl = baseUrl;
21
+ this.eciesService = new ecies_lib_1.ECIESService(eciesConfig);
22
+ this.cryptoCore = new ecies_lib_1.EciesCryptoCore(eciesConfig);
23
+ this.apiClient = (0, api_1.createApiClient)(this.baseUrl);
24
+ this.authenticatedApiClient = (0, authenticatedApi_1.createAuthenticatedApiClient)(this.baseUrl);
25
+ }
26
+ setAuthContextFunctions(functions) {
27
+ this.authContextFunctions = functions;
28
+ }
29
+ getSiteDomain() {
30
+ return this.constants.AdministratorEmail.split('@')[1];
31
+ }
32
+ async register(username, email, timezone, password) {
33
+ try {
34
+ const response = await this.apiClient.post('/user/register', {
35
+ username,
36
+ email,
37
+ timezone,
38
+ ...(password ? { password } : {}),
39
+ });
40
+ if (response.status !== 201) {
41
+ return {
42
+ error: response.data.message
43
+ ? response.data.message
44
+ : (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Registration_Error),
45
+ ...(response.data.errorType
46
+ ? { errorType: response.data.errorType }
47
+ : {}),
48
+ ...(response.data.errors ? { errors: response.data.errors } : {}),
49
+ };
50
+ }
51
+ return {
52
+ success: true,
53
+ message: response.data.message ??
54
+ (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Registration_Success, {
55
+ MNEMONIC: response.data.mnemonic,
56
+ }),
57
+ mnemonic: response.data.mnemonic,
58
+ };
59
+ }
60
+ catch (error) {
61
+ if ((0, axios_1.isAxiosError)(error) && error.response) {
62
+ return {
63
+ error: error.response.data.error?.message ??
64
+ error.response.data.message ??
65
+ error.message ??
66
+ (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
67
+ ...(error.response.data.errorType
68
+ ? { errorType: error.response.data.errorType }
69
+ : {}),
70
+ ...(error.response.data.error?.field
71
+ ? { field: error.response.data.error.field }
72
+ : {}),
73
+ ...(error.response.data.errors
74
+ ? { errors: error.response.data.errors }
75
+ : {}),
76
+ };
77
+ }
78
+ else {
79
+ return {
80
+ error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
81
+ };
82
+ }
83
+ }
84
+ }
85
+ async directLogin(mnemonic, username, email) {
86
+ if (!username && !email) {
87
+ return {
88
+ error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameOrEmailRequired),
89
+ };
90
+ }
91
+ try {
92
+ const loginRequest = await this.apiClient.post('/user/request-direct-login');
93
+ const usernameOrEmail = (username ?? email !== undefined) ? email.email : '';
94
+ const emailString = email
95
+ ? email
96
+ : new ecies_lib_1.EmailString(`${username}@${this.getSiteDomain()}`);
97
+ if (loginRequest.data.challenge) {
98
+ const { wallet } = this.cryptoCore.walletAndSeedFromMnemonic(mnemonic);
99
+ const signingUser = new ecies_lib_1.Member(this.eciesService, ecies_lib_1.MemberType.User, usernameOrEmail, emailString, wallet.getPublicKey(), new ecies_lib_1.SecureBuffer(wallet.getPrivateKey()), wallet);
100
+ const challengeBuffer = (0, ecies_lib_1.hexToUint8Array)(loginRequest.data.challenge);
101
+ const signature = await signingUser.sign(challengeBuffer);
102
+ const signatureHex = (0, ecies_lib_1.uint8ArrayToHex)(signature);
103
+ const loginResponse = await this.apiClient.post('/user/direct-login', {
104
+ username: username,
105
+ email: email ? email.email : undefined,
106
+ challenge: loginRequest.data.challenge,
107
+ signature: signatureHex,
108
+ });
109
+ if (loginResponse.data.token && loginResponse.data.user) {
110
+ return {
111
+ message: loginResponse.data.message,
112
+ token: loginResponse.data.token,
113
+ user: loginResponse.data.user,
114
+ wallet,
115
+ };
116
+ }
117
+ }
118
+ }
119
+ catch (error) {
120
+ if ((0, axios_1.isAxiosError)(error) && error.response) {
121
+ return {
122
+ error: error.response.data.error?.message ??
123
+ error.response.data.message ??
124
+ error.message ??
125
+ (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
126
+ ...(error.response.data.errorType
127
+ ? { errorType: error.response.data.errorType }
128
+ : {}),
129
+ };
130
+ }
131
+ }
132
+ return {
133
+ error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
134
+ };
135
+ }
136
+ async requestEmailLogin(username, email) {
137
+ if (!username && !email) {
138
+ return {
139
+ error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameOrEmailRequired),
140
+ };
141
+ }
142
+ try {
143
+ const result = await this.apiClient.post('/user/request-email-login', {
144
+ email: email ? email.email : undefined,
145
+ username,
146
+ });
147
+ if (result.data.message) {
148
+ return result.data.message;
149
+ }
150
+ }
151
+ catch (error) {
152
+ if ((0, axios_1.isAxiosError)(error) && error.response) {
153
+ return {
154
+ error: error.response.data.error?.message ??
155
+ error.response.data.message ??
156
+ error.message ??
157
+ (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
158
+ ...(error.response.data.errorType
159
+ ? { errorType: error.response.data.errorType }
160
+ : {}),
161
+ };
162
+ }
163
+ }
164
+ return {
165
+ error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
166
+ };
167
+ }
168
+ async emailChallengeLogin(mnemonic, token, username, email) {
169
+ if (!username && !email) {
170
+ return {
171
+ error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameOrEmailRequired),
172
+ };
173
+ }
174
+ try {
175
+ const usernameOrEmail = (username ?? email !== undefined) ? email.email : '';
176
+ const emailString = email
177
+ ? email
178
+ : new ecies_lib_1.EmailString(`${username}@${this.getSiteDomain()}`);
179
+ const { wallet } = this.cryptoCore.walletAndSeedFromMnemonic(mnemonic);
180
+ const signingUser = new ecies_lib_1.Member(this.eciesService, ecies_lib_1.MemberType.User, usernameOrEmail, emailString, wallet.getPublicKey(), new ecies_lib_1.SecureBuffer(wallet.getPrivateKey()), wallet);
181
+ const challengeBuffer = (0, ecies_lib_1.hexToUint8Array)(token);
182
+ const signature = await signingUser.sign(challengeBuffer);
183
+ const signatureHex = (0, ecies_lib_1.uint8ArrayToHex)(signature);
184
+ const response = await this.apiClient.post('/user/email-login', {
185
+ token,
186
+ signature: signatureHex,
187
+ username: username ?? null,
188
+ email: email ?? null,
189
+ });
190
+ if (response.data.token && response.data.user) {
191
+ return {
192
+ message: response.data.message,
193
+ token: response.data.token,
194
+ user: response.data.user,
195
+ wallet,
196
+ };
197
+ }
198
+ }
199
+ catch (error) {
200
+ if ((0, axios_1.isAxiosError)(error) && error.response) {
201
+ return {
202
+ error: error.response.data.error?.message ??
203
+ error.response.data.message ??
204
+ error.message ??
205
+ (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
206
+ ...(error.response.data.errorType
207
+ ? { errorType: error.response.data.errorType }
208
+ : {}),
209
+ };
210
+ }
211
+ }
212
+ return {
213
+ error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
214
+ };
215
+ }
216
+ async verifyToken(token) {
217
+ try {
218
+ const response = await this.apiClient.get('/user/verify', {
219
+ headers: { Authorization: `Bearer ${token}` },
220
+ });
221
+ return response.data.user;
222
+ }
223
+ catch (error) {
224
+ if ((0, axios_1.isAxiosError)(error) && error.response) {
225
+ return {
226
+ error: error.response.data.message
227
+ ? error.response.data.message
228
+ : error.message
229
+ ? error.message
230
+ : (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
231
+ ...(error.response.data.errorType
232
+ ? { errorType: error.response.data.errorType }
233
+ : {}),
234
+ };
235
+ }
236
+ else {
237
+ return {
238
+ error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
239
+ };
240
+ }
241
+ }
242
+ }
243
+ async refreshToken() {
244
+ try {
245
+ const refreshResponse = await this.authenticatedApiClient.get('/user/refresh-token');
246
+ if (refreshResponse.status === 200) {
247
+ const newToken = refreshResponse.headers['authorization'];
248
+ let token = undefined;
249
+ let user = undefined;
250
+ if (newToken?.startsWith('Bearer ')) {
251
+ token = newToken.slice(7);
252
+ }
253
+ if (refreshResponse.data.user) {
254
+ user = refreshResponse.data.user;
255
+ }
256
+ if (token && user) {
257
+ return { token, user };
258
+ }
259
+ }
260
+ }
261
+ catch (error) {
262
+ console.error('Token refresh error:', error);
263
+ if ((0, axios_1.isAxiosError)(error) && error.response) {
264
+ console.error('Error response:', error.response.data);
265
+ console.error('Error status:', error.response.status);
266
+ }
267
+ }
268
+ throw new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError);
269
+ }
270
+ async changePassword(currentPassword, newPassword) {
271
+ try {
272
+ await this.authenticatedApiClient.post('/user/change-password', {
273
+ currentPassword,
274
+ newPassword,
275
+ });
276
+ return { success: true };
277
+ }
278
+ catch (error) {
279
+ if ((0, axios_1.isAxiosError)(error) && error.response) {
280
+ return {
281
+ error: error.response.data.error?.message ??
282
+ error.response.data.message ??
283
+ error.message ??
284
+ (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
285
+ ...(error.response.data.errorType
286
+ ? { errorType: error.response.data.errorType }
287
+ : {}),
288
+ };
289
+ }
290
+ return { error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError) };
291
+ }
292
+ }
293
+ async backupCodeLogin(identifier, code, isEmail, recoverMnemonic, newPassword) {
294
+ try {
295
+ const response = await this.apiClient.post('/user/backup-code', {
296
+ [isEmail ? 'email' : 'username']: identifier,
297
+ code,
298
+ recoverMnemonic,
299
+ ...(newPassword ? { newPassword } : {}),
300
+ });
301
+ if (response.data.token && response.data.user) {
302
+ return {
303
+ token: response.data.token,
304
+ user: response.data.user,
305
+ codeCount: response.data.codeCount ?? 0,
306
+ ...(response.data.mnemonic ? { mnemonic: response.data.mnemonic } : {}),
307
+ ...(response.data.message ? { message: response.data.message } : {}),
308
+ };
309
+ }
310
+ return {
311
+ error: response.data.message
312
+ ? response.data.message
313
+ : (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidToken),
314
+ ...(response.data.errorType
315
+ ? { errorType: response.data.errorType }
316
+ : {}),
317
+ };
318
+ }
319
+ catch (error) {
320
+ console.error('Backup code login error:', error);
321
+ if ((0, axios_1.isAxiosError)(error) && error.response) {
322
+ return {
323
+ error: error.response.data.error.message ??
324
+ error.response.data.message ??
325
+ error.message ??
326
+ (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
327
+ ...(error.response.data.errorType
328
+ ? { errorType: error.response.data.errorType }
329
+ : {}),
330
+ status: error.response.status,
331
+ };
332
+ }
333
+ return { error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError) };
334
+ }
335
+ }
336
+ }
337
+ exports.AuthService = AuthService;
338
+ const createAuthService = (constants, baseUrl, eciesConfig) => new AuthService(constants, baseUrl, eciesConfig);
339
+ exports.createAuthService = createAuthService;
@@ -1,3 +1,4 @@
1
1
  export * from './api';
2
2
  export * from './authenticatedApi';
3
+ export * from './authService';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC"}
@@ -3,3 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./api"), exports);
5
5
  tslib_1.__exportStar(require("./authenticatedApi"), exports);
6
+ tslib_1.__exportStar(require("./authService"), exports);