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

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 (314) 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 +19 -0
  117. package/src/contexts/AuthProvider.d.ts.map +1 -0
  118. package/src/contexts/AuthProvider.js +514 -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 +307 -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/auth-context.d.ts +172 -0
  132. package/src/contexts/auth-context.d.ts.map +1 -0
  133. package/src/contexts/auth-context.js +13 -0
  134. package/src/contexts/{index.ts → index.d.ts} +1 -0
  135. package/src/contexts/index.d.ts.map +1 -0
  136. package/src/contexts/index.js +8 -0
  137. package/src/hooks/{index.ts → index.d.ts} +1 -0
  138. package/src/hooks/index.d.ts.map +1 -0
  139. package/src/hooks/index.js +9 -0
  140. package/src/hooks/useAuthenticatedApi.d.ts +34 -0
  141. package/src/hooks/useAuthenticatedApi.d.ts.map +1 -0
  142. package/src/hooks/useAuthenticatedApi.js +46 -0
  143. package/src/hooks/useBackupCodes.d.ts +15 -0
  144. package/src/hooks/useBackupCodes.d.ts.map +1 -0
  145. package/src/hooks/useBackupCodes.js +74 -0
  146. package/src/hooks/useEmailVerification.d.ts +10 -0
  147. package/src/hooks/useEmailVerification.d.ts.map +1 -0
  148. package/src/hooks/useEmailVerification.js +40 -0
  149. package/src/hooks/useExpiringValue.d.ts +14 -0
  150. package/src/hooks/useExpiringValue.d.ts.map +1 -0
  151. package/src/hooks/useExpiringValue.js +53 -0
  152. package/src/hooks/useLocalStorage.d.ts +2 -0
  153. package/src/hooks/useLocalStorage.d.ts.map +1 -0
  154. package/src/hooks/useLocalStorage.js +15 -0
  155. package/src/hooks/useUserSettings.d.ts +48 -0
  156. package/src/hooks/useUserSettings.d.ts.map +1 -0
  157. package/src/hooks/useUserSettings.js +171 -0
  158. package/src/{index.ts → index.d.ts} +1 -1
  159. package/src/index.d.ts.map +1 -0
  160. package/src/index.js +12 -0
  161. package/src/interfaces/IAppConfig.d.ts +8 -0
  162. package/src/interfaces/IAppConfig.d.ts.map +1 -0
  163. package/src/interfaces/IAppConfig.js +2 -0
  164. package/src/interfaces/ICategoryConfig.d.ts +41 -0
  165. package/src/interfaces/ICategoryConfig.d.ts.map +1 -0
  166. package/src/interfaces/ICategoryConfig.js +2 -0
  167. package/src/interfaces/IMenuConfig.d.ts +28 -0
  168. package/src/interfaces/IMenuConfig.d.ts.map +1 -0
  169. package/src/interfaces/IMenuConfig.js +2 -0
  170. package/src/interfaces/IMenuOption.d.ts +82 -0
  171. package/src/interfaces/IMenuOption.d.ts.map +1 -0
  172. package/src/interfaces/IMenuOption.js +2 -0
  173. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  174. package/src/interfaces/index.d.ts.map +1 -0
  175. package/src/interfaces/index.js +7 -0
  176. package/src/services/__mocks__/authService.d.ts +21 -0
  177. package/src/services/__mocks__/authService.d.ts.map +1 -0
  178. package/src/services/__mocks__/authService.js +15 -0
  179. package/src/services/api.d.ts +3 -0
  180. package/src/services/api.d.ts.map +1 -0
  181. package/src/services/api.js +14 -0
  182. package/src/services/authService.d.ts +126 -0
  183. package/src/services/authService.d.ts.map +1 -0
  184. package/src/services/authService.js +471 -0
  185. package/src/services/authenticatedApi.d.ts +3 -0
  186. package/src/services/authenticatedApi.d.ts.map +1 -0
  187. package/src/services/authenticatedApi.js +18 -0
  188. package/src/services/index.d.ts +4 -0
  189. package/src/services/index.d.ts.map +1 -0
  190. package/src/services/index.js +6 -0
  191. package/src/types/MenuType.d.ts +11 -0
  192. package/src/types/MenuType.d.ts.map +1 -0
  193. package/src/types/MenuType.js +12 -0
  194. package/src/types/expirationSeconds.d.ts +3 -0
  195. package/src/types/expirationSeconds.d.ts.map +1 -0
  196. package/src/types/expirationSeconds.js +17 -0
  197. package/src/types/index.d.ts +2 -0
  198. package/src/types/index.d.ts.map +1 -0
  199. package/src/types/index.js +4 -0
  200. package/src/types/translation.d.ts +10 -0
  201. package/src/types/translation.d.ts.map +1 -0
  202. package/src/types/translation.js +9 -0
  203. package/src/wrappers/BackupCodeLoginWrapper.d.ts +8 -0
  204. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +1 -0
  205. package/src/wrappers/BackupCodeLoginWrapper.js +20 -0
  206. package/src/wrappers/BackupCodesWrapper.d.ts +7 -0
  207. package/src/wrappers/BackupCodesWrapper.d.ts.map +1 -0
  208. package/src/wrappers/BackupCodesWrapper.js +17 -0
  209. package/src/wrappers/ChangePasswordFormWrapper.d.ts +8 -0
  210. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +1 -0
  211. package/src/wrappers/ChangePasswordFormWrapper.js +21 -0
  212. package/src/wrappers/ForgotPasswordFormWrapper.d.ts +8 -0
  213. package/src/wrappers/ForgotPasswordFormWrapper.d.ts.map +1 -0
  214. package/src/wrappers/ForgotPasswordFormWrapper.js +29 -0
  215. package/src/wrappers/LoginFormWrapper.d.ts +21 -0
  216. package/src/wrappers/LoginFormWrapper.d.ts.map +1 -0
  217. package/src/wrappers/LoginFormWrapper.js +72 -0
  218. package/src/wrappers/LogoutPageWrapper.d.ts +9 -0
  219. package/src/wrappers/LogoutPageWrapper.d.ts.map +1 -0
  220. package/src/wrappers/LogoutPageWrapper.js +21 -0
  221. package/src/wrappers/RegisterFormWrapper.d.ts +20 -0
  222. package/src/wrappers/RegisterFormWrapper.d.ts.map +1 -0
  223. package/src/wrappers/RegisterFormWrapper.js +51 -0
  224. package/src/wrappers/ResetPasswordFormWrapper.d.ts +9 -0
  225. package/src/wrappers/ResetPasswordFormWrapper.d.ts.map +1 -0
  226. package/src/wrappers/ResetPasswordFormWrapper.js +34 -0
  227. package/src/wrappers/UserSettingsFormWrapper.d.ts +29 -0
  228. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +1 -0
  229. package/src/wrappers/UserSettingsFormWrapper.js +95 -0
  230. package/src/wrappers/VerifyEmailPageWrapper.d.ts +8 -0
  231. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +1 -0
  232. package/src/wrappers/VerifyEmailPageWrapper.js +21 -0
  233. package/src/wrappers/{index.tsx → index.d.ts} +1 -10
  234. package/src/wrappers/index.d.ts.map +1 -0
  235. package/src/wrappers/index.js +24 -0
  236. package/LICENSE +0 -21
  237. package/src/auth/AdminRoute.tsx +0 -54
  238. package/src/auth/Private.tsx +0 -17
  239. package/src/auth/PrivateRoute.tsx +0 -28
  240. package/src/auth/UnAuth.tsx +0 -16
  241. package/src/auth/UnAuthRoute.tsx +0 -30
  242. package/src/components/ApiAccess.tsx +0 -175
  243. package/src/components/BackupCodeLoginForm.tsx +0 -489
  244. package/src/components/BackupCodesForm.tsx +0 -287
  245. package/src/components/CategoryMenu.tsx +0 -155
  246. package/src/components/ChangePasswordForm.tsx +0 -273
  247. package/src/components/ConfirmationDialog.tsx +0 -48
  248. package/src/components/CurrencyCodeSelector.tsx +0 -60
  249. package/src/components/CurrencyInput.tsx +0 -80
  250. package/src/components/DashboardPage.tsx +0 -24
  251. package/src/components/DropdownMenu.tsx +0 -105
  252. package/src/components/ExpirationSecondsSelector.tsx +0 -60
  253. package/src/components/FakeEmailAdminPanel.tsx +0 -374
  254. package/src/components/Flag.tsx +0 -52
  255. package/src/components/ForgotPasswordForm.tsx +0 -174
  256. package/src/components/LoginForm.tsx +0 -468
  257. package/src/components/LogoutPage.tsx +0 -21
  258. package/src/components/RegisterForm.tsx +0 -1169
  259. package/src/components/ResetPasswordForm.tsx +0 -247
  260. package/src/components/SideMenu.tsx +0 -46
  261. package/src/components/SideMenuListItem.tsx +0 -75
  262. package/src/components/T.tsx +0 -24
  263. package/src/components/TDiv.tsx +0 -26
  264. package/src/components/TImgAlt.tsx +0 -28
  265. package/src/components/TopMenu.tsx +0 -252
  266. package/src/components/TotpSetupForm.tsx +0 -188
  267. package/src/components/TotpVerificationForm.tsx +0 -148
  268. package/src/components/TranslatedTitle.tsx +0 -31
  269. package/src/components/UserLanguageSelector.tsx +0 -45
  270. package/src/components/UserMenu.tsx +0 -15
  271. package/src/components/UserSettingsForm.tsx +0 -904
  272. package/src/components/VerifyEmailPage.tsx +0 -222
  273. package/src/components/__tests__/RegisterForm.totp.spec.tsx +0 -377
  274. package/src/components/__tests__/TotpSetupForm.spec.tsx +0 -258
  275. package/src/components/__tests__/TotpVerificationForm.spec.tsx +0 -259
  276. package/src/components/__tests__/UserSettingsForm.totp.spec.tsx +0 -396
  277. package/src/contexts/AuthProvider.spec.tsx +0 -1284
  278. package/src/contexts/AuthProvider.tsx +0 -977
  279. package/src/contexts/I18nProvider.tsx +0 -164
  280. package/src/contexts/MenuContext.tsx +0 -426
  281. package/src/contexts/SuiteConfigProvider.tsx +0 -93
  282. package/src/contexts/ThemeProvider.tsx +0 -67
  283. package/src/hooks/useAuthenticatedApi.tsx +0 -67
  284. package/src/hooks/useBackupCodes.ts +0 -105
  285. package/src/hooks/useEmailVerification.ts +0 -54
  286. package/src/hooks/useExpiringValue.ts +0 -78
  287. package/src/hooks/useLocalStorage.ts +0 -18
  288. package/src/hooks/useUserSettings.ts +0 -271
  289. package/src/interfaces/IAppConfig.ts +0 -7
  290. package/src/interfaces/ICategoryConfig.ts +0 -41
  291. package/src/interfaces/IMenuConfig.ts +0 -28
  292. package/src/interfaces/IMenuOption.ts +0 -79
  293. package/src/services/__mocks__/authService.ts +0 -14
  294. package/src/services/__tests__/authService.totp.property.spec.ts +0 -360
  295. package/src/services/__tests__/authService.totp.spec.ts +0 -439
  296. package/src/services/api.ts +0 -13
  297. package/src/services/authService.ts +0 -692
  298. package/src/services/authenticatedApi.ts +0 -17
  299. package/src/services/index.ts +0 -3
  300. package/src/types/MenuType.ts +0 -15
  301. package/src/types/expirationSeconds.ts +0 -18
  302. package/src/types/index.ts +0 -1
  303. package/src/types/translation.ts +0 -20
  304. package/src/wrappers/BackupCodeLoginWrapper.tsx +0 -34
  305. package/src/wrappers/BackupCodesWrapper.tsx +0 -28
  306. package/src/wrappers/ChangePasswordFormWrapper.tsx +0 -34
  307. package/src/wrappers/ForgotPasswordFormWrapper.tsx +0 -45
  308. package/src/wrappers/LoginFormWrapper.tsx +0 -108
  309. package/src/wrappers/LogoutPageWrapper.tsx +0 -30
  310. package/src/wrappers/RegisterFormWrapper.tsx +0 -109
  311. package/src/wrappers/ResetPasswordFormWrapper.tsx +0 -57
  312. package/src/wrappers/UserSettingsFormWrapper.tsx +0 -140
  313. package/src/wrappers/VerifyEmailPageWrapper.tsx +0 -27
  314. package/src/wrappers/__tests__/LoginFormWrapper.totp.spec.tsx +0 -339
