@digitaldefiance/express-suite-react-components 2.9.6 → 2.9.9

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/package.json +6 -5
  2. package/src/auth/Private.d.ts +6 -0
  3. package/src/auth/Private.d.ts.map +1 -0
  4. package/src/auth/Private.js +14 -0
  5. package/src/auth/PrivateRoute.d.ts +8 -0
  6. package/src/auth/PrivateRoute.d.ts.map +1 -0
  7. package/src/auth/PrivateRoute.js +23 -0
  8. package/src/auth/UnAuth.d.ts +6 -0
  9. package/src/auth/UnAuth.d.ts.map +1 -0
  10. package/src/auth/UnAuth.js +14 -0
  11. package/src/auth/UnAuthRoute.d.ts +8 -0
  12. package/src/auth/UnAuthRoute.d.ts.map +1 -0
  13. package/src/auth/UnAuthRoute.js +22 -0
  14. package/src/auth/{index.ts → index.d.ts} +2 -1
  15. package/src/auth/index.d.ts.map +1 -0
  16. package/src/auth/index.js +10 -0
  17. package/src/components/ApiAccess.d.ts +16 -0
  18. package/src/components/ApiAccess.d.ts.map +1 -0
  19. package/src/components/ApiAccess.js +70 -0
  20. package/src/components/BackupCodeLoginForm.d.ts +43 -0
  21. package/src/components/BackupCodeLoginForm.d.ts.map +1 -0
  22. package/src/components/BackupCodeLoginForm.js +106 -0
  23. package/src/components/BackupCodesForm.d.ts +26 -0
  24. package/src/components/BackupCodesForm.d.ts.map +1 -0
  25. package/src/components/BackupCodesForm.js +108 -0
  26. package/src/components/ChangePasswordForm.d.ts +26 -0
  27. package/src/components/ChangePasswordForm.d.ts.map +1 -0
  28. package/src/components/ChangePasswordForm.js +66 -0
  29. package/src/components/ConfirmationDialog.d.ts +13 -0
  30. package/src/components/ConfirmationDialog.d.ts.map +1 -0
  31. package/src/components/ConfirmationDialog.js +10 -0
  32. package/src/components/CurrencyCodeSelector.d.ts +9 -0
  33. package/src/components/CurrencyCodeSelector.d.ts.map +1 -0
  34. package/src/components/CurrencyCodeSelector.js +31 -0
  35. package/src/components/CurrencyInput.d.ts +13 -0
  36. package/src/components/CurrencyInput.d.ts.map +1 -0
  37. package/src/components/CurrencyInput.js +22 -0
  38. package/src/components/DashboardPage.d.ts +8 -0
  39. package/src/components/DashboardPage.d.ts.map +1 -0
  40. package/src/components/DashboardPage.js +10 -0
  41. package/src/components/DropdownMenu.d.ts +9 -0
  42. package/src/components/DropdownMenu.d.ts.map +1 -0
  43. package/src/components/DropdownMenu.js +56 -0
  44. package/src/components/ExpirationSecondsSelector.d.ts +13 -0
  45. package/src/components/ExpirationSecondsSelector.d.ts.map +1 -0
  46. package/src/components/ExpirationSecondsSelector.js +32 -0
  47. package/src/components/Flag.d.ts +20 -0
  48. package/src/components/Flag.d.ts.map +1 -0
  49. package/src/components/Flag.js +43 -0
  50. package/src/components/ForgotPasswordForm.d.ts +18 -0
  51. package/src/components/ForgotPasswordForm.d.ts.map +1 -0
  52. package/src/components/ForgotPasswordForm.js +54 -0
  53. package/src/components/LoginForm.d.ts +44 -0
  54. package/src/components/LoginForm.d.ts.map +1 -0
  55. package/src/components/LoginForm.js +99 -0
  56. package/src/components/LogoutPage.d.ts +8 -0
  57. package/src/components/LogoutPage.d.ts.map +1 -0
  58. package/src/components/LogoutPage.js +16 -0
  59. package/src/components/RegisterForm.d.ts +54 -0
  60. package/src/components/RegisterForm.d.ts.map +1 -0
  61. package/src/components/RegisterForm.js +105 -0
  62. package/src/components/ResetPasswordForm.d.ts +23 -0
  63. package/src/components/ResetPasswordForm.d.ts.map +1 -0
  64. package/src/components/ResetPasswordForm.js +68 -0
  65. package/src/components/SideMenu.d.ts +8 -0
  66. package/src/components/SideMenu.d.ts.map +1 -0
  67. package/src/components/SideMenu.js +25 -0
  68. package/src/components/SideMenuListItem.d.ts +13 -0
  69. package/src/components/SideMenuListItem.d.ts.map +1 -0
  70. package/src/components/SideMenuListItem.js +44 -0
  71. package/src/components/TopMenu.d.ts +24 -0
  72. package/src/components/TopMenu.d.ts.map +1 -0
  73. package/src/components/TopMenu.js +42 -0
  74. package/src/components/TranslatedTitle.d.ts +7 -0
  75. package/src/components/TranslatedTitle.d.ts.map +1 -0
  76. package/src/components/TranslatedTitle.js +15 -0
  77. package/src/components/UserLanguageSelector.d.ts +4 -0
  78. package/src/components/UserLanguageSelector.d.ts.map +1 -0
  79. package/src/components/UserLanguageSelector.js +31 -0
  80. package/src/components/UserMenu.d.ts +4 -0
  81. package/src/components/UserMenu.d.ts.map +1 -0
  82. package/src/components/UserMenu.js +12 -0
  83. package/src/components/UserSettingsForm.d.ts +56 -0
  84. package/src/components/UserSettingsForm.d.ts.map +1 -0
  85. package/src/components/UserSettingsForm.js +93 -0
  86. package/src/components/VerifyEmailPage.d.ts +23 -0
  87. package/src/components/VerifyEmailPage.d.ts.map +1 -0
  88. package/src/components/VerifyEmailPage.js +61 -0
  89. package/src/components/{index.ts → index.d.ts} +1 -1
  90. package/src/components/index.d.ts.map +1 -0
  91. package/src/components/index.js +28 -0
  92. package/src/contexts/AuthProvider.d.ts +152 -0
  93. package/src/contexts/AuthProvider.d.ts.map +1 -0
  94. package/src/contexts/AuthProvider.js +446 -0
  95. package/src/contexts/I18nProvider.d.ts +16 -0
  96. package/src/contexts/I18nProvider.d.ts.map +1 -0
  97. package/src/contexts/I18nProvider.js +46 -0
  98. package/src/contexts/MenuContext.d.ts +20 -0
  99. package/src/contexts/MenuContext.d.ts.map +1 -0
  100. package/src/contexts/MenuContext.js +244 -0
  101. package/src/contexts/SuiteConfigProvider.d.ts +44 -0
  102. package/src/contexts/SuiteConfigProvider.d.ts.map +1 -0
  103. package/src/contexts/SuiteConfigProvider.js +43 -0
  104. package/src/contexts/ThemeProvider.d.ts +15 -0
  105. package/src/contexts/ThemeProvider.d.ts.map +1 -0
  106. package/src/contexts/ThemeProvider.js +36 -0
  107. package/src/contexts/{index.ts → index.d.ts} +1 -0
  108. package/src/contexts/index.d.ts.map +1 -0
  109. package/src/contexts/index.js +8 -0
  110. package/src/hooks/{index.ts → index.d.ts} +1 -0
  111. package/src/hooks/index.d.ts.map +1 -0
  112. package/src/hooks/index.js +8 -0
  113. package/src/hooks/useBackupCodes.d.ts +15 -0
  114. package/src/hooks/useBackupCodes.d.ts.map +1 -0
  115. package/src/hooks/useBackupCodes.js +70 -0
  116. package/src/hooks/useEmailVerification.d.ts +10 -0
  117. package/src/hooks/useEmailVerification.d.ts.map +1 -0
  118. package/src/hooks/useEmailVerification.js +36 -0
  119. package/src/hooks/useExpiringValue.d.ts +14 -0
  120. package/src/hooks/useExpiringValue.d.ts.map +1 -0
  121. package/src/hooks/useExpiringValue.js +53 -0
  122. package/src/hooks/useLocalStorage.d.ts +2 -0
  123. package/src/hooks/useLocalStorage.d.ts.map +1 -0
  124. package/src/hooks/useLocalStorage.js +15 -0
  125. package/src/hooks/useUserSettings.d.ts +46 -0
  126. package/src/hooks/useUserSettings.d.ts.map +1 -0
  127. package/src/hooks/useUserSettings.js +152 -0
  128. package/src/{index.ts → index.d.ts} +1 -1
  129. package/src/index.d.ts.map +1 -0
  130. package/src/index.js +12 -0
  131. package/src/interfaces/IAppConfig.d.ts +6 -0
  132. package/src/interfaces/IAppConfig.d.ts.map +1 -0
  133. package/src/interfaces/IAppConfig.js +2 -0
  134. package/src/interfaces/IMenuConfig.d.ts +11 -0
  135. package/src/interfaces/IMenuConfig.d.ts.map +1 -0
  136. package/src/interfaces/IMenuConfig.js +2 -0
  137. package/src/interfaces/IMenuOption.d.ts +58 -0
  138. package/src/interfaces/IMenuOption.d.ts.map +1 -0
  139. package/src/interfaces/IMenuOption.js +2 -0
  140. package/src/interfaces/index.d.ts +4 -0
  141. package/src/interfaces/index.d.ts.map +1 -0
  142. package/src/interfaces/index.js +6 -0
  143. package/src/services/__mocks__/authService.d.ts +21 -0
  144. package/src/services/__mocks__/authService.d.ts.map +1 -0
  145. package/src/services/__mocks__/authService.js +15 -0
  146. package/src/services/api.d.ts +3 -0
  147. package/src/services/api.d.ts.map +1 -0
  148. package/src/services/api.js +14 -0
  149. package/src/services/authService.d.ts +72 -0
  150. package/src/services/authService.d.ts.map +1 -0
  151. package/src/services/authService.js +347 -0
  152. package/src/services/authenticatedApi.d.ts +3 -0
  153. package/src/services/authenticatedApi.d.ts.map +1 -0
  154. package/src/services/authenticatedApi.js +18 -0
  155. package/src/services/index.d.ts +4 -0
  156. package/src/services/index.d.ts.map +1 -0
  157. package/src/services/index.js +6 -0
  158. package/src/types/MenuType.d.ts +11 -0
  159. package/src/types/MenuType.d.ts.map +1 -0
  160. package/src/types/MenuType.js +12 -0
  161. package/src/types/expirationSeconds.d.ts +3 -0
  162. package/src/types/expirationSeconds.d.ts.map +1 -0
  163. package/src/types/expirationSeconds.js +17 -0
  164. package/src/types/index.d.ts +2 -0
  165. package/src/types/index.d.ts.map +1 -0
  166. package/src/types/index.js +4 -0
  167. package/src/types/translation.d.ts +10 -0
  168. package/src/types/translation.d.ts.map +1 -0
  169. package/src/types/translation.js +9 -0
  170. package/src/wrappers/BackupCodeLoginWrapper.d.ts +8 -0
  171. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +1 -0
  172. package/src/wrappers/BackupCodeLoginWrapper.js +21 -0
  173. package/src/wrappers/BackupCodesWrapper.d.ts +7 -0
  174. package/src/wrappers/BackupCodesWrapper.d.ts.map +1 -0
  175. package/src/wrappers/BackupCodesWrapper.js +17 -0
  176. package/src/wrappers/ChangePasswordFormWrapper.d.ts +8 -0
  177. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +1 -0
  178. package/src/wrappers/ChangePasswordFormWrapper.js +21 -0
  179. package/src/wrappers/LoginFormWrapper.d.ts +9 -0
  180. package/src/wrappers/LoginFormWrapper.d.ts.map +1 -0
  181. package/src/wrappers/LoginFormWrapper.js +43 -0
  182. package/src/wrappers/LogoutPageWrapper.d.ts +9 -0
  183. package/src/wrappers/LogoutPageWrapper.d.ts.map +1 -0
  184. package/src/wrappers/LogoutPageWrapper.js +21 -0
  185. package/src/wrappers/RegisterFormWrapper.d.ts +9 -0
  186. package/src/wrappers/RegisterFormWrapper.d.ts.map +1 -0
  187. package/src/wrappers/RegisterFormWrapper.js +26 -0
  188. package/src/wrappers/UserSettingsFormWrapper.d.ts +8 -0
  189. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +1 -0
  190. package/src/wrappers/UserSettingsFormWrapper.js +24 -0
  191. package/src/wrappers/VerifyEmailPageWrapper.d.ts +8 -0
  192. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +1 -0
  193. package/src/wrappers/VerifyEmailPageWrapper.js +20 -0
  194. package/src/wrappers/{index.tsx → index.d.ts} +1 -8
  195. package/src/wrappers/index.d.ts.map +1 -0
  196. package/src/wrappers/index.js +20 -0
  197. package/LICENSE +0 -21
  198. package/src/auth/Private.tsx +0 -17
  199. package/src/auth/PrivateRoute.tsx +0 -28
  200. package/src/auth/UnAuth.tsx +0 -16
  201. package/src/auth/UnAuthRoute.tsx +0 -30
  202. package/src/components/ApiAccess.tsx +0 -134
  203. package/src/components/BackupCodeLoginForm.tsx +0 -314
  204. package/src/components/BackupCodesForm.tsx +0 -198
  205. package/src/components/ChangePasswordForm.tsx +0 -182
  206. package/src/components/ConfirmationDialog.tsx +0 -48
  207. package/src/components/CurrencyCodeSelector.tsx +0 -60
  208. package/src/components/CurrencyInput.tsx +0 -80
  209. package/src/components/DashboardPage.tsx +0 -24
  210. package/src/components/DropdownMenu.tsx +0 -92
  211. package/src/components/ExpirationSecondsSelector.tsx +0 -65
  212. package/src/components/Flag.tsx +0 -53
  213. package/src/components/ForgotPasswordForm.tsx +0 -120
  214. package/src/components/LoginForm.tsx +0 -307
  215. package/src/components/LogoutPage.tsx +0 -21
  216. package/src/components/RegisterForm.tsx +0 -354
  217. package/src/components/ResetPasswordForm.tsx +0 -164
  218. package/src/components/SideMenu.tsx +0 -46
  219. package/src/components/SideMenuListItem.tsx +0 -74
  220. package/src/components/TopMenu.tsx +0 -149
  221. package/src/components/TranslatedTitle.tsx +0 -22
  222. package/src/components/UserLanguageSelector.tsx +0 -45
  223. package/src/components/UserMenu.tsx +0 -15
  224. package/src/components/UserSettingsForm.tsx +0 -328
  225. package/src/components/VerifyEmailPage.tsx +0 -133
  226. package/src/contexts/AuthProvider.spec.tsx +0 -1060
  227. package/src/contexts/AuthProvider.tsx +0 -741
  228. package/src/contexts/I18nProvider.tsx +0 -85
  229. package/src/contexts/MenuContext.tsx +0 -310
  230. package/src/contexts/SuiteConfigProvider.tsx +0 -93
  231. package/src/contexts/ThemeProvider.tsx +0 -67
  232. package/src/hooks/useBackupCodes.ts +0 -85
  233. package/src/hooks/useEmailVerification.ts +0 -39
  234. package/src/hooks/useExpiringValue.ts +0 -78
  235. package/src/hooks/useLocalStorage.ts +0 -18
  236. package/src/hooks/useUserSettings.ts +0 -216
  237. package/src/interfaces/IAppConfig.ts +0 -5
  238. package/src/interfaces/IMenuConfig.ts +0 -11
  239. package/src/interfaces/IMenuOption.ts +0 -55
  240. package/src/interfaces/index.ts +0 -3
  241. package/src/services/__mocks__/authService.ts +0 -14
  242. package/src/services/api.ts +0 -13
  243. package/src/services/authService.ts +0 -422
  244. package/src/services/authenticatedApi.ts +0 -17
  245. package/src/services/index.ts +0 -3
  246. package/src/types/MenuType.ts +0 -15
  247. package/src/types/expirationSeconds.ts +0 -18
  248. package/src/types/index.ts +0 -1
  249. package/src/types/translation.ts +0 -20
  250. package/src/wrappers/BackupCodeLoginWrapper.tsx +0 -35
  251. package/src/wrappers/BackupCodesWrapper.tsx +0 -28
  252. package/src/wrappers/ChangePasswordFormWrapper.tsx +0 -31
  253. package/src/wrappers/LoginFormWrapper.tsx +0 -59
  254. package/src/wrappers/LogoutPageWrapper.tsx +0 -30
  255. package/src/wrappers/RegisterFormWrapper.tsx +0 -48
  256. package/src/wrappers/UserSettingsFormWrapper.tsx +0 -39
  257. package/src/wrappers/VerifyEmailPageWrapper.tsx +0 -27
