@digitaldefiance/express-suite-react-components 2.9.1 → 2.9.2

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 (257) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +10 -6
  3. package/src/auth/Private.tsx +17 -0
  4. package/src/auth/PrivateRoute.tsx +28 -0
  5. package/src/auth/UnAuth.tsx +16 -0
  6. package/src/auth/UnAuthRoute.tsx +30 -0
  7. package/src/auth/{index.d.ts → index.ts} +1 -2
  8. package/src/components/ApiAccess.tsx +134 -0
  9. package/src/components/BackupCodeLoginForm.tsx +314 -0
  10. package/src/components/BackupCodesForm.tsx +198 -0
  11. package/src/components/ChangePasswordForm.tsx +182 -0
  12. package/src/components/ConfirmationDialog.tsx +48 -0
  13. package/src/components/CurrencyCodeSelector.tsx +60 -0
  14. package/src/components/CurrencyInput.tsx +80 -0
  15. package/src/components/DashboardPage.tsx +24 -0
  16. package/src/components/DropdownMenu.tsx +92 -0
  17. package/src/components/ExpirationSecondsSelector.tsx +65 -0
  18. package/src/components/Flag.tsx +53 -0
  19. package/src/components/ForgotPasswordForm.tsx +120 -0
  20. package/src/components/LoginForm.tsx +307 -0
  21. package/src/components/LogoutPage.tsx +21 -0
  22. package/src/components/RegisterForm.tsx +354 -0
  23. package/src/components/ResetPasswordForm.tsx +164 -0
  24. package/src/components/SideMenu.tsx +46 -0
  25. package/src/components/SideMenuListItem.tsx +74 -0
  26. package/src/components/TopMenu.tsx +134 -0
  27. package/src/components/TranslatedTitle.tsx +22 -0
  28. package/src/components/UserLanguageSelector.tsx +45 -0
  29. package/src/components/UserMenu.tsx +15 -0
  30. package/src/components/UserSettingsForm.tsx +328 -0
  31. package/src/components/VerifyEmailPage.tsx +133 -0
  32. package/src/components/{index.d.ts → index.ts} +1 -1
  33. package/src/contexts/AuthProvider.spec.tsx +1060 -0
  34. package/src/contexts/AuthProvider.tsx +741 -0
  35. package/src/contexts/I18nProvider.tsx +85 -0
  36. package/src/contexts/MenuContext.tsx +310 -0
  37. package/src/contexts/SuiteConfigProvider.tsx +93 -0
  38. package/src/contexts/ThemeProvider.tsx +67 -0
  39. package/src/contexts/{index.d.ts → index.ts} +0 -1
  40. package/src/hooks/{index.d.ts → index.ts} +0 -1
  41. package/src/hooks/useBackupCodes.ts +85 -0
  42. package/src/hooks/useEmailVerification.ts +39 -0
  43. package/src/hooks/useExpiringValue.ts +78 -0
  44. package/src/hooks/useLocalStorage.ts +18 -0
  45. package/src/hooks/useUserSettings.ts +216 -0
  46. package/src/{index.d.ts → index.ts} +1 -1
  47. package/src/interfaces/IAppConfig.ts +5 -0
  48. package/src/interfaces/IMenuConfig.ts +11 -0
  49. package/src/interfaces/IMenuOption.ts +55 -0
  50. package/src/interfaces/index.ts +3 -0
  51. package/src/services/__mocks__/authService.ts +14 -0
  52. package/src/services/api.ts +13 -0
  53. package/src/services/authService.ts +422 -0
  54. package/src/services/authenticatedApi.ts +17 -0
  55. package/src/services/index.ts +3 -0
  56. package/src/types/MenuType.ts +15 -0
  57. package/src/types/expirationSeconds.ts +18 -0
  58. package/src/types/index.ts +1 -0
  59. package/src/types/translation.ts +20 -0
  60. package/src/wrappers/BackupCodeLoginWrapper.tsx +35 -0
  61. package/src/wrappers/BackupCodesWrapper.tsx +28 -0
  62. package/src/wrappers/ChangePasswordFormWrapper.tsx +31 -0
  63. package/src/wrappers/LoginFormWrapper.tsx +59 -0
  64. package/src/wrappers/LogoutPageWrapper.tsx +30 -0
  65. package/src/wrappers/RegisterFormWrapper.tsx +48 -0
  66. package/src/wrappers/UserSettingsFormWrapper.tsx +39 -0
  67. package/src/wrappers/VerifyEmailPageWrapper.tsx +27 -0
  68. package/src/wrappers/{index.d.ts → index.tsx} +8 -1
  69. package/src/auth/Private.d.ts +0 -6
  70. package/src/auth/Private.d.ts.map +0 -1
  71. package/src/auth/Private.js +0 -14
  72. package/src/auth/PrivateRoute.d.ts +0 -8
  73. package/src/auth/PrivateRoute.d.ts.map +0 -1
  74. package/src/auth/PrivateRoute.js +0 -23
  75. package/src/auth/UnAuth.d.ts +0 -6
  76. package/src/auth/UnAuth.d.ts.map +0 -1
  77. package/src/auth/UnAuth.js +0 -14
  78. package/src/auth/UnAuthRoute.d.ts +0 -8
  79. package/src/auth/UnAuthRoute.d.ts.map +0 -1
  80. package/src/auth/UnAuthRoute.js +0 -22
  81. package/src/auth/index.d.ts.map +0 -1
  82. package/src/auth/index.js +0 -10
  83. package/src/components/ApiAccess.d.ts +0 -16
  84. package/src/components/ApiAccess.d.ts.map +0 -1
  85. package/src/components/ApiAccess.js +0 -70
  86. package/src/components/BackupCodeLoginForm.d.ts +0 -43
  87. package/src/components/BackupCodeLoginForm.d.ts.map +0 -1
  88. package/src/components/BackupCodeLoginForm.js +0 -106
  89. package/src/components/BackupCodesForm.d.ts +0 -26
  90. package/src/components/BackupCodesForm.d.ts.map +0 -1
  91. package/src/components/BackupCodesForm.js +0 -108
  92. package/src/components/ChangePasswordForm.d.ts +0 -26
  93. package/src/components/ChangePasswordForm.d.ts.map +0 -1
  94. package/src/components/ChangePasswordForm.js +0 -66
  95. package/src/components/ConfirmationDialog.d.ts +0 -13
  96. package/src/components/ConfirmationDialog.d.ts.map +0 -1
  97. package/src/components/ConfirmationDialog.js +0 -10
  98. package/src/components/CurrencyCodeSelector.d.ts +0 -9
  99. package/src/components/CurrencyCodeSelector.d.ts.map +0 -1
  100. package/src/components/CurrencyCodeSelector.js +0 -31
  101. package/src/components/CurrencyInput.d.ts +0 -13
  102. package/src/components/CurrencyInput.d.ts.map +0 -1
  103. package/src/components/CurrencyInput.js +0 -22
  104. package/src/components/DashboardPage.d.ts +0 -8
  105. package/src/components/DashboardPage.d.ts.map +0 -1
  106. package/src/components/DashboardPage.js +0 -10
  107. package/src/components/DropdownMenu.d.ts +0 -9
  108. package/src/components/DropdownMenu.d.ts.map +0 -1
  109. package/src/components/DropdownMenu.js +0 -56
  110. package/src/components/ExpirationSecondsSelector.d.ts +0 -13
  111. package/src/components/ExpirationSecondsSelector.d.ts.map +0 -1
  112. package/src/components/ExpirationSecondsSelector.js +0 -32
  113. package/src/components/Flag.d.ts +0 -20
  114. package/src/components/Flag.d.ts.map +0 -1
  115. package/src/components/Flag.js +0 -43
  116. package/src/components/ForgotPasswordForm.d.ts +0 -18
  117. package/src/components/ForgotPasswordForm.d.ts.map +0 -1
  118. package/src/components/ForgotPasswordForm.js +0 -54
  119. package/src/components/LoginForm.d.ts +0 -44
  120. package/src/components/LoginForm.d.ts.map +0 -1
  121. package/src/components/LoginForm.js +0 -99
  122. package/src/components/LogoutPage.d.ts +0 -8
  123. package/src/components/LogoutPage.d.ts.map +0 -1
  124. package/src/components/LogoutPage.js +0 -16
  125. package/src/components/RegisterForm.d.ts +0 -54
  126. package/src/components/RegisterForm.d.ts.map +0 -1
  127. package/src/components/RegisterForm.js +0 -105
  128. package/src/components/ResetPasswordForm.d.ts +0 -23
  129. package/src/components/ResetPasswordForm.d.ts.map +0 -1
  130. package/src/components/ResetPasswordForm.js +0 -68
  131. package/src/components/SideMenu.d.ts +0 -8
  132. package/src/components/SideMenu.d.ts.map +0 -1
  133. package/src/components/SideMenu.js +0 -25
  134. package/src/components/SideMenuListItem.d.ts +0 -13
  135. package/src/components/SideMenuListItem.d.ts.map +0 -1
  136. package/src/components/SideMenuListItem.js +0 -44
  137. package/src/components/TopMenu.d.ts +0 -24
  138. package/src/components/TopMenu.d.ts.map +0 -1
  139. package/src/components/TopMenu.js +0 -36
  140. package/src/components/TranslatedTitle.d.ts +0 -7
  141. package/src/components/TranslatedTitle.d.ts.map +0 -1
  142. package/src/components/TranslatedTitle.js +0 -15
  143. package/src/components/UserLanguageSelector.d.ts +0 -4
  144. package/src/components/UserLanguageSelector.d.ts.map +0 -1
  145. package/src/components/UserLanguageSelector.js +0 -31
  146. package/src/components/UserMenu.d.ts +0 -4
  147. package/src/components/UserMenu.d.ts.map +0 -1
  148. package/src/components/UserMenu.js +0 -12
  149. package/src/components/UserSettingsForm.d.ts +0 -56
  150. package/src/components/UserSettingsForm.d.ts.map +0 -1
  151. package/src/components/UserSettingsForm.js +0 -93
  152. package/src/components/VerifyEmailPage.d.ts +0 -23
  153. package/src/components/VerifyEmailPage.d.ts.map +0 -1
  154. package/src/components/VerifyEmailPage.js +0 -61
  155. package/src/components/index.d.ts.map +0 -1
  156. package/src/components/index.js +0 -28
  157. package/src/contexts/AuthProvider.d.ts +0 -152
  158. package/src/contexts/AuthProvider.d.ts.map +0 -1
  159. package/src/contexts/AuthProvider.js +0 -446
  160. package/src/contexts/I18nProvider.d.ts +0 -16
  161. package/src/contexts/I18nProvider.d.ts.map +0 -1
  162. package/src/contexts/I18nProvider.js +0 -46
  163. package/src/contexts/MenuContext.d.ts +0 -20
  164. package/src/contexts/MenuContext.d.ts.map +0 -1
  165. package/src/contexts/MenuContext.js +0 -244
  166. package/src/contexts/SuiteConfigProvider.d.ts +0 -44
  167. package/src/contexts/SuiteConfigProvider.d.ts.map +0 -1
  168. package/src/contexts/SuiteConfigProvider.js +0 -43
  169. package/src/contexts/ThemeProvider.d.ts +0 -15
  170. package/src/contexts/ThemeProvider.d.ts.map +0 -1
  171. package/src/contexts/ThemeProvider.js +0 -36
  172. package/src/contexts/index.d.ts.map +0 -1
  173. package/src/contexts/index.js +0 -8
  174. package/src/hooks/index.d.ts.map +0 -1
  175. package/src/hooks/index.js +0 -8
  176. package/src/hooks/useBackupCodes.d.ts +0 -15
  177. package/src/hooks/useBackupCodes.d.ts.map +0 -1
  178. package/src/hooks/useBackupCodes.js +0 -70
  179. package/src/hooks/useEmailVerification.d.ts +0 -10
  180. package/src/hooks/useEmailVerification.d.ts.map +0 -1
  181. package/src/hooks/useEmailVerification.js +0 -36
  182. package/src/hooks/useExpiringValue.d.ts +0 -14
  183. package/src/hooks/useExpiringValue.d.ts.map +0 -1
  184. package/src/hooks/useExpiringValue.js +0 -53
  185. package/src/hooks/useLocalStorage.d.ts +0 -2
  186. package/src/hooks/useLocalStorage.d.ts.map +0 -1
  187. package/src/hooks/useLocalStorage.js +0 -15
  188. package/src/hooks/useUserSettings.d.ts +0 -46
  189. package/src/hooks/useUserSettings.d.ts.map +0 -1
  190. package/src/hooks/useUserSettings.js +0 -152
  191. package/src/index.d.ts.map +0 -1
  192. package/src/index.js +0 -12
  193. package/src/interfaces/IAppConfig.d.ts +0 -6
  194. package/src/interfaces/IAppConfig.d.ts.map +0 -1
  195. package/src/interfaces/IAppConfig.js +0 -2
  196. package/src/interfaces/IMenuConfig.d.ts +0 -11
  197. package/src/interfaces/IMenuConfig.d.ts.map +0 -1
  198. package/src/interfaces/IMenuConfig.js +0 -2
  199. package/src/interfaces/IMenuOption.d.ts +0 -58
  200. package/src/interfaces/IMenuOption.d.ts.map +0 -1
  201. package/src/interfaces/IMenuOption.js +0 -2
  202. package/src/interfaces/index.d.ts +0 -4
  203. package/src/interfaces/index.d.ts.map +0 -1
  204. package/src/interfaces/index.js +0 -6
  205. package/src/services/__mocks__/authService.d.ts +0 -21
  206. package/src/services/__mocks__/authService.d.ts.map +0 -1
  207. package/src/services/__mocks__/authService.js +0 -15
  208. package/src/services/api.d.ts +0 -3
  209. package/src/services/api.d.ts.map +0 -1
  210. package/src/services/api.js +0 -14
  211. package/src/services/authService.d.ts +0 -72
  212. package/src/services/authService.d.ts.map +0 -1
  213. package/src/services/authService.js +0 -347
  214. package/src/services/authenticatedApi.d.ts +0 -3
  215. package/src/services/authenticatedApi.d.ts.map +0 -1
  216. package/src/services/authenticatedApi.js +0 -18
  217. package/src/services/index.d.ts +0 -4
  218. package/src/services/index.d.ts.map +0 -1
  219. package/src/services/index.js +0 -6
  220. package/src/types/MenuType.d.ts +0 -11
  221. package/src/types/MenuType.d.ts.map +0 -1
  222. package/src/types/MenuType.js +0 -12
  223. package/src/types/expirationSeconds.d.ts +0 -3
  224. package/src/types/expirationSeconds.d.ts.map +0 -1
  225. package/src/types/expirationSeconds.js +0 -17
  226. package/src/types/index.d.ts +0 -2
  227. package/src/types/index.d.ts.map +0 -1
  228. package/src/types/index.js +0 -4
  229. package/src/types/translation.d.ts +0 -10
  230. package/src/types/translation.d.ts.map +0 -1
  231. package/src/types/translation.js +0 -9
  232. package/src/wrappers/BackupCodeLoginWrapper.d.ts +0 -8
  233. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +0 -1
  234. package/src/wrappers/BackupCodeLoginWrapper.js +0 -21
  235. package/src/wrappers/BackupCodesWrapper.d.ts +0 -7
  236. package/src/wrappers/BackupCodesWrapper.d.ts.map +0 -1
  237. package/src/wrappers/BackupCodesWrapper.js +0 -17
  238. package/src/wrappers/ChangePasswordFormWrapper.d.ts +0 -8
  239. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +0 -1
  240. package/src/wrappers/ChangePasswordFormWrapper.js +0 -21
  241. package/src/wrappers/LoginFormWrapper.d.ts +0 -9
  242. package/src/wrappers/LoginFormWrapper.d.ts.map +0 -1
  243. package/src/wrappers/LoginFormWrapper.js +0 -43
  244. package/src/wrappers/LogoutPageWrapper.d.ts +0 -9
  245. package/src/wrappers/LogoutPageWrapper.d.ts.map +0 -1
  246. package/src/wrappers/LogoutPageWrapper.js +0 -21
  247. package/src/wrappers/RegisterFormWrapper.d.ts +0 -9
  248. package/src/wrappers/RegisterFormWrapper.d.ts.map +0 -1
  249. package/src/wrappers/RegisterFormWrapper.js +0 -26
  250. package/src/wrappers/UserSettingsFormWrapper.d.ts +0 -8
  251. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +0 -1
  252. package/src/wrappers/UserSettingsFormWrapper.js +0 -24
  253. package/src/wrappers/VerifyEmailPageWrapper.d.ts +0 -8
  254. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +0 -1
  255. package/src/wrappers/VerifyEmailPageWrapper.js +0 -20
  256. package/src/wrappers/index.d.ts.map +0 -1
  257. package/src/wrappers/index.js +0 -20