@@ -1,188 +0,0 @@
1
- import { Box, Button, Container, TextField, Typography } from '@mui/material';
2
- import { useFormik } from 'formik';
3
- import { QRCodeSVG } from 'qrcode.react';
4
- import { FC, useState } from 'react';
5
- import * as Yup from 'yup';
6
-
7
- export interface TotpSetupFormValues {
8
- code: string;
9
- }
10
-
11
- export interface TotpSetupFormProps {
12
- provisioningUri: string;
13
- secret: string;
14
- onConfirm: (
15
- code: string
16
- ) => Promise<{ success: boolean } | { error: string }>;
17
- labels?: {
18
- title?: string;
19
- qrCodeAlt?: string;
20
- secretLabel?: string;
21
- codeLabel?: string;
22
- confirmButton?: string;
23
- errorMessage?: string;
24
- };
25
- }
26
-
27
- const defaultLabels = {
28
- title: 'Set Up Two-Factor Authentication',
29
- qrCodeAlt: 'QR code for TOTP authenticator app setup',
30
- secretLabel: 'Manual entry key',
31
- codeLabel: 'Confirmation code',
32
- confirmButton: 'Confirm',
33
- errorMessage: 'An unexpected error occurred',
34
- };
35
-
36
- const totpCodeSchema = Yup.object({
37
- code: Yup.string()
38
- .required('Confirmation code is required')
39
- .matches(/^\d{6}$/, 'Code must be exactly 6 digits'),
40
- });
41
-
42
- export const TotpSetupForm: FC<TotpSetupFormProps> = ({
43
- provisioningUri,
44
- secret,
45
- onConfirm,
46
- labels = {},
47
- }) => {
48
- const [confirmError, setConfirmError] = useState<string | null>(null);
49
-
50
- const resolvedLabels = {
51
- title: labels.title ?? defaultLabels.title,
52
- qrCodeAlt: labels.qrCodeAlt ?? defaultLabels.qrCodeAlt,
53
- secretLabel: labels.secretLabel ?? defaultLabels.secretLabel,
54
- codeLabel: labels.codeLabel ?? defaultLabels.codeLabel,
55
- confirmButton: labels.confirmButton ?? defaultLabels.confirmButton,
56
- errorMessage: labels.errorMessage ?? defaultLabels.errorMessage,
57
- };
58
-
59
- const formik = useFormik<TotpSetupFormValues>({
60
- initialValues: {
61
- code: '',
62
- },
63
- validationSchema: totpCodeSchema,
64
- onSubmit: async (values, { setSubmitting }) => {
65
- try {
66
- setConfirmError(null);
67
- const result = await onConfirm(values.code);
68
- if ('error' in result) {
69
- setConfirmError(result.error);
70
- }
71
- } catch {
72
- setConfirmError(resolvedLabels.errorMessage);
73
- } finally {
74
- setSubmitting(false);
75
- }
76
- },
77
- });
78
-
79
- const errorId = 'totp-setup-error';
80
-
81
- return (
82
- <Container component="main" maxWidth="xs">
83
- <Box
84
- sx={{
85
- marginTop: 8,
86
- display: 'flex',
87
- flexDirection: 'column',
88
- alignItems: 'center',
89
- }}
90
- >
91
- <Typography component="h1" variant="h5">
92
- {resolvedLabels.title}
93
- </Typography>
94
-
95
- <Box sx={{ mt: 3, display: 'flex', justifyContent: 'center' }}>
96
- <QRCodeSVG
97
- value={provisioningUri}
98
- size={200}
99
- role="img"
100
- aria-label={resolvedLabels.qrCodeAlt}
101
- data-testid="qr-code-svg"
102
- />
103
- </Box>
104
-
105
- <Box
106
- sx={{
107
- mt: 2,
108
- p: 2,
109
- bgcolor: 'grey.100',
110
- borderRadius: 1,
111
- width: '100%',
112
- textAlign: 'center',
113
- }}
114
- >
115
- <Typography variant="subtitle2" gutterBottom>
116
- {resolvedLabels.secretLabel}
117
- </Typography>
118
- <Typography
119
- variant="body2"
120
- sx={{
121
- fontFamily: 'monospace',
122
- wordBreak: 'break-all',
123
- userSelect: 'all',
124
- }}
125
- >
126
- {secret}
127
- </Typography>
128
- </Box>
129
-
130
- <Box
131
- component="form"
132
- onSubmit={formik.handleSubmit}
133
- sx={{ mt: 2, width: '100%' }}
134
- >
135
- <TextField
136
- margin="normal"
137
- required
138
- fullWidth
139
- id="code"
140
- name="code"
141
- label={resolvedLabels.codeLabel}
142
- inputProps={{
143
- 'aria-label': resolvedLabels.codeLabel,
144
- inputMode: 'numeric',
145
- maxLength: 6,
146
- pattern: '\\d{6}',
147
- ...(confirmError ? { 'aria-describedby': errorId } : {}),
148
- }}
149
- autoComplete="one-time-code"
150
- autoFocus
151
- value={formik.values.code}
152
- onChange={formik.handleChange}
153
- onBlur={formik.handleBlur}
154
- error={
155
- (formik.touched.code && Boolean(formik.errors.code)) ||
156
- Boolean(confirmError)
157
- }
158
- helperText={formik.touched.code && formik.errors.code}
159
- />
160
-
161
- {confirmError && (
162
- <Typography
163
- id={errorId}
164
- color="error"
165
- variant="body2"
166
- sx={{ mt: 1 }}
167
- role="alert"
168
- >
169
- {confirmError}
170
- </Typography>
171
- )}
172
-
173
- <Button
174
- type="submit"
175
- fullWidth
176
- variant="contained"
177
- sx={{ mt: 3, mb: 2 }}
178
- disabled={formik.isSubmitting}
179
- >
180
- {resolvedLabels.confirmButton}
181
- </Button>
182
- </Box>
183
- </Box>
184
- </Container>
185
- );
186
- };
187
-
188
- export default TotpSetupForm;
@@ -1,148 +0,0 @@
1
- import { Box, Button, Container, TextField, Typography } from '@mui/material';
2
- import { useFormik } from 'formik';
3
- import { FC, useState } from 'react';
4
- import * as Yup from 'yup';
5
- import { IRequestUserDTO } from '@digitaldefiance/suite-core-lib';
6
-
7
- export interface TotpVerificationFormValues {
8
- code: string;
9
- }
10
-
11
- export interface TotpVerificationFormProps {
12
- pendingTotpToken: string;
13
- onSubmit: (
14
- code: string,
15
- pendingTotpToken: string
16
- ) => Promise<
17
- { token: string; user: IRequestUserDTO } | { error: string }
18
- >;
19
- labels?: {
20
- title?: string;
21
- codeLabel?: string;
22
- submitButton?: string;
23
- errorMessage?: string;
24
- };
25
- }
26
-
27
- const defaultLabels = {
28
- title: 'Two-Factor Authentication',
29
- codeLabel: 'Authentication code',
30
- submitButton: 'Verify',
31
- errorMessage: 'An unexpected error occurred',
32
- };
33
-
34
- const totpCodeSchema = Yup.object({
35
- code: Yup.string()
36
- .required('Authentication code is required')
37
- .matches(/^\d{6}$/, 'Code must be exactly 6 digits'),
38
- });
39
-
40
- export const TotpVerificationForm: FC<TotpVerificationFormProps> = ({
41
- pendingTotpToken,
42
- onSubmit,
43
- labels = {},
44
- }) => {
45
- const [submitError, setSubmitError] = useState<string | null>(null);
46
-
47
- const resolvedLabels = {
48
- title: labels.title ?? defaultLabels.title,
49
- codeLabel: labels.codeLabel ?? defaultLabels.codeLabel,
50
- submitButton: labels.submitButton ?? defaultLabels.submitButton,
51
- errorMessage: labels.errorMessage ?? defaultLabels.errorMessage,
52
- };
53
-
54
- const formik = useFormik<TotpVerificationFormValues>({
55
- initialValues: {
56
- code: '',
57
- },
58
- validationSchema: totpCodeSchema,
59
- onSubmit: async (values, { setSubmitting }) => {
60
- try {
61
- setSubmitError(null);
62
- const result = await onSubmit(values.code, pendingTotpToken);
63
- if ('error' in result) {
64
- setSubmitError(result.error);
65
- }
66
- } catch {
67
- setSubmitError(resolvedLabels.errorMessage);
68
- } finally {
69
- setSubmitting(false);
70
- }
71
- },
72
- });
73
-
74
- const errorId = 'totp-verification-error';
75
-
76
- return (
77
- <Container component="main" maxWidth="xs">
78
- <Box
79
- sx={{
80
- marginTop: 8,
81
- display: 'flex',
82
- flexDirection: 'column',
83
- alignItems: 'center',
84
- }}
85
- >
86
- <Typography component="h1" variant="h5">
87
- {resolvedLabels.title}
88
- </Typography>
89
-
90
- <Box
91
- component="form"
92
- onSubmit={formik.handleSubmit}
93
- sx={{ mt: 2, width: '100%' }}
94
- >
95
- <TextField
96
- margin="normal"
97
- required
98
- fullWidth
99
- id="code"
100
- name="code"
101
- label={resolvedLabels.codeLabel}
102
- inputProps={{
103
- 'aria-label': resolvedLabels.codeLabel,
104
- inputMode: 'numeric',
105
- maxLength: 6,
106
- pattern: '\\d{6}',
107
- ...(submitError ? { 'aria-describedby': errorId } : {}),
108
- }}
109
- autoComplete="one-time-code"
110
- autoFocus
111
- value={formik.values.code}
112
- onChange={formik.handleChange}
113
- onBlur={formik.handleBlur}
114
- error={
115
- (formik.touched.code && Boolean(formik.errors.code)) ||
116
- Boolean(submitError)
117
- }
118
- helperText={formik.touched.code && formik.errors.code}
119
- />
120
-
121
- {submitError && (
122
- <Typography
123
- id={errorId}
124
- color="error"
125
- variant="body2"
126
- sx={{ mt: 1 }}
127
- role="alert"
128
- >
129
- {submitError}
130
- </Typography>
131
- )}
132
-
133
- <Button
134
- type="submit"
135
- fullWidth
136
- variant="contained"
137
- sx={{ mt: 3, mb: 2 }}
138
- disabled={formik.isSubmitting}
139
- >
140
- {resolvedLabels.submitButton}
141
- </Button>
142
- </Box>
143
- </Box>
144
- </Container>
145
- );
146
- };
147
-
148
- export default TotpVerificationForm;
@@ -1,31 +0,0 @@
1
- // src/app/components/TranslatedTitle.tsx
2
-
3
- import { useEffect } from 'react';
4
- import { useI18n } from '../contexts';
5
-
6
- interface FCParams<TEnum extends string> {
7
- componentId: string;
8
- stringKey: TEnum;
9
- vars?: Record<string, string | number>;
10
- }
11
-
12
- export const TranslatedTitle = <TEnum extends string>({
13
- componentId,
14
- stringKey,
15
- vars,
16
- }: FCParams<TEnum>): null => {
17
- const { tComponent, currentLanguage } = useI18n();
18
-
19
- useEffect(() => {
20
- document.title = tComponent<TEnum>(
21
- componentId,
22
- stringKey,
23
- vars,
24
- currentLanguage
25
- );
26
- }, [tComponent, componentId, stringKey, vars, currentLanguage]);
27
-
28
- return null;
29
- };
30
-
31
- export default TranslatedTitle;
@@ -1,45 +0,0 @@
1
- import { LanguageRegistry, LanguageDefinition } from '@digitaldefiance/i18n-lib';
2
- import { Button, Menu, MenuItem } from '@mui/material';
3
- import { FC, MouseEvent, useState, useMemo } from 'react';
4
- import { Flag } from './Flag';
5
- import { useUserSettings } from '../hooks';
6
- import { createAuthenticatedApiClient } from '../services';
7
- import { useAuth, useSuiteConfig } from '../contexts';
8
-
9
- export const UserLanguageSelector: FC = () => {
10
- const { baseUrl } = useSuiteConfig();
11
- const authenticatedApi = useMemo(() => createAuthenticatedApiClient(baseUrl), [baseUrl]);
12
- const { isAuthenticated } = useAuth();
13
- const { currentLanguage, changeLanguage } = useUserSettings({ authenticatedApi, isAuthenticated });
14
- const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
15
-
16
- const handleClick = (event: MouseEvent<HTMLButtonElement>) => {
17
- setAnchorEl(event.currentTarget);
18
- };
19
-
20
- const handleClose = () => {
21
- setAnchorEl(null);
22
- };
23
-
24
- const handleLanguageChange = (newLanguage: string) => {
25
- changeLanguage(newLanguage);
26
- handleClose();
27
- };
28
-
29
- return (
30
- <>
31
- <Button onClick={handleClick}>
32
- <Flag language={currentLanguage} />
33
- </Button>
34
- <Menu anchorEl={anchorEl} open={Boolean(anchorEl)} onClose={handleClose}>
35
- {Object.values(LanguageRegistry.getAllLanguages()).map((lang: LanguageDefinition) => (
36
- <MenuItem key={lang.code} onClick={() => handleLanguageChange(lang.code)}>
37
- <Flag language={lang.code} sx={{ mr: 1 }} /> {lang.name}
38
- </MenuItem>
39
- ))}
40
- </Menu>
41
- </>
42
- );
43
- };
44
-
45
- export default UserLanguageSelector;
@@ -1,15 +0,0 @@
1
- import { FC } from 'react';
2
- import { AccountCircle } from '@mui/icons-material';
3
- import { MenuTypes } from '../types/MenuType';
4
- import { DropdownMenu } from './DropdownMenu';
5
-
6
- export const UserMenu: FC = () => {
7
- return (
8
- <DropdownMenu
9
- menuType={MenuTypes.UserMenu}
10
- menuIcon={<AccountCircle />}
11
- />
12
- );
13
- };
14
-
15
- export default UserMenu;