@@ -1,422 +0,0 @@
1
- // services/authService.js
2
- import {
3
- EciesCryptoCore,
4
- ECIESService,
5
- EmailString,
6
- hexToUint8Array,
7
- IECIESConfig,
8
- SecureString,
9
- uint8ArrayToHex,
10
- } from '@digitaldefiance/ecies-lib';
11
- import { getSuiteCoreTranslation, IConstants, IRequestUserDTO, SuiteCoreStringKey, TranslatableSuiteError } from '@digitaldefiance/suite-core-lib';
12
- import { CoreLanguageCode } from '@digitaldefiance/i18n-lib';
13
- import { Wallet } from '@ethereumjs/wallet';
14
- import axios, { isAxiosError } from 'axios';
15
- import { createApiClient } from './api';
16
- import { createAuthenticatedApiClient } from './authenticatedApi';
17
-
18
- interface AuthContextFunctions {
19
- setUser: (user: IRequestUserDTO | null) => void;
20
- setLanguage: (lang: CoreLanguageCode) => void;
21
- }
22
-
23
- export class AuthService {
24
- private eciesService: ECIESService;
25
- private cryptoCore: EciesCryptoCore;
26
- private apiClient: axios.AxiosInstance;
27
- private authenticatedApiClient: axios.AxiosInstance;
28
-
29
- constructor(
30
- private constants: IConstants,
31
- private baseUrl: string,
32
- eciesConfig: IECIESConfig
33
- ) {
34
- this.eciesService = new ECIESService(eciesConfig);
35
- this.cryptoCore = new EciesCryptoCore(eciesConfig);
36
- this.apiClient = createApiClient(this.baseUrl);
37
- this.authenticatedApiClient = createAuthenticatedApiClient(this.baseUrl);
38
- }
39
-
40
- getSiteDomain(): string {
41
- return this.constants.AdministratorEmail.split('@')[1];
42
- }
43
-
44
- async register(
45
- username: string,
46
- email: string,
47
- timezone: string,
48
- password?: string,
49
- ): Promise<
50
- | { success: boolean; message: string; mnemonic: string }
51
- | {
52
- error: string;
53
- errorType?: string;
54
- field?: string;
55
- errors?: Array<Record<string, string>>;
56
- }
57
- > {
58
- try {
59
- const response = await this.apiClient.post('/user/register', {
60
- username,
61
- email,
62
- timezone,
63
- ...(password ? { password } : {}),
64
- });
65
- if (response.status !== 201) {
66
- return {
67
- error: response.data.message
68
- ? response.data.message
69
- : getSuiteCoreTranslation(SuiteCoreStringKey.Registration_Error),
70
- ...(response.data.errorType
71
- ? { errorType: response.data.errorType }
72
- : {}),
73
- ...(response.data.errors ? { errors: response.data.errors } : {}),
74
- };
75
- }
76
- return {
77
- success: true,
78
- message:
79
- response.data.message ??
80
- getSuiteCoreTranslation(SuiteCoreStringKey.Registration_Success, {
81
- MNEMONIC: response.data.mnemonic,
82
- }),
83
- mnemonic: response.data.mnemonic,
84
- };
85
- } catch (error) {
86
- if (isAxiosError(error) && error.response) {
87
- return {
88
- error:
89
- error.response.data.error?.message ??
90
- error.response.data.message ??
91
- error.message ??
92
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
93
- ...(error.response.data.errorType
94
- ? { errorType: error.response.data.errorType }
95
- : {}),
96
- ...(error.response.data.error?.field
97
- ? { field: error.response.data.error.field }
98
- : {}),
99
- ...(error.response.data.errors
100
- ? { errors: error.response.data.errors }
101
- : {}),
102
- };
103
- } else {
104
- return {
105
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
106
- };
107
- }
108
- }
109
- }
110
-
111
- async directLogin(
112
- mnemonic: SecureString,
113
- username?: string,
114
- email?: EmailString,
115
- ): Promise<
116
- | { token: string; user: IRequestUserDTO; wallet: Wallet; message: string }
117
- | { error: string; errorType?: string }
118
- > {
119
- if (!username && !email) {
120
- return {
121
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Validation_UsernameOrEmailRequired),
122
- };
123
- }
124
- try {
125
- const loginRequest = await this.apiClient.post('/user/request-direct-login');
126
- if (loginRequest.data.challenge) {
127
- const { wallet } = this.cryptoCore.walletAndSeedFromMnemonic(mnemonic);
128
- const publicKey = wallet.getPublicKey();
129
- // Add 0x04 prefix for uncompressed public key
130
- const publicKeyWithPrefix = new Uint8Array(publicKey.length + 1);
131
- publicKeyWithPrefix[0] = 0x04;
132
- publicKeyWithPrefix.set(publicKey, 1);
133
- const challengeBuffer = hexToUint8Array(loginRequest.data.challenge);
134
- const privateKeyBuffer = wallet.getPrivateKey();
135
- const signature = this.eciesService.signMessage(privateKeyBuffer, challengeBuffer);
136
- const signatureHex = uint8ArrayToHex(signature);
137
- const loginResponse = await this.apiClient.post('/user/direct-challenge', {
138
- username: username,
139
- email: email ? email.email : undefined,
140
- challenge: loginRequest.data.challenge,
141
- signature: signatureHex,
142
- });
143
- if (loginResponse.data.token && loginResponse.data.user) {
144
- return {
145
- message: loginResponse.data.message,
146
- token: loginResponse.data.token,
147
- user: loginResponse.data.user,
148
- wallet,
149
- };
150
- }
151
- }
152
- } catch (error) {
153
- if (isAxiosError(error) && error.response) {
154
- // Check for DirectChallengeNotEnabled error
155
- if (error.response.status === 403 && error.response.data.errorType === 'DirectChallengeNotEnabledError') {
156
- return {
157
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Error_Login_DirectChallengeNotEnabled),
158
- errorType: 'DirectChallengeNotEnabled',
159
- };
160
- }
161
- // Check for PasswordLoginNotEnabled error
162
- if (error.response.status === 403 && error.response.data.errorType === 'PasswordLoginNotEnabledError') {
163
- return {
164
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Error_Login_PasswordLoginNotEnabled),
165
- errorType: 'PasswordLoginNotEnabled',
166
- };
167
- }
168
-
169
- return {
170
- error:
171
- error.response.data.error?.message ??
172
- error.response.data.message ??
173
- error.message ??
174
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
175
- ...(error.response.data.errorType
176
- ? { errorType: error.response.data.errorType }
177
- : {}),
178
- };
179
- }
180
- console.error('directLogin: non-axios error:', error);
181
- }
182
- return {
183
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
184
- };
185
- }
186
-
187
- async requestEmailLogin(
188
- username?: string,
189
- email?: EmailString,
190
- ): Promise<string | { error: string; errorType?: string }> {
191
- if (!username && !email) {
192
- return {
193
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Validation_UsernameOrEmailRequired),
194
- };
195
- }
196
- try {
197
- const result = await this.apiClient.post('/user/request-email-login', {
198
- email: email ? email.email : undefined,
199
- username,
200
- });
201
- if (result.data.message) {
202
- return result.data.message;
203
- }
204
- } catch (error) {
205
- if (isAxiosError(error) && error.response) {
206
- return {
207
- error:
208
- error.response.data.error?.message ??
209
- error.response.data.message ??
210
- error.message ??
211
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
212
- ...(error.response.data.errorType
213
- ? { errorType: error.response.data.errorType }
214
- : {}),
215
- };
216
- }
217
- }
218
- return {
219
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
220
- };
221
- }
222
-
223
- async emailChallengeLogin(
224
- mnemonic: SecureString,
225
- token: string,
226
- username?: string,
227
- email?: EmailString,
228
- ): Promise<
229
- | { token: string; user: IRequestUserDTO; wallet: Wallet; message: string }
230
- | { error: string; errorType?: string }
231
- > {
232
- if (!username && !email) {
233
- return {
234
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Validation_UsernameOrEmailRequired),
235
- };
236
- }
237
- try {
238
- const { wallet } = this.cryptoCore.walletAndSeedFromMnemonic(mnemonic);
239
- const challengeBuffer = hexToUint8Array(token);
240
- const privateKeyBuffer = wallet.getPrivateKey();
241
- const signature = this.eciesService.signMessage(privateKeyBuffer, challengeBuffer);
242
- const signatureHex = uint8ArrayToHex(signature);
243
- const response = await this.apiClient.post('/user/email-login', {
244
- token,
245
- signature: signatureHex,
246
- username: username ?? null,
247
- email: email ?? null,
248
- });
249
- if (response.data.token && response.data.user) {
250
- return {
251
- message: response.data.message,
252
- token: response.data.token,
253
- user: response.data.user,
254
- wallet,
255
- };
256
- }
257
- } catch (error) {
258
- if (isAxiosError(error) && error.response) {
259
- return {
260
- error:
261
- error.response.data.error?.message ??
262
- error.response.data.message ??
263
- error.message ??
264
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
265
- ...(error.response.data.errorType
266
- ? { errorType: error.response.data.errorType }
267
- : {}),
268
- };
269
- }
270
- }
271
- return {
272
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
273
- };
274
- }
275
-
276
- async verifyToken(
277
- token: string,
278
- ): Promise<IRequestUserDTO | { error: string; errorType?: string }> {
279
- try {
280
- const response = await this.apiClient.get('/user/verify', {
281
- headers: { Authorization: `Bearer ${token}` },
282
- });
283
- return response.data.user as IRequestUserDTO;
284
- } catch (error) {
285
- if (isAxiosError(error) && error.response) {
286
- return {
287
- error: error.response.data.message
288
- ? error.response.data.message
289
- : error.message
290
- ? error.message
291
- : getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
292
- ...(error.response.data.errorType
293
- ? { errorType: error.response.data.errorType }
294
- : {}),
295
- };
296
- } else {
297
- return {
298
- error: getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
299
- };
300
- }
301
- }
302
- }
303
-
304
- async refreshToken(): Promise<{
305
- token: string;
306
- user: IRequestUserDTO;
307
- }> {
308
- try {
309
- const refreshResponse = await this.authenticatedApiClient.get('/user/refresh-token');
310
- if (refreshResponse.status === 200) {
311
- const newToken = refreshResponse.headers['authorization'];
312
- let token: string | undefined = undefined;
313
- let user: IRequestUserDTO | undefined = undefined;
314
- if (newToken?.startsWith('Bearer ')) {
315
- token = newToken.slice(7);
316
- }
317
- if (refreshResponse.data.user) {
318
- user = refreshResponse.data.user;
319
- }
320
- if (token && user) {
321
- return { token, user };
322
- }
323
- }
324
- } catch (error) {
325
- console.error('Token refresh error:', error);
326
- if (isAxiosError(error) && error.response) {
327
- console.error('Error response:', error.response.data);
328
- console.error('Error status:', error.response.status);
329
- }
330
- }
331
- throw new TranslatableSuiteError(SuiteCoreStringKey.Common_UnexpectedError);
332
- }
333
-
334
- async changePassword(
335
- currentPassword: string,
336
- newPassword: string,
337
- ): Promise<{ success: boolean } | { error: string; errorType?: string }> {
338
- try {
339
- await this.authenticatedApiClient.post('/user/change-password', {
340
- currentPassword,
341
- newPassword,
342
- });
343
- return { success: true };
344
- } catch (error) {
345
- if (isAxiosError(error) && error.response) {
346
- return {
347
- error:
348
- error.response.data.error?.message ??
349
- error.response.data.message ??
350
- error.message ??
351
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
352
- ...(error.response.data.errorType
353
- ? { errorType: error.response.data.errorType }
354
- : {}),
355
- };
356
- }
357
- return { error: getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError) };
358
- }
359
- }
360
-
361
- async backupCodeLogin(
362
- identifier: string,
363
- code: string,
364
- isEmail: boolean,
365
- recoverMnemonic: boolean,
366
- newPassword?: string,
367
- ): Promise<
368
- | {
369
- token: string;
370
- codeCount: number;
371
- user?: IRequestUserDTO;
372
- mnemonic?: string;
373
- message?: string;
374
- }
375
- | { error: string; status?: number; errorType?: string }
376
- > {
377
- try {
378
- const response = await this.apiClient.post('/user/backup-code', {
379
- [isEmail ? 'email' : 'username']: identifier,
380
- code,
381
- recoverMnemonic,
382
- ...(newPassword ? { newPassword } : {}),
383
- });
384
- if (response.data.token && response.data.user) {
385
- return {
386
- token: response.data.token,
387
- user: response.data.user,
388
- codeCount: response.data.codeCount ?? 0,
389
- ...(response.data.mnemonic ? { mnemonic: response.data.mnemonic } : {}),
390
- ...(response.data.message ? { message: response.data.message } : {}),
391
- };
392
- }
393
- return {
394
- error: response.data.message
395
- ? response.data.message
396
- : getSuiteCoreTranslation(SuiteCoreStringKey.Validation_InvalidToken),
397
- ...(response.data.errorType
398
- ? { errorType: response.data.errorType }
399
- : {}),
400
- };
401
- } catch (error) {
402
- console.error('Backup code login error:', error);
403
- if (isAxiosError(error) && error.response) {
404
- return {
405
- error:
406
- error.response.data.error.message ??
407
- error.response.data.message ??
408
- error.message ??
409
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError),
410
- ...(error.response.data.errorType
411
- ? { errorType: error.response.data.errorType }
412
- : {}),
413
- status: error.response.status,
414
- };
415
- }
416
- return { error: getSuiteCoreTranslation(SuiteCoreStringKey.Common_UnexpectedError) };
417
- }
418
- }
419
- }
420
-
421
- export const createAuthService = (constants: IConstants, baseUrl: string, eciesConfig: IECIESConfig) =>
422
- new AuthService(constants, baseUrl, eciesConfig);
@@ -1,17 +0,0 @@
1
- import axios from 'axios';
2
-
3
- export function createAuthenticatedApiClient(baseURL: string, tokenKey: string = 'authToken') {
4
- const api = axios.create({ baseURL });
5
-
6
- api.interceptors.request.use((config) => {
7
- const token = localStorage.getItem(tokenKey);
8
- if (token) {
9
- config.headers['Authorization'] = `Bearer ${token}`;
10
- }
11
- const languageCode = localStorage.getItem('languageCode') ?? 'en-US';
12
- config.headers['Accept-Language'] = languageCode;
13
- return config;
14
- });
15
-
16
- return api;
17
- }
@@ -1,3 +0,0 @@
1
- export * from './api';
2
- export * from './authenticatedApi';
3
- export * from './authService';
@@ -1,15 +0,0 @@
1
- // Branded type for menu type identifiers
2
- export type MenuType = string & { readonly __brand: 'MenuType' };
3
-
4
- // Factory function to create menu types
5
- export const createMenuType = (id: string): MenuType => id as MenuType;
6
-
7
- // Built-in menu types
8
- export const MenuTypes = {
9
- SideMenu: createMenuType('SideMenu'),
10
- TopMenu: createMenuType('TopMenu'),
11
- UserMenu: createMenuType('UserMenu'),
12
- } as const;
13
-
14
- // Type for the built-in menu types
15
- export type BuiltInMenuType = typeof MenuTypes[keyof typeof MenuTypes];
@@ -1,18 +0,0 @@
1
- export const ExpirationSecondsOptionValues = [0, 10, 30, 45, 60, 120, 300, 600];
2
-
3
- export function createExpirationSecondsOptionNames(
4
- secondsLabel: string,
5
- minuteLabel: string,
6
- minutesLabel: string
7
- ): string[] {
8
- return [
9
- `0 ${secondsLabel}`,
10
- `10 ${secondsLabel}`,
11
- `30 ${secondsLabel}`,
12
- `45 ${secondsLabel}`,
13
- `1 ${minuteLabel}`,
14
- `2 ${minutesLabel}`,
15
- `5 ${minutesLabel}`,
16
- `10 ${minutesLabel}`,
17
- ];
18
- }
@@ -1 +0,0 @@
1
- export * from './MenuType';
@@ -1,20 +0,0 @@
1
- /**
2
- * Translation function type for components
3
- * Accepts a key and optional variables, returns translated string
4
- */
5
- export type TranslationFunction = (
6
- key: string,
7
- variables?: Record<string, string | number>
8
- ) => string;
9
-
10
- /**
11
- * Helper to get translated text or fallback to provided string
12
- */
13
- export function getTranslatedText(
14
- t: TranslationFunction | undefined,
15
- key: string,
16
- fallback: string,
17
- variables?: Record<string, string | number>
18
- ): string {
19
- return t ? t(key, variables) : fallback;
20
- }
@@ -1,35 +0,0 @@
1
- import { FC } from 'react';
2
- import { useNavigate } from 'react-router-dom';
3
- import { BackupCodeLoginForm } from '../components/BackupCodeLoginForm';
4
- import { useAuth, useSuiteConfig } from '../contexts';
5
-
6
- export interface BackupCodeLoginWrapperProps {
7
- onSuccess?: () => void;
8
- componentProps?: Partial<React.ComponentProps<typeof BackupCodeLoginForm>>;
9
- }
10
-
11
- export const BackupCodeLoginWrapper: FC<BackupCodeLoginWrapperProps> = ({
12
- onSuccess,
13
- componentProps = {},
14
- }) => {
15
- const { backupCodeLogin, isAuthenticated } = useAuth();
16
- const navigate = useNavigate();
17
- const { routes } = useSuiteConfig();
18
-
19
- const handleSubmit: typeof backupCodeLogin = async (...args) => {
20
- const result = await backupCodeLogin(...args);
21
- if ('token' in result && onSuccess) {
22
- onSuccess();
23
- }
24
- return result;
25
- };
26
-
27
- return (
28
- <BackupCodeLoginForm
29
- onSubmit={handleSubmit}
30
- onNavigate={navigate}
31
- isAuthenticated={isAuthenticated}
32
- {...componentProps}
33
- />
34
- );
35
- };
@@ -1,28 +0,0 @@
1
- import { FC } from 'react';
2
- import { useLocation } from 'react-router-dom';
3
- import { BackupCodesForm } from '../components/BackupCodesForm';
4
- import { useBackupCodes } from '../hooks';
5
-
6
- export interface BackupCodesWrapperProps {
7
- componentProps?: Partial<React.ComponentProps<typeof BackupCodesForm>>;
8
- }
9
-
10
- export const BackupCodesWrapper: FC<BackupCodesWrapperProps> = ({
11
- componentProps = {},
12
- }) => {
13
- const location = useLocation();
14
- const initialCodeCount = (location.state as { codeCount?: number })?.codeCount ?? null;
15
- const { backupCodesRemaining, generateBackupCodes } = useBackupCodes({ initialCodeCount });
16
-
17
- const handleSubmit = async (values: { password?: string; mnemonic?: string }) => {
18
- return await generateBackupCodes(values.password, values.mnemonic);
19
- };
20
-
21
- return (
22
- <BackupCodesForm
23
- onSubmit={handleSubmit}
24
- backupCodesRemaining={backupCodesRemaining}
25
- {...componentProps}
26
- />
27
- );
28
- };
@@ -1,31 +0,0 @@
1
- import { FC } from 'react';
2
- import { ChangePasswordForm } from '../components/ChangePasswordForm';
3
- import { useAuth } from '../contexts';
4
-
5
- export interface ChangePasswordFormWrapperProps {
6
- onSuccess?: () => void;
7
- componentProps?: Partial<React.ComponentProps<typeof ChangePasswordForm>>;
8
- }
9
-
10
- export const ChangePasswordFormWrapper: FC<ChangePasswordFormWrapperProps> = ({
11
- onSuccess,
12
- componentProps = {},
13
- }) => {
14
- const { changePassword } = useAuth();
15
-
16
- const handleSubmit = async (values: any) => {
17
- const result = await changePassword(
18
- values.currentPassword,
19
- values.newPassword
20
- );
21
- if ('error' in result) {
22
- throw new Error(result.error);
23
- }
24
- if (onSuccess) {
25
- onSuccess();
26
- }
27
- return result;
28
- };
29
-
30
- return <ChangePasswordForm onSubmit={handleSubmit} {...componentProps} />;
31
- };
@@ -1,59 +0,0 @@
1
- import { FC } from 'react';
2
- import { useNavigate } from 'react-router-dom';
3
- import { SecureString, EmailString } from '@digitaldefiance/ecies-lib';
4
- import { LoginForm, LoginFormValues, LoginFormProps } from '../components/LoginForm';
5
- import { useAuth, useSuiteConfig } from '../contexts';
6
- import { SuiteCoreStringKey, TranslatableSuiteError } from '@digitaldefiance/suite-core-lib';
7
-
8
- export interface LoginFormWrapperProps {
9
- onSuccess?: () => void;
10
- redirectTo?: string;
11
- componentProps?: Partial<Omit<LoginFormProps, 'onSubmit'>>;
12
- }
13
-
14
- export const LoginFormWrapper: FC<LoginFormWrapperProps> = ({
15
- onSuccess,
16
- redirectTo,
17
- componentProps = {},
18
- }) => {
19
- const { directLogin, passwordLogin } = useAuth();
20
- const navigate = useNavigate();
21
- const { routes } = useSuiteConfig();
22
-
23
- const handleSubmit = async (values: LoginFormValues) => {
24
- const email = values.email && values.email.trim().length > 0 ? new EmailString(values.email) : undefined;
25
- const username = values.username && values.username.trim() ? values.username : undefined;
26
-
27
- if (values.password) {
28
- const result = await passwordLogin(
29
- new SecureString(values.password),
30
- username,
31
- email
32
- );
33
- if ('error' in result) {
34
- throw new Error(result.error);
35
- }
36
- if (onSuccess) {
37
- onSuccess();
38
- }
39
- navigate(redirectTo || routes.dashboard || '/dashboard');
40
- } else if (values.mnemonic) {
41
- const result = await directLogin(
42
- new SecureString(values.mnemonic),
43
- username,
44
- email
45
- );
46
- if ('error' in result) {
47
- throw new Error(result.error);
48
- }
49
- if (onSuccess) {
50
- onSuccess();
51
- }
52
- navigate(redirectTo || routes.dashboard || '/dashboard');
53
- } else {
54
- throw new TranslatableSuiteError(SuiteCoreStringKey.Error_NoPasswordOrMnemonicProvided);
55
- }
56
- };
57
-
58
- return <LoginForm onSubmit={handleSubmit} {...componentProps} />;
59
- };
@@ -1,30 +0,0 @@
1
- import { FC } from 'react';
2
- import { useNavigate } from 'react-router-dom';
3
- import { LogoutPage } from '../components/LogoutPage';
4
- import { useAuth, useSuiteConfig } from '../contexts';
5
-
6
- export interface LogoutPageWrapperProps {
7
- onSuccess?: () => void;
8
- redirectTo?: string;
9
- componentProps?: Partial<React.ComponentProps<typeof LogoutPage>>;
10
- }
11
-
12
- export const LogoutPageWrapper: FC<LogoutPageWrapperProps> = ({
13
- onSuccess,
14
- redirectTo,
15
- componentProps = {},
16
- }) => {
17
- const { logout } = useAuth();
18
- const navigate = useNavigate();
19
- const { routes } = useSuiteConfig();
20
-
21
- const handleLogout = async () => {
22
- await logout();
23
- if (onSuccess) {
24
- onSuccess();
25
- }
26
- navigate(redirectTo || routes.login || '/login');
27
- };
28
-
29
- return <LogoutPage onLogout={handleLogout} onNavigate={navigate} {...componentProps} />;
30
- };