@digitaldefiance/express-suite-react-components 5.0.2 → 5.0.3

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 (311) hide show
  1. package/package.json +5 -4
  2. package/src/auth/AdminRoute.d.ts +8 -0
  3. package/src/auth/AdminRoute.d.ts.map +1 -0
  4. package/src/auth/AdminRoute.js +28 -0
  5. package/src/auth/Private.d.ts +6 -0
  6. package/src/auth/Private.d.ts.map +1 -0
  7. package/src/auth/Private.js +14 -0
  8. package/src/auth/PrivateRoute.d.ts +8 -0
  9. package/src/auth/PrivateRoute.d.ts.map +1 -0
  10. package/src/auth/PrivateRoute.js +23 -0
  11. package/src/auth/UnAuth.d.ts +6 -0
  12. package/src/auth/UnAuth.d.ts.map +1 -0
  13. package/src/auth/UnAuth.js +14 -0
  14. package/src/auth/UnAuthRoute.d.ts +8 -0
  15. package/src/auth/UnAuthRoute.d.ts.map +1 -0
  16. package/src/auth/UnAuthRoute.js +22 -0
  17. package/src/auth/{index.ts → index.d.ts} +3 -2
  18. package/src/auth/index.d.ts.map +1 -0
  19. package/src/auth/index.js +12 -0
  20. package/src/components/ApiAccess.d.ts +16 -0
  21. package/src/components/ApiAccess.d.ts.map +1 -0
  22. package/src/components/ApiAccess.js +77 -0
  23. package/src/components/BackupCodeLoginForm.d.ts +43 -0
  24. package/src/components/BackupCodeLoginForm.d.ts.map +1 -0
  25. package/src/components/BackupCodeLoginForm.js +139 -0
  26. package/src/components/BackupCodesForm.d.ts +26 -0
  27. package/src/components/BackupCodesForm.d.ts.map +1 -0
  28. package/src/components/BackupCodesForm.js +120 -0
  29. package/src/components/CategoryMenu.d.ts +17 -0
  30. package/src/components/CategoryMenu.d.ts.map +1 -0
  31. package/src/components/CategoryMenu.js +65 -0
  32. package/src/components/ChangePasswordForm.d.ts +26 -0
  33. package/src/components/ChangePasswordForm.d.ts.map +1 -0
  34. package/src/components/ChangePasswordForm.js +78 -0
  35. package/src/components/ConfirmationDialog.d.ts +13 -0
  36. package/src/components/ConfirmationDialog.d.ts.map +1 -0
  37. package/src/components/ConfirmationDialog.js +10 -0
  38. package/src/components/CurrencyCodeSelector.d.ts +9 -0
  39. package/src/components/CurrencyCodeSelector.d.ts.map +1 -0
  40. package/src/components/CurrencyCodeSelector.js +31 -0
  41. package/src/components/CurrencyInput.d.ts +13 -0
  42. package/src/components/CurrencyInput.d.ts.map +1 -0
  43. package/src/components/CurrencyInput.js +22 -0
  44. package/src/components/DashboardPage.d.ts +8 -0
  45. package/src/components/DashboardPage.d.ts.map +1 -0
  46. package/src/components/DashboardPage.js +10 -0
  47. package/src/components/DropdownMenu.d.ts +13 -0
  48. package/src/components/DropdownMenu.d.ts.map +1 -0
  49. package/src/components/DropdownMenu.js +63 -0
  50. package/src/components/ExpirationSecondsSelector.d.ts +13 -0
  51. package/src/components/ExpirationSecondsSelector.d.ts.map +1 -0
  52. package/src/components/ExpirationSecondsSelector.js +32 -0
  53. package/src/components/FakeEmailAdminPanel.d.ts +23 -0
  54. package/src/components/FakeEmailAdminPanel.d.ts.map +1 -0
  55. package/src/components/FakeEmailAdminPanel.js +147 -0
  56. package/src/components/Flag.d.ts +20 -0
  57. package/src/components/Flag.d.ts.map +1 -0
  58. package/src/components/Flag.js +43 -0
  59. package/src/components/ForgotPasswordForm.d.ts +18 -0
  60. package/src/components/ForgotPasswordForm.d.ts.map +1 -0
  61. package/src/components/ForgotPasswordForm.js +61 -0
  62. package/src/components/LoginForm.d.ts +44 -0
  63. package/src/components/LoginForm.d.ts.map +1 -0
  64. package/src/components/LoginForm.js +123 -0
  65. package/src/components/LogoutPage.d.ts +8 -0
  66. package/src/components/LogoutPage.d.ts.map +1 -0
  67. package/src/components/LogoutPage.js +16 -0
  68. package/src/components/RegisterForm.d.ts +100 -0
  69. package/src/components/RegisterForm.d.ts.map +1 -0
  70. package/src/components/RegisterForm.js +306 -0
  71. package/src/components/ResetPasswordForm.d.ts +23 -0
  72. package/src/components/ResetPasswordForm.d.ts.map +1 -0
  73. package/src/components/ResetPasswordForm.js +78 -0
  74. package/src/components/SideMenu.d.ts +8 -0
  75. package/src/components/SideMenu.d.ts.map +1 -0
  76. package/src/components/SideMenu.js +25 -0
  77. package/src/components/SideMenuListItem.d.ts +13 -0
  78. package/src/components/SideMenuListItem.d.ts.map +1 -0
  79. package/src/components/SideMenuListItem.js +44 -0
  80. package/src/components/T.d.ts +7 -0
  81. package/src/components/T.d.ts.map +1 -0
  82. package/src/components/T.js +13 -0
  83. package/src/components/TDiv.d.ts +9 -0
  84. package/src/components/TDiv.d.ts.map +1 -0
  85. package/src/components/TDiv.js +14 -0
  86. package/src/components/TImgAlt.d.ts +10 -0
  87. package/src/components/TImgAlt.d.ts.map +1 -0
  88. package/src/components/TImgAlt.js +14 -0
  89. package/src/components/TopMenu.d.ts +50 -0
  90. package/src/components/TopMenu.d.ts.map +1 -0
  91. package/src/components/TopMenu.js +79 -0
  92. package/src/components/TotpSetupForm.d.ts +24 -0
  93. package/src/components/TotpSetupForm.d.ts.map +1 -0
  94. package/src/components/TotpSetupForm.js +82 -0
  95. package/src/components/TotpVerificationForm.d.ts +23 -0
  96. package/src/components/TotpVerificationForm.d.ts.map +1 -0
  97. package/src/components/TotpVerificationForm.js +66 -0
  98. package/src/components/TranslatedTitle.d.ts +8 -0
  99. package/src/components/TranslatedTitle.d.ts.map +1 -0
  100. package/src/components/TranslatedTitle.js +15 -0
  101. package/src/components/UserLanguageSelector.d.ts +4 -0
  102. package/src/components/UserLanguageSelector.d.ts.map +1 -0
  103. package/src/components/UserLanguageSelector.js +31 -0
  104. package/src/components/UserMenu.d.ts +4 -0
  105. package/src/components/UserMenu.d.ts.map +1 -0
  106. package/src/components/UserMenu.js +12 -0
  107. package/src/components/UserSettingsForm.d.ts +113 -0
  108. package/src/components/UserSettingsForm.d.ts.map +1 -0
  109. package/src/components/UserSettingsForm.js +269 -0
  110. package/src/components/VerifyEmailPage.d.ts +24 -0
  111. package/src/components/VerifyEmailPage.d.ts.map +1 -0
  112. package/src/components/VerifyEmailPage.js +81 -0
  113. package/src/components/{index.ts → index.d.ts} +1 -1
  114. package/src/components/index.d.ts.map +1 -0
  115. package/src/components/index.js +35 -0
  116. package/src/contexts/AuthProvider.d.ts +186 -0
  117. package/src/contexts/AuthProvider.d.ts.map +1 -0
  118. package/src/contexts/AuthProvider.js +515 -0
  119. package/src/contexts/I18nProvider.d.ts +27 -0
  120. package/src/contexts/I18nProvider.d.ts.map +1 -0
  121. package/src/contexts/I18nProvider.js +60 -0
  122. package/src/contexts/MenuContext.d.ts +28 -0
  123. package/src/contexts/MenuContext.d.ts.map +1 -0
  124. package/src/contexts/MenuContext.js +292 -0
  125. package/src/contexts/SuiteConfigProvider.d.ts +44 -0
  126. package/src/contexts/SuiteConfigProvider.d.ts.map +1 -0
  127. package/src/contexts/SuiteConfigProvider.js +43 -0
  128. package/src/contexts/ThemeProvider.d.ts +15 -0
  129. package/src/contexts/ThemeProvider.d.ts.map +1 -0
  130. package/src/contexts/ThemeProvider.js +36 -0
  131. package/src/contexts/{index.ts → index.d.ts} +1 -0
  132. package/src/contexts/index.d.ts.map +1 -0
  133. package/src/contexts/index.js +8 -0
  134. package/src/hooks/{index.ts → index.d.ts} +1 -0
  135. package/src/hooks/index.d.ts.map +1 -0
  136. package/src/hooks/index.js +9 -0
  137. package/src/hooks/useAuthenticatedApi.d.ts +34 -0
  138. package/src/hooks/useAuthenticatedApi.d.ts.map +1 -0
  139. package/src/hooks/useAuthenticatedApi.js +46 -0
  140. package/src/hooks/useBackupCodes.d.ts +15 -0
  141. package/src/hooks/useBackupCodes.d.ts.map +1 -0
  142. package/src/hooks/useBackupCodes.js +74 -0
  143. package/src/hooks/useEmailVerification.d.ts +10 -0
  144. package/src/hooks/useEmailVerification.d.ts.map +1 -0
  145. package/src/hooks/useEmailVerification.js +40 -0
  146. package/src/hooks/useExpiringValue.d.ts +14 -0
  147. package/src/hooks/useExpiringValue.d.ts.map +1 -0
  148. package/src/hooks/useExpiringValue.js +53 -0
  149. package/src/hooks/useLocalStorage.d.ts +2 -0
  150. package/src/hooks/useLocalStorage.d.ts.map +1 -0
  151. package/src/hooks/useLocalStorage.js +15 -0
  152. package/src/hooks/useUserSettings.d.ts +48 -0
  153. package/src/hooks/useUserSettings.d.ts.map +1 -0
  154. package/src/hooks/useUserSettings.js +171 -0
  155. package/src/{index.ts → index.d.ts} +1 -1
  156. package/src/index.d.ts.map +1 -0
  157. package/src/index.js +12 -0
  158. package/src/interfaces/IAppConfig.d.ts +8 -0
  159. package/src/interfaces/IAppConfig.d.ts.map +1 -0
  160. package/src/interfaces/IAppConfig.js +2 -0
  161. package/src/interfaces/ICategoryConfig.d.ts +41 -0
  162. package/src/interfaces/ICategoryConfig.d.ts.map +1 -0
  163. package/src/interfaces/ICategoryConfig.js +2 -0
  164. package/src/interfaces/IMenuConfig.d.ts +28 -0
  165. package/src/interfaces/IMenuConfig.d.ts.map +1 -0
  166. package/src/interfaces/IMenuConfig.js +2 -0
  167. package/src/interfaces/IMenuOption.d.ts +82 -0
  168. package/src/interfaces/IMenuOption.d.ts.map +1 -0
  169. package/src/interfaces/IMenuOption.js +2 -0
  170. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  171. package/src/interfaces/index.d.ts.map +1 -0
  172. package/src/interfaces/index.js +7 -0
  173. package/src/services/__mocks__/authService.d.ts +21 -0
  174. package/src/services/__mocks__/authService.d.ts.map +1 -0
  175. package/src/services/__mocks__/authService.js +15 -0
  176. package/src/services/api.d.ts +3 -0
  177. package/src/services/api.d.ts.map +1 -0
  178. package/src/services/api.js +14 -0
  179. package/src/services/authService.d.ts +126 -0
  180. package/src/services/authService.d.ts.map +1 -0
  181. package/src/services/authService.js +471 -0
  182. package/src/services/authenticatedApi.d.ts +3 -0
  183. package/src/services/authenticatedApi.d.ts.map +1 -0
  184. package/src/services/authenticatedApi.js +18 -0
  185. package/src/services/index.d.ts +4 -0
  186. package/src/services/index.d.ts.map +1 -0
  187. package/src/services/index.js +6 -0
  188. package/src/types/MenuType.d.ts +11 -0
  189. package/src/types/MenuType.d.ts.map +1 -0
  190. package/src/types/MenuType.js +12 -0
  191. package/src/types/expirationSeconds.d.ts +3 -0
  192. package/src/types/expirationSeconds.d.ts.map +1 -0
  193. package/src/types/expirationSeconds.js +17 -0
  194. package/src/types/index.d.ts +2 -0
  195. package/src/types/index.d.ts.map +1 -0
  196. package/src/types/index.js +4 -0
  197. package/src/types/translation.d.ts +10 -0
  198. package/src/types/translation.d.ts.map +1 -0
  199. package/src/types/translation.js +9 -0
  200. package/src/wrappers/BackupCodeLoginWrapper.d.ts +8 -0
  201. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +1 -0
  202. package/src/wrappers/BackupCodeLoginWrapper.js +20 -0
  203. package/src/wrappers/BackupCodesWrapper.d.ts +7 -0
  204. package/src/wrappers/BackupCodesWrapper.d.ts.map +1 -0
  205. package/src/wrappers/BackupCodesWrapper.js +17 -0
  206. package/src/wrappers/ChangePasswordFormWrapper.d.ts +8 -0
  207. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +1 -0
  208. package/src/wrappers/ChangePasswordFormWrapper.js +21 -0
  209. package/src/wrappers/ForgotPasswordFormWrapper.d.ts +8 -0
  210. package/src/wrappers/ForgotPasswordFormWrapper.d.ts.map +1 -0
  211. package/src/wrappers/ForgotPasswordFormWrapper.js +29 -0
  212. package/src/wrappers/LoginFormWrapper.d.ts +21 -0
  213. package/src/wrappers/LoginFormWrapper.d.ts.map +1 -0
  214. package/src/wrappers/LoginFormWrapper.js +72 -0
  215. package/src/wrappers/LogoutPageWrapper.d.ts +9 -0
  216. package/src/wrappers/LogoutPageWrapper.d.ts.map +1 -0
  217. package/src/wrappers/LogoutPageWrapper.js +21 -0
  218. package/src/wrappers/RegisterFormWrapper.d.ts +20 -0
  219. package/src/wrappers/RegisterFormWrapper.d.ts.map +1 -0
  220. package/src/wrappers/RegisterFormWrapper.js +51 -0
  221. package/src/wrappers/ResetPasswordFormWrapper.d.ts +9 -0
  222. package/src/wrappers/ResetPasswordFormWrapper.d.ts.map +1 -0
  223. package/src/wrappers/ResetPasswordFormWrapper.js +34 -0
  224. package/src/wrappers/UserSettingsFormWrapper.d.ts +29 -0
  225. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +1 -0
  226. package/src/wrappers/UserSettingsFormWrapper.js +95 -0
  227. package/src/wrappers/VerifyEmailPageWrapper.d.ts +8 -0
  228. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +1 -0
  229. package/src/wrappers/VerifyEmailPageWrapper.js +21 -0
  230. package/src/wrappers/{index.tsx → index.d.ts} +1 -10
  231. package/src/wrappers/index.d.ts.map +1 -0
  232. package/src/wrappers/index.js +24 -0
  233. package/LICENSE +0 -21
  234. package/src/auth/AdminRoute.tsx +0 -54
  235. package/src/auth/Private.tsx +0 -17
  236. package/src/auth/PrivateRoute.tsx +0 -28
  237. package/src/auth/UnAuth.tsx +0 -16
  238. package/src/auth/UnAuthRoute.tsx +0 -30
  239. package/src/components/ApiAccess.tsx +0 -175
  240. package/src/components/BackupCodeLoginForm.tsx +0 -489
  241. package/src/components/BackupCodesForm.tsx +0 -287
  242. package/src/components/CategoryMenu.tsx +0 -155
  243. package/src/components/ChangePasswordForm.tsx +0 -273
  244. package/src/components/ConfirmationDialog.tsx +0 -48
  245. package/src/components/CurrencyCodeSelector.tsx +0 -60
  246. package/src/components/CurrencyInput.tsx +0 -80
  247. package/src/components/DashboardPage.tsx +0 -24
  248. package/src/components/DropdownMenu.tsx +0 -105
  249. package/src/components/ExpirationSecondsSelector.tsx +0 -60
  250. package/src/components/FakeEmailAdminPanel.tsx +0 -374
  251. package/src/components/Flag.tsx +0 -52
  252. package/src/components/ForgotPasswordForm.tsx +0 -174
  253. package/src/components/LoginForm.tsx +0 -468
  254. package/src/components/LogoutPage.tsx +0 -21
  255. package/src/components/RegisterForm.tsx +0 -1169
  256. package/src/components/ResetPasswordForm.tsx +0 -247
  257. package/src/components/SideMenu.tsx +0 -46
  258. package/src/components/SideMenuListItem.tsx +0 -75
  259. package/src/components/T.tsx +0 -24
  260. package/src/components/TDiv.tsx +0 -26
  261. package/src/components/TImgAlt.tsx +0 -28
  262. package/src/components/TopMenu.tsx +0 -252
  263. package/src/components/TotpSetupForm.tsx +0 -188
  264. package/src/components/TotpVerificationForm.tsx +0 -148
  265. package/src/components/TranslatedTitle.tsx +0 -31
  266. package/src/components/UserLanguageSelector.tsx +0 -45
  267. package/src/components/UserMenu.tsx +0 -15
  268. package/src/components/UserSettingsForm.tsx +0 -904
  269. package/src/components/VerifyEmailPage.tsx +0 -222
  270. package/src/components/__tests__/RegisterForm.totp.spec.tsx +0 -377
  271. package/src/components/__tests__/TotpSetupForm.spec.tsx +0 -258
  272. package/src/components/__tests__/TotpVerificationForm.spec.tsx +0 -259
  273. package/src/components/__tests__/UserSettingsForm.totp.spec.tsx +0 -396
  274. package/src/contexts/AuthProvider.spec.tsx +0 -1284
  275. package/src/contexts/AuthProvider.tsx +0 -977
  276. package/src/contexts/I18nProvider.tsx +0 -164
  277. package/src/contexts/MenuContext.tsx +0 -426
  278. package/src/contexts/SuiteConfigProvider.tsx +0 -93
  279. package/src/contexts/ThemeProvider.tsx +0 -67
  280. package/src/hooks/useAuthenticatedApi.tsx +0 -67
  281. package/src/hooks/useBackupCodes.ts +0 -105
  282. package/src/hooks/useEmailVerification.ts +0 -54
  283. package/src/hooks/useExpiringValue.ts +0 -78
  284. package/src/hooks/useLocalStorage.ts +0 -18
  285. package/src/hooks/useUserSettings.ts +0 -271
  286. package/src/interfaces/IAppConfig.ts +0 -7
  287. package/src/interfaces/ICategoryConfig.ts +0 -41
  288. package/src/interfaces/IMenuConfig.ts +0 -28
  289. package/src/interfaces/IMenuOption.ts +0 -79
  290. package/src/services/__mocks__/authService.ts +0 -14
  291. package/src/services/__tests__/authService.totp.property.spec.ts +0 -360
  292. package/src/services/__tests__/authService.totp.spec.ts +0 -439
  293. package/src/services/api.ts +0 -13
  294. package/src/services/authService.ts +0 -692
  295. package/src/services/authenticatedApi.ts +0 -17
  296. package/src/services/index.ts +0 -3
  297. package/src/types/MenuType.ts +0 -15
  298. package/src/types/expirationSeconds.ts +0 -18
  299. package/src/types/index.ts +0 -1
  300. package/src/types/translation.ts +0 -20
  301. package/src/wrappers/BackupCodeLoginWrapper.tsx +0 -34
  302. package/src/wrappers/BackupCodesWrapper.tsx +0 -28
  303. package/src/wrappers/ChangePasswordFormWrapper.tsx +0 -34
  304. package/src/wrappers/ForgotPasswordFormWrapper.tsx +0 -45
  305. package/src/wrappers/LoginFormWrapper.tsx +0 -108
  306. package/src/wrappers/LogoutPageWrapper.tsx +0 -30
  307. package/src/wrappers/RegisterFormWrapper.tsx +0 -109
  308. package/src/wrappers/ResetPasswordFormWrapper.tsx +0 -57
  309. package/src/wrappers/UserSettingsFormWrapper.tsx +0 -140
  310. package/src/wrappers/VerifyEmailPageWrapper.tsx +0 -27
  311. package/src/wrappers/__tests__/LoginFormWrapper.totp.spec.tsx +0 -339