@@ -1,347 +0,0 @@
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
- eciesService;
14
- cryptoCore;
15
- apiClient;
16
- authenticatedApiClient;
17
- constructor(constants, baseUrl, eciesConfig) {
18
- this.constants = constants;
19
- this.baseUrl = baseUrl;
20
- this.eciesService = new ecies_lib_1.ECIESService(eciesConfig);
21
- this.cryptoCore = new ecies_lib_1.EciesCryptoCore(eciesConfig);
22
- this.apiClient = (0, api_1.createApiClient)(this.baseUrl);
23
- this.authenticatedApiClient = (0, authenticatedApi_1.createAuthenticatedApiClient)(this.baseUrl);
24
- }
25
- getSiteDomain() {
26
- return this.constants.AdministratorEmail.split('@')[1];
27
- }
28
- async register(username, email, timezone, password) {
29
- try {
30
- const response = await this.apiClient.post('/user/register', {
31
- username,
32
- email,
33
- timezone,
34
- ...(password ? { password } : {}),
35
- });
36
- if (response.status !== 201) {
37
- return {
38
- error: response.data.message
39
- ? response.data.message
40
- : (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Registration_Error),
41
- ...(response.data.errorType
42
- ? { errorType: response.data.errorType }
43
- : {}),
44
- ...(response.data.errors ? { errors: response.data.errors } : {}),
45
- };
46
- }
47
- return {
48
- success: true,
49
- message: response.data.message ??
50
- (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Registration_Success, {
51
- MNEMONIC: response.data.mnemonic,
52
- }),
53
- mnemonic: response.data.mnemonic,
54
- };
55
- }
56
- catch (error) {
57
- if ((0, axios_1.isAxiosError)(error) && error.response) {
58
- return {
59
- error: error.response.data.error?.message ??
60
- error.response.data.message ??
61
- error.message ??
62
- (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
63
- ...(error.response.data.errorType
64
- ? { errorType: error.response.data.errorType }
65
- : {}),
66
- ...(error.response.data.error?.field
67
- ? { field: error.response.data.error.field }
68
- : {}),
69
- ...(error.response.data.errors
70
- ? { errors: error.response.data.errors }
71
- : {}),
72
- };
73
- }
74
- else {
75
- return {
76
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
77
- };
78
- }
79
- }
80
- }
81
- async directLogin(mnemonic, username, email) {
82
- if (!username && !email) {
83
- return {
84
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameOrEmailRequired),
85
- };
86
- }
87
- try {
88
- const loginRequest = await this.apiClient.post('/user/request-direct-login');
89
- if (loginRequest.data.challenge) {
90
- const { wallet } = this.cryptoCore.walletAndSeedFromMnemonic(mnemonic);
91
- const publicKey = wallet.getPublicKey();
92
- // Add 0x04 prefix for uncompressed public key
93
- const publicKeyWithPrefix = new Uint8Array(publicKey.length + 1);
94
- publicKeyWithPrefix[0] = 0x04;
95
- publicKeyWithPrefix.set(publicKey, 1);
96
- const challengeBuffer = (0, ecies_lib_1.hexToUint8Array)(loginRequest.data.challenge);
97
- const privateKeyBuffer = wallet.getPrivateKey();
98
- const signature = this.eciesService.signMessage(privateKeyBuffer, challengeBuffer);
99
- const signatureHex = (0, ecies_lib_1.uint8ArrayToHex)(signature);
100
- const loginResponse = await this.apiClient.post('/user/direct-challenge', {
101
- username: username,
102
- email: email ? email.email : undefined,
103
- challenge: loginRequest.data.challenge,
104
- signature: signatureHex,
105
- });
106
- if (loginResponse.data.token && loginResponse.data.user) {
107
- return {
108
- message: loginResponse.data.message,
109
- token: loginResponse.data.token,
110
- user: loginResponse.data.user,
111
- wallet,
112
- };
113
- }
114
- }
115
- }
116
- catch (error) {
117
- if ((0, axios_1.isAxiosError)(error) && error.response) {
118
- // Check for DirectChallengeNotEnabled error
119
- if (error.response.status === 403 && error.response.data.errorType === 'DirectChallengeNotEnabledError') {
120
- return {
121
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Error_Login_DirectChallengeNotEnabled),
122
- errorType: 'DirectChallengeNotEnabled',
123
- };
124
- }
125
- // Check for PasswordLoginNotEnabled error
126
- if (error.response.status === 403 && error.response.data.errorType === 'PasswordLoginNotEnabledError') {
127
- return {
128
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Error_Login_PasswordLoginNotEnabled),
129
- errorType: 'PasswordLoginNotEnabled',
130
- };
131
- }
132
- return {
133
- error: error.response.data.error?.message ??
134
- error.response.data.message ??
135
- error.message ??
136
- (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
137
- ...(error.response.data.errorType
138
- ? { errorType: error.response.data.errorType }
139
- : {}),
140
- };
141
- }
142
- console.error('directLogin: non-axios error:', error);
143
- }
144
- return {
145
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
146
- };
147
- }
148
- async requestEmailLogin(username, email) {
149
- if (!username && !email) {
150
- return {
151
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameOrEmailRequired),
152
- };
153
- }
154
- try {
155
- const result = await this.apiClient.post('/user/request-email-login', {
156
- email: email ? email.email : undefined,
157
- username,
158
- });
159
- if (result.data.message) {
160
- return result.data.message;
161
- }
162
- }
163
- catch (error) {
164
- if ((0, axios_1.isAxiosError)(error) && error.response) {
165
- return {
166
- error: error.response.data.error?.message ??
167
- error.response.data.message ??
168
- error.message ??
169
- (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
170
- ...(error.response.data.errorType
171
- ? { errorType: error.response.data.errorType }
172
- : {}),
173
- };
174
- }
175
- }
176
- return {
177
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
178
- };
179
- }
180
- async emailChallengeLogin(mnemonic, token, username, email) {
181
- if (!username && !email) {
182
- return {
183
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameOrEmailRequired),
184
- };
185
- }
186
- try {
187
- const { wallet } = this.cryptoCore.walletAndSeedFromMnemonic(mnemonic);
188
- const challengeBuffer = (0, ecies_lib_1.hexToUint8Array)(token);
189
- const privateKeyBuffer = wallet.getPrivateKey();
190
- const signature = this.eciesService.signMessage(privateKeyBuffer, challengeBuffer);
191
- const signatureHex = (0, ecies_lib_1.uint8ArrayToHex)(signature);
192
- const response = await this.apiClient.post('/user/email-login', {
193
- token,
194
- signature: signatureHex,
195
- username: username ?? null,
196
- email: email ?? null,
197
- });
198
- if (response.data.token && response.data.user) {
199
- return {
200
- message: response.data.message,
201
- token: response.data.token,
202
- user: response.data.user,
203
- wallet,
204
- };
205
- }
206
- }
207
- catch (error) {
208
- if ((0, axios_1.isAxiosError)(error) && error.response) {
209
- return {
210
- error: error.response.data.error?.message ??
211
- error.response.data.message ??
212
- error.message ??
213
- (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
214
- ...(error.response.data.errorType
215
- ? { errorType: error.response.data.errorType }
216
- : {}),
217
- };
218
- }
219
- }
220
- return {
221
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
222
- };
223
- }
224
- async verifyToken(token) {
225
- try {
226
- const response = await this.apiClient.get('/user/verify', {
227
- headers: { Authorization: `Bearer ${token}` },
228
- });
229
- return response.data.user;
230
- }
231
- catch (error) {
232
- if ((0, axios_1.isAxiosError)(error) && error.response) {
233
- return {
234
- error: error.response.data.message
235
- ? error.response.data.message
236
- : error.message
237
- ? error.message
238
- : (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
239
- ...(error.response.data.errorType
240
- ? { errorType: error.response.data.errorType }
241
- : {}),
242
- };
243
- }
244
- else {
245
- return {
246
- error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
247
- };
248
- }
249
- }
250
- }
251
- async refreshToken() {
252
- try {
253
- const refreshResponse = await this.authenticatedApiClient.get('/user/refresh-token');
254
- if (refreshResponse.status === 200) {
255
- const newToken = refreshResponse.headers['authorization'];
256
- let token = undefined;
257
- let user = undefined;
258
- if (newToken?.startsWith('Bearer ')) {
259
- token = newToken.slice(7);
260
- }
261
- if (refreshResponse.data.user) {
262
- user = refreshResponse.data.user;
263
- }
264
- if (token && user) {
265
- return { token, user };
266
- }
267
- }
268
- }
269
- catch (error) {
270
- console.error('Token refresh error:', error);
271
- if ((0, axios_1.isAxiosError)(error) && error.response) {
272
- console.error('Error response:', error.response.data);
273
- console.error('Error status:', error.response.status);
274
- }
275
- }
276
- throw new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError);
277
- }
278
- async changePassword(currentPassword, newPassword) {
279
- try {
280
- await this.authenticatedApiClient.post('/user/change-password', {
281
- currentPassword,
282
- newPassword,
283
- });
284
- return { success: true };
285
- }
286
- catch (error) {
287
- if ((0, axios_1.isAxiosError)(error) && error.response) {
288
- return {
289
- error: error.response.data.error?.message ??
290
- error.response.data.message ??
291
- error.message ??
292
- (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
293
- ...(error.response.data.errorType
294
- ? { errorType: error.response.data.errorType }
295
- : {}),
296
- };
297
- }
298
- return { error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError) };
299
- }
300
- }
301
- async backupCodeLogin(identifier, code, isEmail, recoverMnemonic, newPassword) {
302
- try {
303
- const response = await this.apiClient.post('/user/backup-code', {
304
- [isEmail ? 'email' : 'username']: identifier,
305
- code,
306
- recoverMnemonic,
307
- ...(newPassword ? { newPassword } : {}),
308
- });
309
- if (response.data.token && response.data.user) {
310
- return {
311
- token: response.data.token,
312
- user: response.data.user,
313
- codeCount: response.data.codeCount ?? 0,
314
- ...(response.data.mnemonic ? { mnemonic: response.data.mnemonic } : {}),
315
- ...(response.data.message ? { message: response.data.message } : {}),
316
- };
317
- }
318
- return {
319
- error: response.data.message
320
- ? response.data.message
321
- : (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidToken),
322
- ...(response.data.errorType
323
- ? { errorType: response.data.errorType }
324
- : {}),
325
- };
326
- }
327
- catch (error) {
328
- console.error('Backup code login error:', error);
329
- if ((0, axios_1.isAxiosError)(error) && error.response) {
330
- return {
331
- error: error.response.data.error.message ??
332
- error.response.data.message ??
333
- error.message ??
334
- (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError),
335
- ...(error.response.data.errorType
336
- ? { errorType: error.response.data.errorType }
337
- : {}),
338
- status: error.response.status,
339
- };
340
- }
341
- return { error: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_UnexpectedError) };
342
- }
343
- }
344
- }
345
- exports.AuthService = AuthService;
346
- const createAuthService = (constants, baseUrl, eciesConfig) => new AuthService(constants, baseUrl, eciesConfig);
347
- exports.createAuthService = createAuthService;
@@ -1,3 +0,0 @@
1
- import axios from 'axios';
2
- export declare function createAuthenticatedApiClient(baseURL: string, tokenKey?: string): axios.AxiosInstance;
3
- //# sourceMappingURL=authenticatedApi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authenticatedApi.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/services/authenticatedApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAoB,uBAc3F"}
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAuthenticatedApiClient = createAuthenticatedApiClient;
4
- const tslib_1 = require("tslib");
5
- const axios_1 = tslib_1.__importDefault(require("axios"));
6
- function createAuthenticatedApiClient(baseURL, tokenKey = 'authToken') {
7
- const api = axios_1.default.create({ baseURL });
8
- api.interceptors.request.use((config) => {
9
- const token = localStorage.getItem(tokenKey);
10
- if (token) {
11
- config.headers['Authorization'] = `Bearer ${token}`;
12
- }
13
- const languageCode = localStorage.getItem('languageCode') ?? 'en-US';
14
- config.headers['Accept-Language'] = languageCode;
15
- return config;
16
- });
17
- return api;
18
- }
@@ -1,4 +0,0 @@
1
- export * from './api';
2
- export * from './authenticatedApi';
3
- export * from './authService';
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./api"), exports);
5
- tslib_1.__exportStar(require("./authenticatedApi"), exports);
6
- tslib_1.__exportStar(require("./authService"), exports);
@@ -1,11 +0,0 @@
1
- export type MenuType = string & {
2
- readonly __brand: 'MenuType';
3
- };
4
- export declare const createMenuType: (id: string) => MenuType;
5
- export declare const MenuTypes: {
6
- readonly SideMenu: MenuType;
7
- readonly TopMenu: MenuType;
8
- readonly UserMenu: MenuType;
9
- };
10
- export type BuiltInMenuType = typeof MenuTypes[keyof typeof MenuTypes];
11
- //# sourceMappingURL=MenuType.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MenuType.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/types/MenuType.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAGjE,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,KAAG,QAA0B,CAAC;AAGvE,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAGX,MAAM,MAAM,eAAe,GAAG,OAAO,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC"}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MenuTypes = exports.createMenuType = void 0;
4
- // Factory function to create menu types
5
- const createMenuType = (id) => id;
6
- exports.createMenuType = createMenuType;
7
- // Built-in menu types
8
- exports.MenuTypes = {
9
- SideMenu: (0, exports.createMenuType)('SideMenu'),
10
- TopMenu: (0, exports.createMenuType)('TopMenu'),
11
- UserMenu: (0, exports.createMenuType)('UserMenu'),
12
- };
@@ -1,3 +0,0 @@
1
- export declare const ExpirationSecondsOptionValues: number[];
2
- export declare function createExpirationSecondsOptionNames(secondsLabel: string, minuteLabel: string, minutesLabel: string): string[];
3
- //# sourceMappingURL=expirationSeconds.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"expirationSeconds.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/types/expirationSeconds.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,6BAA6B,UAAqC,CAAC;AAEhF,wBAAgB,kCAAkC,CAChD,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,EAAE,CAWV"}
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ExpirationSecondsOptionValues = void 0;
4
- exports.createExpirationSecondsOptionNames = createExpirationSecondsOptionNames;
5
- exports.ExpirationSecondsOptionValues = [0, 10, 30, 45, 60, 120, 300, 600];
6
- function createExpirationSecondsOptionNames(secondsLabel, minuteLabel, minutesLabel) {
7
- return [
8
- `0 ${secondsLabel}`,
9
- `10 ${secondsLabel}`,
10
- `30 ${secondsLabel}`,
11
- `45 ${secondsLabel}`,
12
- `1 ${minuteLabel}`,
13
- `2 ${minutesLabel}`,
14
- `5 ${minutesLabel}`,
15
- `10 ${minutesLabel}`,
16
- ];
17
- }
@@ -1,2 +0,0 @@
1
- export * from './MenuType';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
@@ -1,4 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./MenuType"), exports);
@@ -1,10 +0,0 @@
1
- /**
2
- * Translation function type for components
3
- * Accepts a key and optional variables, returns translated string
4
- */
5
- export type TranslationFunction = (key: string, variables?: Record<string, string | number>) => string;
6
- /**
7
- * Helper to get translated text or fallback to provided string
8
- */
9
- export declare function getTranslatedText(t: TranslationFunction | undefined, key: string, fallback: string, variables?: Record<string, string | number>): string;
10
- //# sourceMappingURL=translation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"translation.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/types/translation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACxC,MAAM,CAAC;AAEZ;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,mBAAmB,GAAG,SAAS,EAClC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAC1C,MAAM,CAER"}
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTranslatedText = getTranslatedText;
4
- /**
5
- * Helper to get translated text or fallback to provided string
6
- */
7
- function getTranslatedText(t, key, fallback, variables) {
8
- return t ? t(key, variables) : fallback;
9
- }
@@ -1,8 +0,0 @@
1
- import { FC } from 'react';
2
- import { BackupCodeLoginForm } from '../components/BackupCodeLoginForm';
3
- export interface BackupCodeLoginWrapperProps {
4
- onSuccess?: () => void;
5
- componentProps?: Partial<React.ComponentProps<typeof BackupCodeLoginForm>>;
6
- }
7
- export declare const BackupCodeLoginWrapper: FC<BackupCodeLoginWrapperProps>;
8
- //# sourceMappingURL=BackupCodeLoginWrapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackupCodeLoginWrapper.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/wrappers/BackupCodeLoginWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAGxE,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC;CAC5E;AAED,eAAO,MAAM,sBAAsB,EAAE,EAAE,CAAC,2BAA2B,CAwBlE,CAAC"}
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BackupCodeLoginWrapper = void 0;
4
- const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_router_dom_1 = require("react-router-dom");
6
- const BackupCodeLoginForm_1 = require("../components/BackupCodeLoginForm");
7
- const contexts_1 = require("../contexts");
8
- const BackupCodeLoginWrapper = ({ onSuccess, componentProps = {}, }) => {
9
- const { backupCodeLogin, isAuthenticated } = (0, contexts_1.useAuth)();
10
- const navigate = (0, react_router_dom_1.useNavigate)();
11
- const { routes } = (0, contexts_1.useSuiteConfig)();
12
- const handleSubmit = async (...args) => {
13
- const result = await backupCodeLogin(...args);
14
- if ('token' in result && onSuccess) {
15
- onSuccess();
16
- }
17
- return result;
18
- };
19
- return ((0, jsx_runtime_1.jsx)(BackupCodeLoginForm_1.BackupCodeLoginForm, { onSubmit: handleSubmit, onNavigate: navigate, isAuthenticated: isAuthenticated, ...componentProps }));
20
- };
21
- exports.BackupCodeLoginWrapper = BackupCodeLoginWrapper;
@@ -1,7 +0,0 @@
1
- import { FC } from 'react';
2
- import { BackupCodesForm } from '../components/BackupCodesForm';
3
- export interface BackupCodesWrapperProps {
4
- componentProps?: Partial<React.ComponentProps<typeof BackupCodesForm>>;
5
- }
6
- export declare const BackupCodesWrapper: FC<BackupCodesWrapperProps>;
7
- //# sourceMappingURL=BackupCodesWrapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BackupCodesWrapper.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/wrappers/BackupCodesWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;CACxE;AAED,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAkB1D,CAAC"}
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BackupCodesWrapper = void 0;
4
- const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_router_dom_1 = require("react-router-dom");
6
- const BackupCodesForm_1 = require("../components/BackupCodesForm");
7
- const hooks_1 = require("../hooks");
8
- const BackupCodesWrapper = ({ componentProps = {}, }) => {
9
- const location = (0, react_router_dom_1.useLocation)();
10
- const initialCodeCount = location.state?.codeCount ?? null;
11
- const { backupCodesRemaining, generateBackupCodes } = (0, hooks_1.useBackupCodes)({ initialCodeCount });
12
- const handleSubmit = async (values) => {
13
- return await generateBackupCodes(values.password, values.mnemonic);
14
- };
15
- return ((0, jsx_runtime_1.jsx)(BackupCodesForm_1.BackupCodesForm, { onSubmit: handleSubmit, backupCodesRemaining: backupCodesRemaining, ...componentProps }));
16
- };
17
- exports.BackupCodesWrapper = BackupCodesWrapper;
@@ -1,8 +0,0 @@
1
- import { FC } from 'react';
2
- import { ChangePasswordForm } from '../components/ChangePasswordForm';
3
- export interface ChangePasswordFormWrapperProps {
4
- onSuccess?: () => void;
5
- componentProps?: Partial<React.ComponentProps<typeof ChangePasswordForm>>;
6
- }
7
- export declare const ChangePasswordFormWrapper: FC<ChangePasswordFormWrapperProps>;
8
- //# sourceMappingURL=ChangePasswordFormWrapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChangePasswordFormWrapper.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/wrappers/ChangePasswordFormWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAGtE,MAAM,WAAW,8BAA8B;IAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;CAC3E;AAED,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,8BAA8B,CAqBxE,CAAC"}
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ChangePasswordFormWrapper = void 0;
4
- const jsx_runtime_1 = require("react/jsx-runtime");
5
- const ChangePasswordForm_1 = require("../components/ChangePasswordForm");
6
- const contexts_1 = require("../contexts");
7
- const ChangePasswordFormWrapper = ({ onSuccess, componentProps = {}, }) => {
8
- const { changePassword } = (0, contexts_1.useAuth)();
9
- const handleSubmit = async (values) => {
10
- const result = await changePassword(values.currentPassword, values.newPassword);
11
- if ('error' in result) {
12
- throw new Error(result.error);
13
- }
14
- if (onSuccess) {
15
- onSuccess();
16
- }
17
- return result;
18
- };
19
- return (0, jsx_runtime_1.jsx)(ChangePasswordForm_1.ChangePasswordForm, { onSubmit: handleSubmit, ...componentProps });
20
- };
21
- exports.ChangePasswordFormWrapper = ChangePasswordFormWrapper;
@@ -1,9 +0,0 @@
1
- import { FC } from 'react';
2
- import { LoginFormProps } from '../components/LoginForm';
3
- export interface LoginFormWrapperProps {
4
- onSuccess?: () => void;
5
- redirectTo?: string;
6
- componentProps?: Partial<Omit<LoginFormProps, 'onSubmit'>>;
7
- }
8
- export declare const LoginFormWrapper: FC<LoginFormWrapperProps>;
9
- //# sourceMappingURL=LoginFormWrapper.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LoginFormWrapper.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/wrappers/LoginFormWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAG3B,OAAO,EAA8B,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIrF,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;CAC5D;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA6CtD,CAAC"}