@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,489 +0,0 @@
1
- import {
2
- Constants,
3
- SuiteCoreComponentId,
4
- SuiteCoreStringKey,
5
- SuiteCoreStringKeyValue,
6
- } from '@digitaldefiance/suite-core-lib';
7
- import {
8
- Box,
9
- Button,
10
- Checkbox,
11
- Container,
12
- FormControlLabel,
13
- TextField,
14
- Typography,
15
- } from '@mui/material';
16
- import { useFormik } from 'formik';
17
- import { FC, useState } from 'react';
18
- import * as Yup from 'yup';
19
- import { useI18n } from '../contexts';
20
-
21
- export interface BackupCodeLoginFormValues {
22
- email: string;
23
- username: string;
24
- code: string;
25
- newPassword?: string;
26
- confirmNewPassword?: string;
27
- recoverMnemonic: boolean;
28
- }
29
-
30
- export interface BackupCodeLoginFormProps {
31
- onSubmit: (
32
- identifier: string,
33
- code: string,
34
- isEmail: boolean,
35
- recoverMnemonic: boolean,
36
- newPassword?: string
37
- ) => Promise<
38
- | { token: string; codeCount: number; mnemonic?: string; message?: string }
39
- | { error: string; status?: number }
40
- >;
41
- onNavigate?: (path: string, state?: Record<string, unknown>) => void;
42
- isAuthenticated?: boolean;
43
- validationSchema?: Yup.ObjectSchema<BackupCodeLoginFormValues>;
44
- labels?: {
45
- title?: string;
46
- email?: string;
47
- username?: string;
48
- code?: string;
49
- newPassword?: string;
50
- confirmPassword?: string;
51
- recoverMnemonic?: string;
52
- login?: string;
53
- useUsername?: string;
54
- useEmail?: string;
55
- dashboard?: string;
56
- generateNewCodes?: string;
57
- mnemonicLabel?: string;
58
- codesRemaining?: string;
59
- };
60
- }
61
-
62
- export const BackupCodeLoginForm: FC<BackupCodeLoginFormProps> = ({
63
- onSubmit,
64
- onNavigate,
65
- isAuthenticated = false,
66
- validationSchema,
67
- labels = {},
68
- }) => {
69
- const { tComponent } = useI18n();
70
- const [loginType, setLoginType] = useState<'email' | 'username'>('email');
71
- const [loginError, setLoginError] = useState<string | null>(null);
72
- const [recoveredMnemonic, setRecoveredMnemonic] = useState<string | null>(
73
- null
74
- );
75
- const [successMessage, setSuccessMessage] = useState<string | null>(null);
76
- const [codesRemaining, setCodesRemaining] = useState<number | null>(null);
77
-
78
- const translatedLabels = {
79
- title:
80
- labels.title ||
81
- tComponent<SuiteCoreStringKeyValue>(
82
- SuiteCoreComponentId,
83
- SuiteCoreStringKey.BackupCodeRecovery_Title
84
- ),
85
- email:
86
- labels.email ||
87
- tComponent<SuiteCoreStringKeyValue>(
88
- SuiteCoreComponentId,
89
- SuiteCoreStringKey.Common_Email
90
- ),
91
- username:
92
- labels.username ||
93
- tComponent<SuiteCoreStringKeyValue>(
94
- SuiteCoreComponentId,
95
- SuiteCoreStringKey.Common_Username
96
- ),
97
- code:
98
- labels.code ||
99
- tComponent<SuiteCoreStringKeyValue>(
100
- SuiteCoreComponentId,
101
- SuiteCoreStringKey.Common_BackupCode
102
- ),
103
- newPassword:
104
- labels.newPassword ||
105
- tComponent<SuiteCoreStringKeyValue>(
106
- SuiteCoreComponentId,
107
- SuiteCoreStringKey.Common_NewPassword
108
- ),
109
- confirmPassword:
110
- labels.confirmPassword ||
111
- tComponent<SuiteCoreStringKeyValue>(
112
- SuiteCoreComponentId,
113
- SuiteCoreStringKey.Common_ConfirmNewPassword
114
- ),
115
- recoverMnemonic:
116
- labels.recoverMnemonic ||
117
- tComponent<SuiteCoreStringKeyValue>(
118
- SuiteCoreComponentId,
119
- SuiteCoreStringKey.BackupCodeRecovery_RecoverMnemonic
120
- ),
121
- login:
122
- labels.login ||
123
- tComponent<SuiteCoreStringKeyValue>(
124
- SuiteCoreComponentId,
125
- SuiteCoreStringKey.BackupCodeRecovery_Login
126
- ),
127
- useUsername:
128
- labels.useUsername ||
129
- tComponent<SuiteCoreStringKeyValue>(
130
- SuiteCoreComponentId,
131
- SuiteCoreStringKey.Login_UseUsername
132
- ),
133
- useEmail:
134
- labels.useEmail ||
135
- tComponent<SuiteCoreStringKeyValue>(
136
- SuiteCoreComponentId,
137
- SuiteCoreStringKey.Login_UseEmailAddress
138
- ),
139
- dashboard:
140
- labels.dashboard ||
141
- tComponent<SuiteCoreStringKeyValue>(
142
- SuiteCoreComponentId,
143
- SuiteCoreStringKey.Common_Dashboard
144
- ),
145
- generateNewCodes:
146
- labels.generateNewCodes ||
147
- tComponent<SuiteCoreStringKeyValue>(
148
- SuiteCoreComponentId,
149
- SuiteCoreStringKey.BackupCodeRecovery_GenerateNewCodes
150
- ),
151
- mnemonicLabel:
152
- labels.mnemonicLabel ||
153
- tComponent<SuiteCoreStringKeyValue>(
154
- SuiteCoreComponentId,
155
- SuiteCoreStringKey.Common_Mnemonic
156
- ),
157
- codesRemaining:
158
- labels.codesRemaining ||
159
- tComponent<SuiteCoreStringKeyValue>(
160
- SuiteCoreComponentId,
161
- SuiteCoreStringKey.BackupCodeRecovery_CodesRemainingTemplate
162
- ),
163
- unexpectedError: tComponent<SuiteCoreStringKeyValue>(
164
- SuiteCoreComponentId,
165
- SuiteCoreStringKey.Common_UnexpectedError
166
- ),
167
- };
168
-
169
- const yupFieldValidation = {
170
- email: Yup.string()
171
- .email(
172
- tComponent<SuiteCoreStringKeyValue>(
173
- SuiteCoreComponentId,
174
- SuiteCoreStringKey.Validation_InvalidEmail
175
- )
176
- )
177
- .required(
178
- tComponent<SuiteCoreStringKeyValue>(
179
- SuiteCoreComponentId,
180
- SuiteCoreStringKey.Validation_Required
181
- )
182
- ),
183
- username: Yup.string()
184
- .matches(
185
- Constants.UsernameRegex,
186
- tComponent<SuiteCoreStringKeyValue>(
187
- SuiteCoreComponentId,
188
- SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate
189
- )
190
- )
191
- .required(
192
- tComponent<SuiteCoreStringKeyValue>(
193
- SuiteCoreComponentId,
194
- SuiteCoreStringKey.Validation_Required
195
- )
196
- ),
197
- code: Yup.string()
198
- .required(
199
- tComponent<SuiteCoreStringKeyValue>(
200
- SuiteCoreComponentId,
201
- SuiteCoreStringKey.Validation_Required
202
- )
203
- )
204
- .matches(
205
- Constants.BACKUP_CODES.DisplayRegex,
206
- tComponent<SuiteCoreStringKeyValue>(
207
- SuiteCoreComponentId,
208
- SuiteCoreStringKey.Validation_InvalidBackupCode
209
- )
210
- ),
211
- password: Yup.string().matches(
212
- Constants.PasswordRegex,
213
- tComponent<SuiteCoreStringKeyValue>(
214
- SuiteCoreComponentId,
215
- SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate
216
- )
217
- ),
218
- confirmPassword: Yup.string().oneOf(
219
- [Yup.ref('newPassword')],
220
- tComponent<SuiteCoreStringKeyValue>(
221
- SuiteCoreComponentId,
222
- SuiteCoreStringKey.Validation_PasswordMatch
223
- )
224
- ),
225
- };
226
-
227
- const formik = useFormik<BackupCodeLoginFormValues>({
228
- initialValues: {
229
- email: '',
230
- username: '',
231
- code: '',
232
- newPassword: '',
233
- confirmNewPassword: '',
234
- recoverMnemonic: false,
235
- },
236
- validationSchema:
237
- validationSchema ??
238
- Yup.object({
239
- [loginType]:
240
- loginType === 'email'
241
- ? yupFieldValidation.email
242
- : yupFieldValidation.username,
243
- code: yupFieldValidation.code,
244
- newPassword: yupFieldValidation.password,
245
- confirmNewPassword: yupFieldValidation.confirmPassword,
246
- }),
247
- enableReinitialize: true,
248
- onSubmit: async (values, { setSubmitting }) => {
249
- try {
250
- const loginResult = await onSubmit(
251
- loginType === 'email' ? values.email : values.username,
252
- values.code,
253
- loginType === 'email',
254
- values.recoverMnemonic,
255
- values.newPassword && values.newPassword.length > 0
256
- ? values.newPassword
257
- : undefined
258
- );
259
- if ('error' in loginResult) {
260
- setLoginError(loginResult.error);
261
- setCodesRemaining(null);
262
- setRecoveredMnemonic(null);
263
- return;
264
- }
265
- setLoginError(null);
266
- if (loginResult.codeCount) {
267
- setCodesRemaining(loginResult.codeCount);
268
- }
269
- if (loginResult.mnemonic) {
270
- setRecoveredMnemonic(loginResult.mnemonic);
271
- }
272
- if (loginResult.message) {
273
- setSuccessMessage(loginResult.message);
274
- }
275
- } catch {
276
- setLoginError(translatedLabels.unexpectedError);
277
- } finally {
278
- setSubmitting(false);
279
- }
280
- },
281
- });
282
-
283
- if (
284
- isAuthenticated &&
285
- recoveredMnemonic === null &&
286
- codesRemaining === null
287
- ) {
288
- onNavigate?.('/dashboard');
289
- return null;
290
- }
291
-
292
- return (
293
- <Container component="main" maxWidth="xs">
294
- <Box
295
- sx={{
296
- marginTop: 8,
297
- display: 'flex',
298
- flexDirection: 'column',
299
- alignItems: 'center',
300
- }}
301
- >
302
- <Typography component="h1" variant="h5">
303
- {translatedLabels.title}
304
- </Typography>
305
- <Box
306
- component="form"
307
- onSubmit={formik.handleSubmit}
308
- sx={{ mt: 1, width: '100%' }}
309
- >
310
- {!isAuthenticated && (
311
- <>
312
- <TextField
313
- margin="normal"
314
- fullWidth
315
- id={loginType}
316
- label={
317
- loginType === 'email'
318
- ? translatedLabels.email
319
- : translatedLabels.username
320
- }
321
- name={loginType}
322
- autoComplete={loginType === 'email' ? 'email' : 'username'}
323
- autoFocus
324
- value={
325
- loginType === 'email'
326
- ? formik.values.email
327
- : formik.values.username
328
- }
329
- onChange={formik.handleChange}
330
- onBlur={formik.handleBlur}
331
- error={
332
- formik.touched[loginType] && Boolean(formik.errors[loginType])
333
- }
334
- helperText={
335
- formik.touched[loginType] && formik.errors[loginType]
336
- }
337
- disabled={isAuthenticated}
338
- />
339
- <TextField
340
- margin="normal"
341
- required
342
- fullWidth
343
- name="code"
344
- label={translatedLabels.code}
345
- id="code"
346
- value={formik.values.code}
347
- onChange={formik.handleChange}
348
- onBlur={formik.handleBlur}
349
- error={formik.touched.code && Boolean(formik.errors.code)}
350
- helperText={formik.touched.code && formik.errors.code}
351
- disabled={isAuthenticated}
352
- />
353
- <TextField
354
- margin="normal"
355
- fullWidth
356
- name="newPassword"
357
- label={translatedLabels.newPassword}
358
- type="password"
359
- id="newPassword"
360
- value={formik.values.newPassword}
361
- onChange={formik.handleChange}
362
- onBlur={formik.handleBlur}
363
- error={
364
- formik.touched.newPassword &&
365
- Boolean(formik.errors.newPassword)
366
- }
367
- helperText={
368
- formik.touched.newPassword && formik.errors.newPassword
369
- }
370
- disabled={isAuthenticated}
371
- />
372
- <TextField
373
- margin="normal"
374
- fullWidth
375
- name="confirmNewPassword"
376
- label={translatedLabels.confirmPassword}
377
- type="password"
378
- id="confirmNewPassword"
379
- value={formik.values.confirmNewPassword}
380
- onChange={formik.handleChange}
381
- onBlur={formik.handleBlur}
382
- error={
383
- formik.touched.confirmNewPassword &&
384
- Boolean(formik.errors.confirmNewPassword)
385
- }
386
- helperText={
387
- formik.touched.confirmNewPassword &&
388
- formik.errors.confirmNewPassword
389
- }
390
- disabled={isAuthenticated}
391
- />
392
- <FormControlLabel
393
- control={
394
- <Checkbox
395
- checked={formik.values.recoverMnemonic}
396
- onChange={formik.handleChange}
397
- onBlur={formik.handleBlur}
398
- name="recoverMnemonic"
399
- />
400
- }
401
- label={translatedLabels.recoverMnemonic}
402
- disabled={isAuthenticated}
403
- />
404
- </>
405
- )}
406
- {successMessage && (
407
- <Typography color="success.main" variant="body2" sx={{ mt: 1 }}>
408
- {successMessage}
409
- </Typography>
410
- )}
411
- {recoveredMnemonic && (
412
- <Box sx={{ mt: 2, p: 2, bgcolor: 'grey.100', borderRadius: 1 }}>
413
- <Typography variant="subtitle2" gutterBottom>
414
- {translatedLabels.mnemonicLabel}:
415
- </Typography>
416
- <Typography variant="body2" sx={{ fontFamily: 'monospace' }}>
417
- {recoveredMnemonic}
418
- </Typography>
419
- <Button
420
- fullWidth
421
- variant="contained"
422
- sx={{ mt: 2 }}
423
- onClick={() => onNavigate?.('/dashboard')}
424
- >
425
- {translatedLabels.dashboard}
426
- </Button>
427
- </Box>
428
- )}
429
- {codesRemaining !== null && (
430
- <Box sx={{ mt: 2 }}>
431
- <Typography variant="body2">
432
- {translatedLabels.codesRemaining.replace(
433
- '{count}',
434
- String(codesRemaining)
435
- )}
436
- </Typography>
437
- <Button
438
- fullWidth
439
- variant="contained"
440
- sx={{ mt: 2 }}
441
- onClick={() =>
442
- onNavigate?.('/backup-codes', { codeCount: codesRemaining })
443
- }
444
- >
445
- {translatedLabels.generateNewCodes}
446
- </Button>
447
- </Box>
448
- )}
449
- {loginError && (
450
- <Typography color="error" variant="body2" sx={{ mt: 1 }}>
451
- {loginError}
452
- </Typography>
453
- )}
454
- {!isAuthenticated && (
455
- <>
456
- <Button
457
- type="submit"
458
- fullWidth
459
- variant="contained"
460
- sx={{ mt: 3, mb: 2 }}
461
- disabled={formik.isSubmitting}
462
- >
463
- {translatedLabels.login}
464
- </Button>
465
- <Box sx={{ display: 'flex', justifyContent: 'center' }}>
466
- <Button
467
- fullWidth
468
- variant="text"
469
- onClick={() => {
470
- const newType =
471
- loginType === 'email' ? 'username' : 'email';
472
- formik.setFieldValue(loginType, '');
473
- setLoginType(newType);
474
- }}
475
- >
476
- {loginType === 'email'
477
- ? translatedLabels.useUsername
478
- : translatedLabels.useEmail}
479
- </Button>
480
- </Box>
481
- </>
482
- )}
483
- </Box>
484
- </Box>
485
- </Container>
486
- );
487
- };
488
-
489
- export default BackupCodeLoginForm;