@@ -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,34 +0,0 @@
1
- import { FC } from 'react';
2
- import { useNavigate } from 'react-router';
3
- import { BackupCodeLoginForm } from '../components/BackupCodeLoginForm';
4
- import { useAuth } 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
-
18
- const handleSubmit: typeof backupCodeLogin = async (...args) => {
19
- const result = await backupCodeLogin(...args);
20
- if ('token' in result && onSuccess) {
21
- onSuccess();
22
- }
23
- return result;
24
- };
25
-
26
- return (
27
- <BackupCodeLoginForm
28
- onSubmit={handleSubmit}
29
- onNavigate={navigate}
30
- isAuthenticated={isAuthenticated}
31
- {...componentProps}
32
- />
33
- );
34
- };
@@ -1,28 +0,0 @@
1
- import { FC } from 'react';
2
- import { useLocation } from 'react-router';
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,34 +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: {
17
- currentPassword: string;
18
- newPassword: string;
19
- }) => {
20
- const result = await changePassword(
21
- values.currentPassword,
22
- values.newPassword
23
- );
24
- if ('error' in result) {
25
- return { error: result.error };
26
- }
27
- if (onSuccess) {
28
- onSuccess();
29
- }
30
- return result;
31
- };
32
-
33
- return <ChangePasswordForm onSubmit={handleSubmit} {...componentProps} />;
34
- };
@@ -1,45 +0,0 @@
1
- import { FC } from 'react';
2
- import {
3
- SuiteCoreStringKey,
4
- TranslatableSuiteError,
5
- } from '@digitaldefiance/suite-core-lib';
6
- import {
7
- ForgotPasswordForm,
8
- ForgotPasswordFormProps,
9
- ForgotPasswordFormValues,
10
- } from '../components/ForgotPasswordForm';
11
- import { useSuiteConfig } from '../contexts';
12
-
13
- export interface ForgotPasswordFormWrapperProps {
14
- onSuccess?: () => void;
15
- componentProps?: Partial<Omit<ForgotPasswordFormProps, 'onSubmit'>>;
16
- }
17
-
18
- export const ForgotPasswordFormWrapper: FC<ForgotPasswordFormWrapperProps> = ({
19
- onSuccess,
20
- componentProps = {},
21
- }) => {
22
- const { baseUrl } = useSuiteConfig();
23
-
24
- const handleSubmit = async (values: ForgotPasswordFormValues) => {
25
- const res = await fetch(`${baseUrl}/user/forgot-password`, {
26
- method: 'POST',
27
- headers: { 'Content-Type': 'application/json' },
28
- body: JSON.stringify({ email: values.email }),
29
- });
30
- if (!res.ok) {
31
- const body: { message?: string } = await res.json().catch(() => ({})) as { message?: string };
32
- if (body.message) {
33
- throw new Error(body.message);
34
- }
35
- throw new TranslatableSuiteError(
36
- SuiteCoreStringKey.ForgotPassword_Error,
37
- );
38
- }
39
- if (onSuccess) {
40
- onSuccess();
41
- }
42
- };
43
-
44
- return <ForgotPasswordForm onSubmit={handleSubmit} {...componentProps} />;
45
- };
@@ -1,108 +0,0 @@
1
- import { FC, useState } from 'react';
2
- import { useNavigate } from 'react-router';
3
- import { SecureString, EmailString } from '@digitaldefiance/ecies-lib';
4
- import { IRequestUserDTO, SuiteCoreStringKey, TranslatableSuiteError } from '@digitaldefiance/suite-core-lib';
5
- import { LoginForm, LoginFormValues, LoginFormProps } from '../components/LoginForm';
6
- import { TotpVerificationForm } from '../components/TotpVerificationForm';
7
- import { useAuth, useSuiteConfig } from '../contexts';
8
-
9
- export interface LoginFormWrapperProps {
10
- onSuccess?: () => void;
11
- redirectTo?: string;
12
- componentProps?: Partial<Omit<LoginFormProps, 'onSubmit'>>;
13
- /**
14
- * Called when the user submits a TOTP verification code during login.
15
- * Typically wired to `AuthService.verifyTotpLogin(pendingTotpToken, code)`.
16
- * When not provided, the wrapper cannot complete TOTP-protected logins.
17
- */
18
- onVerifyTotp?: (
19
- code: string,
20
- pendingTotpToken: string,
21
- ) => Promise<{ token: string; user: IRequestUserDTO } | { error: string }>;
22
- }
23
-
24
- export const LoginFormWrapper: FC<LoginFormWrapperProps> = ({
25
- onSuccess,
26
- redirectTo,
27
- componentProps = {},
28
- onVerifyTotp,
29
- }) => {
30
- const { directLogin, passwordLogin, verifyTotpLogin, setUser } = useAuth();
31
- const navigate = useNavigate();
32
- const { routes } = useSuiteConfig();
33
- const [pendingTotpToken, setPendingTotpToken] = useState<string | null>(null);
34
-
35
- const handleLoginSuccess = () => {
36
- if (onSuccess) {
37
- onSuccess();
38
- }
39
- navigate(redirectTo || routes.dashboard || '/dashboard');
40
- };
41
-
42
- const handleSubmit = async (values: LoginFormValues) => {
43
- const email = values.email && values.email.trim().length > 0 ? new EmailString(values.email) : undefined;
44
- const username = values.username && values.username.trim() ? values.username : undefined;
45
-
46
- if (values.password) {
47
- const result = await passwordLogin(
48
- new SecureString(values.password),
49
- username,
50
- email
51
- );
52
- if ('error' in result) {
53
- throw new Error(result.error);
54
- }
55
- if ('pendingTotpToken' in result) {
56
- setPendingTotpToken(result.pendingTotpToken);
57
- return;
58
- }
59
- handleLoginSuccess();
60
- } else if (values.mnemonic) {
61
- const result = await directLogin(
62
- new SecureString(values.mnemonic),
63
- username,
64
- email
65
- );
66
- if ('error' in result) {
67
- throw new Error(result.error);
68
- }
69
- if ('pendingTotpToken' in result) {
70
- setPendingTotpToken(result.pendingTotpToken);
71
- return;
72
- }
73
- handleLoginSuccess();
74
- } else {
75
- throw new TranslatableSuiteError(SuiteCoreStringKey.Error_NoPasswordOrMnemonicProvided);
76
- }
77
- };
78
-
79
- const handleTotpSubmit = async (
80
- code: string,
81
- token: string,
82
- ): Promise<{ token: string; user: IRequestUserDTO } | { error: string }> => {
83
- // Use the explicitly provided callback, or fall back to verifyTotpLogin from AuthContext
84
- const verifyFn = onVerifyTotp ?? ((c: string, t: string) => verifyTotpLogin(t, c));
85
- const result = await verifyFn(code, token);
86
- if ('error' in result) {
87
- return result;
88
- }
89
- // Store the full JWT and complete the login flow
90
- localStorage.setItem('authToken', result.token);
91
- localStorage.setItem('user', JSON.stringify(result.user));
92
- // Update auth context so PrivateRoute guards see the user as authenticated
93
- await setUser(result.user);
94
- handleLoginSuccess();
95
- return result;
96
- };
97
-
98
- if (pendingTotpToken) {
99
- return (
100
- <TotpVerificationForm
101
- pendingTotpToken={pendingTotpToken}
102
- onSubmit={handleTotpSubmit}
103
- />
104
- );
105
- }
106
-
107
- return <LoginForm onSubmit={handleSubmit} {...componentProps} />;
108
- };
@@ -1,30 +0,0 @@
1
- import { FC } from 'react';
2
- import { useNavigate } from 'react-router';
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
- };
@@ -1,109 +0,0 @@
1
- import { SecureString } from '@digitaldefiance/ecies-lib';
2
- import { FC } from 'react';
3
- import {
4
- RegisterForm,
5
- RegisterFormProps,
6
- RegisterFormValues,
7
- } from '../components/RegisterForm';
8
- import { useAuth, useSuiteConfig } from '../contexts';
9
-
10
- export interface RegisterFormWrapperProps {
11
- onSuccess?: () => void;
12
- /**
13
- * When true, offer the TOTP setup step after successful registration.
14
- * Typically sourced from window.APP_CONFIG.totpAvailable.
15
- * Defaults to false.
16
- *
17
- * NOTE: This requires the registration endpoint to return a session token
18
- * so the user is authenticated when the TOTP setup call is made. If
19
- * registration does not issue a token (the default in this suite), leave
20
- * this false and direct users to enable TOTP from their settings page
21
- * after logging in.
22
- */
23
- enableTotpSetup?: boolean;
24
- componentProps?: Partial<
25
- Omit<RegisterFormProps, 'onSubmit' | 'timezones' | 'getInitialTimezone'>
26
- >;
27
- }
28
-
29
- export const RegisterFormWrapper: FC<RegisterFormWrapperProps> = ({
30
- onSuccess,
31
- enableTotpSetup = false,
32
- componentProps = {},
33
- }) => {
34
- const { register, setUpBrowserPasswordLogin, setupTotp, confirmTotp } =
35
- useAuth();
36
- const { timezones } = useSuiteConfig();
37
-
38
- const handleSubmit = async (
39
- values: RegisterFormValues,
40
- usePassword: boolean
41
- ) => {
42
- const result = await register(
43
- values.username,
44
- values.email,
45
- values.timezone || 'UTC',
46
- values.password,
47
- values.mnemonic,
48
- values.displayName,
49
- values.directChallenge
50
- );
51
- if ('error' in result) {
52
- return result;
53
- }
54
-
55
- // After successful registration with a password, set up the browser-side
56
- // password login bundle (encrypts mnemonic with password and stores in localStorage).
57
- // This is required for subsequent password-based logins to work.
58
- if (usePassword && values.password && result.mnemonic) {
59
- const setupResult = await setUpBrowserPasswordLogin(
60
- new SecureString(result.mnemonic),
61
- new SecureString(values.password)
62
- );
63
- if ('error' in setupResult) {
64
- // Password login setup failed — still return success for registration
65
- // but log the issue. The user can set up password login later.
66
- console.warn(
67
- 'Registration succeeded but browser password login setup failed:',
68
- setupResult.error
69
- );
70
- }
71
- }
72
-
73
- if (onSuccess) {
74
- onSuccess();
75
- }
76
- // Don't navigate away — let RegisterForm show the success message
77
- // (mnemonic grid or email verification notice). The user navigates
78
- // manually via the "Proceed to login" / "I Have Saved My Recovery
79
- // Phrase" button.
80
- return result;
81
- };
82
-
83
- const defaultTimezones = timezones || [
84
- 'UTC',
85
- 'America/New_York',
86
- 'America/Los_Angeles',
87
- 'Europe/London',
88
- ];
89
-
90
- const totpProps = enableTotpSetup
91
- ? {
92
- enableTotpSetup: true,
93
- onTotpSetup: setupTotp,
94
- onTotpConfirm: confirmTotp,
95
- }
96
- : {};
97
-
98
- return (
99
- <RegisterForm
100
- onSubmit={handleSubmit}
101
- timezones={defaultTimezones}
102
- getInitialTimezone={() =>
103
- Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC'
104
- }
105
- {...totpProps}
106
- {...componentProps}
107
- />
108
- );
109
- };
@@ -1,57 +0,0 @@
1
- import { FC } from 'react';
2
- import { useNavigate, useSearchParams } from 'react-router';
3
- import {
4
- SuiteCoreStringKey,
5
- TranslatableSuiteError,
6
- } from '@digitaldefiance/suite-core-lib';
7
- import {
8
- ResetPasswordForm,
9
- ResetPasswordFormProps,
10
- } from '../components/ResetPasswordForm';
11
- import { useSuiteConfig } from '../contexts';
12
-
13
- export interface ResetPasswordFormWrapperProps {
14
- onSuccess?: () => void;
15
- redirectTo?: string;
16
- componentProps?: Partial<Omit<ResetPasswordFormProps, 'onSubmit' | 'token'>>;
17
- }
18
-
19
- export const ResetPasswordFormWrapper: FC<ResetPasswordFormWrapperProps> = ({
20
- onSuccess,
21
- redirectTo,
22
- componentProps = {},
23
- }) => {
24
- const { baseUrl, routes } = useSuiteConfig();
25
- const navigate = useNavigate();
26
- const [searchParams] = useSearchParams();
27
- const token = searchParams.get('token');
28
-
29
- const handleSubmit = async (resetToken: string, password: string) => {
30
- const res = await fetch(`${baseUrl}/user/reset-password`, {
31
- method: 'POST',
32
- headers: { 'Content-Type': 'application/json' },
33
- body: JSON.stringify({ token: resetToken, password }),
34
- });
35
- if (!res.ok) {
36
- const body: { message?: string } = await res.json().catch(() => ({})) as { message?: string };
37
- if (body.message) {
38
- throw new Error(body.message);
39
- }
40
- throw new TranslatableSuiteError(
41
- SuiteCoreStringKey.Error_PasswordChange,
42
- );
43
- }
44
- if (onSuccess) {
45
- onSuccess();
46
- }
47
- navigate(redirectTo || routes.login || '/login');
48
- };
49
-
50
- return (
51
- <ResetPasswordForm
52
- token={token}
53
- onSubmit={handleSubmit}
54
- {...componentProps}
55
- />
56
- );
57
- };
@@ -1,140 +0,0 @@
1
- import { FC, useCallback, useEffect, useMemo, useState } from 'react';
2
- import { UserSettingsForm, UserSettingsFormValues, UserSettingsFormProps } from '../components/UserSettingsForm';
3
- import { useSuiteConfig } from '../contexts';
4
- import { useUserSettingsPublic } from '../hooks';
5
- import { getSuiteCoreTranslation, IConstants, SuiteCoreStringKey } from '@digitaldefiance/suite-core-lib';
6
- import { createAuthService } from '../services/authService';
7
- import { createAuthenticatedApiClient } from '../services/authenticatedApi';
8
- import { IECIESConfig } from '@digitaldefiance/ecies-lib';
9
-
10
- export interface UserSettingsFormWrapperProps {
11
- onSuccess?: () => void;
12
- /**
13
- * Constants for AuthService (required for TOTP methods).
14
- * If not provided, TOTP callbacks will not be wired up.
15
- */
16
- constants?: IConstants;
17
- /**
18
- * ECIES config for AuthService (required for TOTP methods).
19
- * If not provided, TOTP callbacks will not be wired up.
20
- */
21
- eciesConfig?: IECIESConfig;
22
- /**
23
- * Email domain for AuthService (required for TOTP methods).
24
- */
25
- emailDomain?: string;
26
- /**
27
- * When false (default), TOTP management controls are not shown.
28
- * Set to true when TOTP_AVAILABLE is enabled in the server environment.
29
- */
30
- totpAvailable?: boolean;
31
- componentProps?: Partial<Omit<UserSettingsFormProps, 'initialValues' | 'onSubmit' | 'languages'>>;
32
- }
33
-
34
- export const UserSettingsFormWrapper: FC<UserSettingsFormWrapperProps> = ({
35
- onSuccess,
36
- constants,
37
- eciesConfig,
38
- emailDomain = '',
39
- totpAvailable = false,
40
- componentProps = {},
41
- }) => {
42
- const { settings, updateSettings } = useUserSettingsPublic();
43
- const { languages, baseUrl } = useSuiteConfig();
44
-
45
- // Fetch totpEnabled from the settings API
46
- const [totpEnabled, setTotpEnabled] = useState<boolean | undefined>(undefined);
47
-
48
- const authenticatedApi = useMemo(
49
- () => createAuthenticatedApiClient(baseUrl),
50
- [baseUrl],
51
- );
52
-
53
- const authService = useMemo(() => {
54
- if (!constants || !eciesConfig) return null;
55
- return createAuthService(constants, baseUrl, eciesConfig, emailDomain);
56
- }, [constants, eciesConfig, baseUrl, emailDomain]);
57
-
58
- // Fetch totpEnabled from GET /user/settings.
59
- // We gate on totpAvailable (no point fetching if TOTP isn't enabled on this
60
- // deployment) but NOT on isAuthenticated — isAuthenticated can be false
61
- // transiently (e.g. verify 403 on page refresh with a stale token) even
62
- // when the user has a valid session token in localStorage. The
63
- // authenticatedApi interceptor attaches the token automatically; if the
64
- // call fails we leave totpEnabled undefined so no TOTP controls are shown.
65
- useEffect(() => {
66
- if (!totpAvailable) return;
67
- authenticatedApi
68
- .get<{ settings: { totpEnabled?: boolean } }>('/user/settings')
69
- .then((res) => {
70
- setTotpEnabled(res.data?.settings?.totpEnabled ?? false);
71
- })
72
- .catch(() => {
73
- // If the endpoint fails, leave totpEnabled undefined (no TOTP controls shown)
74
- });
75
- }, [totpAvailable, authenticatedApi]);
76
-
77
- const handleSubmit = async (values: UserSettingsFormValues) => {
78
- const result = await updateSettings(values);
79
- if ('success' in result && result.success && onSuccess) {
80
- onSuccess();
81
- }
82
- return result;
83
- };
84
-
85
- // TOTP callbacks — only wired when authService is available
86
- const handleTotpSetup = useCallback(async () => {
87
- if (!authService) return { error: 'AuthService not configured' };
88
- return authService.setupTotp();
89
- }, [authService]);
90
-
91
- const handleTotpConfirm = useCallback(async (code: string) => {
92
- if (!authService) return { error: 'AuthService not configured' };
93
- const result = await authService.confirmTotp(code);
94
- if ('success' in result && result.success) {
95
- setTotpEnabled(true);
96
- }
97
- return result;
98
- }, [authService]);
99
-
100
- const handleTotpDisable = useCallback(async (code: string) => {
101
- if (!authService) return { error: 'AuthService not configured' };
102
- const result = await authService.disableTotp(code);
103
- if ('success' in result && result.success) {
104
- setTotpEnabled(false);
105
- }
106
- return result;
107
- }, [authService]);
108
-
109
- const handleTotpReset = useCallback(async (code: string) => {
110
- if (!authService) return { error: 'AuthService not configured' };
111
- return authService.resetTotp(code);
112
- }, [authService]);
113
-
114
- // Only show loading on initial load, not during updates
115
- // Once we have settings, keep showing the form even during updates
116
- if (!settings) {
117
- return <div>{getSuiteCoreTranslation(SuiteCoreStringKey.Common_Loading)}...</div>;
118
- }
119
-
120
- // Only pass TOTP props when totpAvailable is true, authService is available, and totpEnabled has been fetched
121
- const totpProps = totpAvailable && authService && totpEnabled !== undefined
122
- ? {
123
- totpEnabled,
124
- onTotpSetup: handleTotpSetup,
125
- onTotpConfirm: handleTotpConfirm,
126
- onTotpDisable: handleTotpDisable,
127
- onTotpReset: handleTotpReset,
128
- }
129
- : {};
130
-
131
- return (
132
- <UserSettingsForm
133
- initialValues={settings}
134
- onSubmit={handleSubmit}
135
- languages={languages}
136
- {...totpProps}
137
- {...componentProps}
138
- />
139
- );
140
- };
@@ -1,27 +0,0 @@
1
- import { FC, useCallback } from 'react';
2
- import { VerifyEmailPage } from '../components/VerifyEmailPage';
3
- import { useEmailVerification } from '../hooks';
4
-
5
- export interface VerifyEmailPageWrapperProps {
6
- onSuccess?: () => void;
7
- componentProps?: Partial<React.ComponentProps<typeof VerifyEmailPage>>;
8
- }
9
-
10
- export const VerifyEmailPageWrapper: FC<VerifyEmailPageWrapperProps> = ({
11
- onSuccess,
12
- componentProps = {},
13
- }) => {
14
- const searchParams = new URLSearchParams(window.location.search);
15
- const token = searchParams.get('token');
16
- const { verifyEmail } = useEmailVerification();
17
-
18
- const handleVerify = useCallback(async (verificationToken: string) => {
19
- const result = await verifyEmail(verificationToken);
20
- if (result.success && onSuccess) {
21
- onSuccess();
22
- }
23
- return result;
24
- }, [verifyEmail, onSuccess]);
25
-
26
- return <VerifyEmailPage token={token} onVerify={handleVerify} {...componentProps} />;
27
- };