@digitaldefiance/express-suite-react-components 2.9.38 → 2.9.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/package.json +5 -4
  2. package/src/auth/Private.d.ts +6 -0
  3. package/src/auth/Private.d.ts.map +1 -0
  4. package/src/auth/Private.js +14 -0
  5. package/src/auth/PrivateRoute.d.ts +8 -0
  6. package/src/auth/PrivateRoute.d.ts.map +1 -0
  7. package/src/auth/PrivateRoute.js +23 -0
  8. package/src/auth/UnAuth.d.ts +6 -0
  9. package/src/auth/UnAuth.d.ts.map +1 -0
  10. package/src/auth/UnAuth.js +14 -0
  11. package/src/auth/UnAuthRoute.d.ts +8 -0
  12. package/src/auth/UnAuthRoute.d.ts.map +1 -0
  13. package/src/auth/UnAuthRoute.js +22 -0
  14. package/src/auth/{index.ts → index.d.ts} +2 -1
  15. package/src/auth/index.d.ts.map +1 -0
  16. package/src/auth/index.js +10 -0
  17. package/src/components/ApiAccess.d.ts +16 -0
  18. package/src/components/ApiAccess.d.ts.map +1 -0
  19. package/src/components/ApiAccess.js +77 -0
  20. package/src/components/BackupCodeLoginForm.d.ts +43 -0
  21. package/src/components/BackupCodeLoginForm.d.ts.map +1 -0
  22. package/src/components/BackupCodeLoginForm.js +139 -0
  23. package/src/components/BackupCodesForm.d.ts +26 -0
  24. package/src/components/BackupCodesForm.d.ts.map +1 -0
  25. package/src/components/BackupCodesForm.js +120 -0
  26. package/src/components/ChangePasswordForm.d.ts +26 -0
  27. package/src/components/ChangePasswordForm.d.ts.map +1 -0
  28. package/src/components/ChangePasswordForm.js +78 -0
  29. package/src/components/ConfirmationDialog.d.ts +13 -0
  30. package/src/components/ConfirmationDialog.d.ts.map +1 -0
  31. package/src/components/ConfirmationDialog.js +10 -0
  32. package/src/components/CurrencyCodeSelector.d.ts +9 -0
  33. package/src/components/CurrencyCodeSelector.d.ts.map +1 -0
  34. package/src/components/CurrencyCodeSelector.js +31 -0
  35. package/src/components/CurrencyInput.d.ts +13 -0
  36. package/src/components/CurrencyInput.d.ts.map +1 -0
  37. package/src/components/CurrencyInput.js +22 -0
  38. package/src/components/DashboardPage.d.ts +8 -0
  39. package/src/components/DashboardPage.d.ts.map +1 -0
  40. package/src/components/DashboardPage.js +10 -0
  41. package/src/components/DropdownMenu.d.ts +9 -0
  42. package/src/components/DropdownMenu.d.ts.map +1 -0
  43. package/src/components/DropdownMenu.js +56 -0
  44. package/src/components/ExpirationSecondsSelector.d.ts +13 -0
  45. package/src/components/ExpirationSecondsSelector.d.ts.map +1 -0
  46. package/src/components/ExpirationSecondsSelector.js +32 -0
  47. package/src/components/Flag.d.ts +20 -0
  48. package/src/components/Flag.d.ts.map +1 -0
  49. package/src/components/Flag.js +43 -0
  50. package/src/components/ForgotPasswordForm.d.ts +18 -0
  51. package/src/components/ForgotPasswordForm.d.ts.map +1 -0
  52. package/src/components/ForgotPasswordForm.js +61 -0
  53. package/src/components/LoginForm.d.ts +44 -0
  54. package/src/components/LoginForm.d.ts.map +1 -0
  55. package/src/components/LoginForm.js +122 -0
  56. package/src/components/LogoutPage.d.ts +8 -0
  57. package/src/components/LogoutPage.d.ts.map +1 -0
  58. package/src/components/LogoutPage.js +16 -0
  59. package/src/components/RegisterForm.d.ts +56 -0
  60. package/src/components/RegisterForm.d.ts.map +1 -0
  61. package/src/components/RegisterForm.js +140 -0
  62. package/src/components/ResetPasswordForm.d.ts +23 -0
  63. package/src/components/ResetPasswordForm.d.ts.map +1 -0
  64. package/src/components/ResetPasswordForm.js +78 -0
  65. package/src/components/SideMenu.d.ts +8 -0
  66. package/src/components/SideMenu.d.ts.map +1 -0
  67. package/src/components/SideMenu.js +25 -0
  68. package/src/components/SideMenuListItem.d.ts +13 -0
  69. package/src/components/SideMenuListItem.d.ts.map +1 -0
  70. package/src/components/SideMenuListItem.js +44 -0
  71. package/src/components/TopMenu.d.ts +24 -0
  72. package/src/components/TopMenu.d.ts.map +1 -0
  73. package/src/components/TopMenu.js +35 -0
  74. package/src/components/TranslatedTitle.d.ts +7 -0
  75. package/src/components/TranslatedTitle.d.ts.map +1 -0
  76. package/src/components/TranslatedTitle.js +15 -0
  77. package/src/components/UserLanguageSelector.d.ts +4 -0
  78. package/src/components/UserLanguageSelector.d.ts.map +1 -0
  79. package/src/components/UserLanguageSelector.js +31 -0
  80. package/src/components/UserMenu.d.ts +4 -0
  81. package/src/components/UserMenu.d.ts.map +1 -0
  82. package/src/components/UserMenu.js +12 -0
  83. package/src/components/UserSettingsForm.d.ts +57 -0
  84. package/src/components/UserSettingsForm.d.ts.map +1 -0
  85. package/src/components/UserSettingsForm.js +126 -0
  86. package/src/components/VerifyEmailPage.d.ts +23 -0
  87. package/src/components/VerifyEmailPage.d.ts.map +1 -0
  88. package/src/components/VerifyEmailPage.js +70 -0
  89. package/src/components/{index.ts → index.d.ts} +1 -1
  90. package/src/components/index.d.ts.map +1 -0
  91. package/src/components/index.js +28 -0
  92. package/src/contexts/AuthProvider.d.ts +152 -0
  93. package/src/contexts/AuthProvider.d.ts.map +1 -0
  94. package/src/contexts/AuthProvider.js +502 -0
  95. package/src/contexts/I18nProvider.d.ts +16 -0
  96. package/src/contexts/I18nProvider.d.ts.map +1 -0
  97. package/src/contexts/I18nProvider.js +46 -0
  98. package/src/contexts/MenuContext.d.ts +20 -0
  99. package/src/contexts/MenuContext.d.ts.map +1 -0
  100. package/src/contexts/MenuContext.js +273 -0
  101. package/src/contexts/SuiteConfigProvider.d.ts +44 -0
  102. package/src/contexts/SuiteConfigProvider.d.ts.map +1 -0
  103. package/src/contexts/SuiteConfigProvider.js +43 -0
  104. package/src/contexts/ThemeProvider.d.ts +15 -0
  105. package/src/contexts/ThemeProvider.d.ts.map +1 -0
  106. package/src/contexts/ThemeProvider.js +36 -0
  107. package/src/contexts/{index.ts → index.d.ts} +1 -0
  108. package/src/contexts/index.d.ts.map +1 -0
  109. package/src/contexts/index.js +8 -0
  110. package/src/hooks/{index.ts → index.d.ts} +1 -0
  111. package/src/hooks/index.d.ts.map +1 -0
  112. package/src/hooks/index.js +8 -0
  113. package/src/hooks/useBackupCodes.d.ts +15 -0
  114. package/src/hooks/useBackupCodes.d.ts.map +1 -0
  115. package/src/hooks/useBackupCodes.js +74 -0
  116. package/src/hooks/useEmailVerification.d.ts +10 -0
  117. package/src/hooks/useEmailVerification.d.ts.map +1 -0
  118. package/src/hooks/useEmailVerification.js +40 -0
  119. package/src/hooks/useExpiringValue.d.ts +14 -0
  120. package/src/hooks/useExpiringValue.d.ts.map +1 -0
  121. package/src/hooks/useExpiringValue.js +53 -0
  122. package/src/hooks/useLocalStorage.d.ts +2 -0
  123. package/src/hooks/useLocalStorage.d.ts.map +1 -0
  124. package/src/hooks/useLocalStorage.js +15 -0
  125. package/src/hooks/useUserSettings.d.ts +48 -0
  126. package/src/hooks/useUserSettings.d.ts.map +1 -0
  127. package/src/hooks/useUserSettings.js +169 -0
  128. package/src/{index.ts → index.d.ts} +1 -1
  129. package/src/index.d.ts.map +1 -0
  130. package/src/index.js +12 -0
  131. package/src/interfaces/IAppConfig.d.ts +6 -0
  132. package/src/interfaces/IAppConfig.d.ts.map +1 -0
  133. package/src/interfaces/IAppConfig.js +2 -0
  134. package/src/interfaces/IMenuConfig.d.ts +11 -0
  135. package/src/interfaces/IMenuConfig.d.ts.map +1 -0
  136. package/src/interfaces/IMenuConfig.js +2 -0
  137. package/src/interfaces/IMenuOption.d.ts +58 -0
  138. package/src/interfaces/IMenuOption.d.ts.map +1 -0
  139. package/src/interfaces/IMenuOption.js +2 -0
  140. package/src/interfaces/index.d.ts +4 -0
  141. package/src/interfaces/index.d.ts.map +1 -0
  142. package/src/interfaces/index.js +6 -0
  143. package/src/services/__mocks__/authService.d.ts +21 -0
  144. package/src/services/__mocks__/authService.d.ts.map +1 -0
  145. package/src/services/__mocks__/authService.js +15 -0
  146. package/src/services/api.d.ts +3 -0
  147. package/src/services/api.d.ts.map +1 -0
  148. package/src/services/api.js +14 -0
  149. package/src/services/authService.d.ts +72 -0
  150. package/src/services/authService.d.ts.map +1 -0
  151. package/src/services/authService.js +335 -0
  152. package/src/services/authenticatedApi.d.ts +3 -0
  153. package/src/services/authenticatedApi.d.ts.map +1 -0
  154. package/src/services/authenticatedApi.js +18 -0
  155. package/src/services/index.d.ts +4 -0
  156. package/src/services/index.d.ts.map +1 -0
  157. package/src/services/index.js +6 -0
  158. package/src/types/MenuType.d.ts +11 -0
  159. package/src/types/MenuType.d.ts.map +1 -0
  160. package/src/types/MenuType.js +12 -0
  161. package/src/types/expirationSeconds.d.ts +3 -0
  162. package/src/types/expirationSeconds.d.ts.map +1 -0
  163. package/src/types/expirationSeconds.js +17 -0
  164. package/src/types/index.d.ts +2 -0
  165. package/src/types/index.d.ts.map +1 -0
  166. package/src/types/index.js +4 -0
  167. package/src/types/translation.d.ts +10 -0
  168. package/src/types/translation.d.ts.map +1 -0
  169. package/src/types/translation.js +9 -0
  170. package/src/wrappers/BackupCodeLoginWrapper.d.ts +8 -0
  171. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +1 -0
  172. package/src/wrappers/BackupCodeLoginWrapper.js +20 -0
  173. package/src/wrappers/BackupCodesWrapper.d.ts +7 -0
  174. package/src/wrappers/BackupCodesWrapper.d.ts.map +1 -0
  175. package/src/wrappers/BackupCodesWrapper.js +17 -0
  176. package/src/wrappers/ChangePasswordFormWrapper.d.ts +8 -0
  177. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +1 -0
  178. package/src/wrappers/ChangePasswordFormWrapper.js +21 -0
  179. package/src/wrappers/LoginFormWrapper.d.ts +9 -0
  180. package/src/wrappers/LoginFormWrapper.d.ts.map +1 -0
  181. package/src/wrappers/LoginFormWrapper.js +43 -0
  182. package/src/wrappers/LogoutPageWrapper.d.ts +9 -0
  183. package/src/wrappers/LogoutPageWrapper.d.ts.map +1 -0
  184. package/src/wrappers/LogoutPageWrapper.js +21 -0
  185. package/src/wrappers/RegisterFormWrapper.d.ts +9 -0
  186. package/src/wrappers/RegisterFormWrapper.d.ts.map +1 -0
  187. package/src/wrappers/RegisterFormWrapper.js +31 -0
  188. package/src/wrappers/UserSettingsFormWrapper.d.ts +8 -0
  189. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +1 -0
  190. package/src/wrappers/UserSettingsFormWrapper.js +24 -0
  191. package/src/wrappers/VerifyEmailPageWrapper.d.ts +8 -0
  192. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +1 -0
  193. package/src/wrappers/VerifyEmailPageWrapper.js +20 -0
  194. package/src/wrappers/{index.tsx → index.d.ts} +1 -8
  195. package/src/wrappers/index.d.ts.map +1 -0
  196. package/src/wrappers/index.js +20 -0
  197. package/LICENSE +0 -21
  198. package/src/auth/Private.tsx +0 -17
  199. package/src/auth/PrivateRoute.tsx +0 -28
  200. package/src/auth/UnAuth.tsx +0 -16
  201. package/src/auth/UnAuthRoute.tsx +0 -30
  202. package/src/components/ApiAccess.tsx +0 -174
  203. package/src/components/BackupCodeLoginForm.tsx +0 -488
  204. package/src/components/BackupCodesForm.tsx +0 -286
  205. package/src/components/ChangePasswordForm.tsx +0 -272
  206. package/src/components/ConfirmationDialog.tsx +0 -48
  207. package/src/components/CurrencyCodeSelector.tsx +0 -60
  208. package/src/components/CurrencyInput.tsx +0 -80
  209. package/src/components/DashboardPage.tsx +0 -24
  210. package/src/components/DropdownMenu.tsx +0 -92
  211. package/src/components/ExpirationSecondsSelector.tsx +0 -60
  212. package/src/components/Flag.tsx +0 -52
  213. package/src/components/ForgotPasswordForm.tsx +0 -173
  214. package/src/components/LoginForm.tsx +0 -455
  215. package/src/components/LogoutPage.tsx +0 -21
  216. package/src/components/RegisterForm.tsx +0 -602
  217. package/src/components/ResetPasswordForm.tsx +0 -246
  218. package/src/components/SideMenu.tsx +0 -46
  219. package/src/components/SideMenuListItem.tsx +0 -74
  220. package/src/components/TopMenu.tsx +0 -145
  221. package/src/components/TranslatedTitle.tsx +0 -29
  222. package/src/components/UserLanguageSelector.tsx +0 -45
  223. package/src/components/UserMenu.tsx +0 -15
  224. package/src/components/UserSettingsForm.tsx +0 -505
  225. package/src/components/VerifyEmailPage.tsx +0 -184
  226. package/src/contexts/AuthProvider.spec.tsx +0 -1195
  227. package/src/contexts/AuthProvider.tsx +0 -924
  228. package/src/contexts/I18nProvider.tsx +0 -114
  229. package/src/contexts/MenuContext.tsx +0 -398
  230. package/src/contexts/SuiteConfigProvider.tsx +0 -93
  231. package/src/contexts/ThemeProvider.tsx +0 -67
  232. package/src/hooks/useBackupCodes.ts +0 -105
  233. package/src/hooks/useEmailVerification.ts +0 -49
  234. package/src/hooks/useExpiringValue.ts +0 -78
  235. package/src/hooks/useLocalStorage.ts +0 -18
  236. package/src/hooks/useUserSettings.ts +0 -269
  237. package/src/interfaces/IAppConfig.ts +0 -5
  238. package/src/interfaces/IMenuConfig.ts +0 -11
  239. package/src/interfaces/IMenuOption.ts +0 -55
  240. package/src/interfaces/index.ts +0 -3
  241. package/src/services/__mocks__/authService.ts +0 -14
  242. package/src/services/api.ts +0 -13
  243. package/src/services/authService.ts +0 -500
  244. package/src/services/authenticatedApi.ts +0 -17
  245. package/src/services/index.ts +0 -3
  246. package/src/types/MenuType.ts +0 -15
  247. package/src/types/expirationSeconds.ts +0 -18
  248. package/src/types/index.ts +0 -1
  249. package/src/types/translation.ts +0 -20
  250. package/src/wrappers/BackupCodeLoginWrapper.tsx +0 -34
  251. package/src/wrappers/BackupCodesWrapper.tsx +0 -28
  252. package/src/wrappers/ChangePasswordFormWrapper.tsx +0 -34
  253. package/src/wrappers/LoginFormWrapper.tsx +0 -59
  254. package/src/wrappers/LogoutPageWrapper.tsx +0 -30
  255. package/src/wrappers/RegisterFormWrapper.tsx +0 -61
  256. package/src/wrappers/UserSettingsFormWrapper.tsx +0 -39
  257. package/src/wrappers/VerifyEmailPageWrapper.tsx +0 -27
@@ -1,286 +0,0 @@
1
- import {
2
- Constants,
3
- SuiteCoreComponentId,
4
- SuiteCoreStringKey,
5
- } from '@digitaldefiance/suite-core-lib';
6
- import {
7
- Alert,
8
- Box,
9
- Button,
10
- Container,
11
- TextField,
12
- Typography,
13
- } from '@mui/material';
14
- import { useFormik } from 'formik';
15
- import { FC, useState } from 'react';
16
- import * as Yup from 'yup';
17
- import { useI18n } from '../contexts';
18
-
19
- export interface BackupCodesFormValues {
20
- password?: string;
21
- mnemonic?: string;
22
- }
23
-
24
- export interface BackupCodesFormProps {
25
- onSubmit: (values: BackupCodesFormValues) => Promise<{
26
- message: string;
27
- backupCodes: string[];
28
- }>;
29
- backupCodesRemaining?: number | null;
30
- mnemonicValidation?: Yup.StringSchema;
31
- passwordValidation?: Yup.StringSchema;
32
- labels?: {
33
- title?: string;
34
- codesRemaining?: string;
35
- mnemonic?: string;
36
- password?: string;
37
- generateButton?: string;
38
- successTitle?: string;
39
- };
40
- }
41
-
42
- export const BackupCodesForm: FC<BackupCodesFormProps> = ({
43
- onSubmit,
44
- backupCodesRemaining = null,
45
- mnemonicValidation,
46
- passwordValidation,
47
- labels = {},
48
- }) => {
49
- const { tComponent } = useI18n();
50
- const [apiError, setApiError] = useState<string | null>(null);
51
- const [apiSuccess, setApiSuccess] = useState<string | null>(null);
52
- const [backupCodes, setBackupCodes] = useState<string[] | null>(null);
53
-
54
- const validation = {
55
- mnemonic:
56
- mnemonicValidation ||
57
- Yup.string()
58
- .trim()
59
- .matches(
60
- Constants.MnemonicRegex,
61
- tComponent<SuiteCoreStringKey>(
62
- SuiteCoreComponentId,
63
- SuiteCoreStringKey.Validation_MnemonicRegex
64
- )
65
- )
66
- .optional(),
67
- password:
68
- passwordValidation ||
69
- Yup.string()
70
- .trim()
71
- .matches(
72
- Constants.PasswordRegex,
73
- tComponent<SuiteCoreStringKey>(
74
- SuiteCoreComponentId,
75
- SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate
76
- )
77
- )
78
- .optional(),
79
- };
80
-
81
- const translatedLabels = {
82
- codesRemaining:
83
- labels.codesRemaining ||
84
- tComponent<SuiteCoreStringKey>(
85
- SuiteCoreComponentId,
86
- SuiteCoreStringKey.BackupCodeRecovery_CodesRemainingTemplate
87
- ),
88
- mnemonic:
89
- labels.mnemonic ||
90
- tComponent<SuiteCoreStringKey>(
91
- SuiteCoreComponentId,
92
- SuiteCoreStringKey.Common_Mnemonic
93
- ),
94
- password:
95
- labels.password ||
96
- tComponent<SuiteCoreStringKey>(
97
- SuiteCoreComponentId,
98
- SuiteCoreStringKey.Common_Password
99
- ),
100
- generateButton:
101
- labels.generateButton ||
102
- tComponent<SuiteCoreStringKey>(
103
- SuiteCoreComponentId,
104
- SuiteCoreStringKey.BackupCodeRecovery_GenerateNewCodes
105
- ),
106
- successTitle:
107
- labels.successTitle ||
108
- tComponent<SuiteCoreStringKey>(
109
- SuiteCoreComponentId,
110
- SuiteCoreStringKey.BackupCodeRecovery_YourNewCodes
111
- ),
112
- xorError: tComponent<SuiteCoreStringKey>(
113
- SuiteCoreComponentId,
114
- SuiteCoreStringKey.Validation_MnemonicOrPasswordRequired
115
- ),
116
- unexpectedError: tComponent<SuiteCoreStringKey>(
117
- SuiteCoreComponentId,
118
- SuiteCoreStringKey.Common_UnexpectedError
119
- ),
120
- };
121
-
122
- const validationSchema = Yup.object({
123
- mnemonic: validation.mnemonic,
124
- password: validation.password,
125
- })
126
- .test(
127
- 'xor-mnemonic-password-mnemonic',
128
- translatedLabels.xorError,
129
- function (value) {
130
- const mnemonic = value?.mnemonic?.trim() ?? '';
131
- const password = value?.password?.trim() ?? '';
132
- const hasMnemonic = mnemonic.length > 0;
133
- const hasPassword = password.length > 0;
134
-
135
- if (!hasMnemonic && !hasPassword) {
136
- return this.createError({
137
- path: 'mnemonic',
138
- message: translatedLabels.xorError,
139
- });
140
- }
141
- if (hasMnemonic && hasPassword) {
142
- return this.createError({
143
- path: 'mnemonic',
144
- message: translatedLabels.xorError,
145
- });
146
- }
147
- return true;
148
- }
149
- )
150
- .test(
151
- 'xor-mnemonic-password-password',
152
- translatedLabels.xorError,
153
- function (value) {
154
- const mnemonic = value?.mnemonic?.trim() ?? '';
155
- const password = value?.password?.trim() ?? '';
156
- const hasMnemonic = mnemonic.length > 0;
157
- const hasPassword = password.length > 0;
158
-
159
- if (!hasMnemonic && !hasPassword) {
160
- return this.createError({
161
- path: 'password',
162
- message: translatedLabels.xorError,
163
- });
164
- }
165
- if (hasMnemonic && hasPassword) {
166
- return this.createError({
167
- path: 'password',
168
- message: translatedLabels.xorError,
169
- });
170
- }
171
- return true;
172
- }
173
- );
174
-
175
- const formik = useFormik<BackupCodesFormValues>({
176
- initialValues: {
177
- password: '',
178
- mnemonic: '',
179
- },
180
- validationSchema,
181
- onSubmit: async (values, { setSubmitting }) => {
182
- try {
183
- const result = await onSubmit(values);
184
- if (result && result.backupCodes) {
185
- setApiSuccess(translatedLabels.successTitle);
186
- setBackupCodes(result.backupCodes);
187
- }
188
- if (result && result.message) {
189
- setApiSuccess(result.message);
190
- }
191
- setApiError(null);
192
- } catch (e: unknown) {
193
- setApiSuccess(null);
194
- const error = e as { response?: { data?: { message?: string } } };
195
- setApiError(
196
- error.response?.data?.message ?? translatedLabels.unexpectedError
197
- );
198
- } finally {
199
- setSubmitting(false);
200
- }
201
- },
202
- });
203
-
204
- return (
205
- <Container component="main" maxWidth="xs">
206
- <Box>
207
- <Typography component="h1" variant="h5">
208
- {translatedLabels.codesRemaining.replace(
209
- '{count}',
210
- String(backupCodesRemaining ?? 0)
211
- )}
212
- </Typography>
213
- </Box>
214
- <Box
215
- component="form"
216
- onSubmit={formik.handleSubmit}
217
- sx={{ mt: 1, width: '100%' }}
218
- >
219
- <TextField
220
- margin="normal"
221
- fullWidth
222
- id="mnemonic"
223
- label={translatedLabels.mnemonic}
224
- type="password"
225
- name="mnemonic"
226
- autoComplete="mnemonic"
227
- autoFocus
228
- value={formik.values.mnemonic}
229
- onChange={formik.handleChange}
230
- onBlur={formik.handleBlur}
231
- error={
232
- (formik.touched.mnemonic || formik.submitCount > 0) &&
233
- Boolean(formik.errors.mnemonic)
234
- }
235
- helperText={
236
- (formik.touched.mnemonic || formik.submitCount > 0) &&
237
- formik.errors.mnemonic
238
- }
239
- />
240
- <TextField
241
- margin="normal"
242
- fullWidth
243
- name="password"
244
- label={translatedLabels.password}
245
- type="password"
246
- id="password"
247
- value={formik.values.password}
248
- onChange={formik.handleChange}
249
- onBlur={formik.handleBlur}
250
- error={
251
- (formik.touched.password || formik.submitCount > 0) &&
252
- Boolean(formik.errors.password)
253
- }
254
- helperText={
255
- (formik.touched.password || formik.submitCount > 0) &&
256
- formik.errors.password
257
- }
258
- />
259
- <Button type="submit" fullWidth variant="contained" sx={{ mt: 2 }}>
260
- {translatedLabels.generateButton}
261
- </Button>
262
- </Box>
263
- {apiError && (
264
- <Alert severity="error" sx={{ mt: 2, mb: 2 }}>
265
- {apiError}
266
- </Alert>
267
- )}
268
- {backupCodes && apiSuccess && (
269
- <Box sx={{ mt: 2, mb: 2 }}>
270
- <Typography component="h2" variant="h6">
271
- {apiSuccess}
272
- </Typography>
273
- <ul>
274
- {backupCodes.map((code, index) => (
275
- <li key={index}>
276
- <pre>{code}</pre>
277
- </li>
278
- ))}
279
- </ul>
280
- </Box>
281
- )}
282
- </Container>
283
- );
284
- };
285
-
286
- export default BackupCodesForm;
@@ -1,272 +0,0 @@
1
- import {
2
- Constants,
3
- SuiteCoreComponentId,
4
- SuiteCoreStringKey,
5
- } from '@digitaldefiance/suite-core-lib';
6
- import {
7
- Alert,
8
- Box,
9
- Button,
10
- Container,
11
- TextField,
12
- Typography,
13
- } from '@mui/material';
14
- import { useFormik } from 'formik';
15
- import { FC, useState } from 'react';
16
- import * as Yup from 'yup';
17
- import { useI18n } from '../contexts';
18
-
19
- export interface ChangePasswordFormValues {
20
- currentPassword: string;
21
- newPassword: string;
22
- confirmPassword: string;
23
- }
24
-
25
- export interface ChangePasswordFormProps {
26
- onSubmit: (
27
- values: ChangePasswordFormValues
28
- ) => Promise<{ success?: boolean; error?: string }>;
29
- titleText?: string;
30
- currentPasswordLabel?: string;
31
- newPasswordLabel?: string;
32
- confirmPasswordLabel?: string;
33
- submitButtonText?: string;
34
- submittingButtonText?: string;
35
- successMessage?: string;
36
- currentPasswordValidation?: Yup.StringSchema;
37
- newPasswordValidation?: Yup.StringSchema;
38
- confirmPasswordValidation?: Yup.StringSchema;
39
- }
40
-
41
- export const ChangePasswordForm: FC<ChangePasswordFormProps> = ({
42
- onSubmit,
43
- titleText,
44
- currentPasswordLabel,
45
- newPasswordLabel,
46
- confirmPasswordLabel,
47
- submitButtonText,
48
- submittingButtonText,
49
- successMessage,
50
- currentPasswordValidation,
51
- newPasswordValidation,
52
- confirmPasswordValidation,
53
- }) => {
54
- const { tComponent } = useI18n();
55
- const [success, setSuccess] = useState(false);
56
- const [apiError, setApiError] = useState<string>('');
57
-
58
- const validation = {
59
- currentPassword:
60
- currentPasswordValidation ||
61
- Yup.string().required(
62
- tComponent<SuiteCoreStringKey>(
63
- SuiteCoreComponentId,
64
- SuiteCoreStringKey.Validation_Required
65
- )
66
- ),
67
- newPassword:
68
- newPasswordValidation ||
69
- Yup.string()
70
- .min(
71
- Constants.PasswordMinLength,
72
- tComponent<SuiteCoreStringKey>(
73
- SuiteCoreComponentId,
74
- SuiteCoreStringKey.Validation_PasswordMinLengthTemplate
75
- )
76
- )
77
- .required(
78
- tComponent<SuiteCoreStringKey>(
79
- SuiteCoreComponentId,
80
- SuiteCoreStringKey.Validation_Required
81
- )
82
- ),
83
- confirmPassword:
84
- confirmPasswordValidation ||
85
- Yup.string()
86
- .oneOf(
87
- [Yup.ref('newPassword')],
88
- tComponent<SuiteCoreStringKey>(
89
- SuiteCoreComponentId,
90
- SuiteCoreStringKey.Validation_PasswordMatch
91
- )
92
- )
93
- .required(
94
- tComponent<SuiteCoreStringKey>(
95
- SuiteCoreComponentId,
96
- SuiteCoreStringKey.Validation_Required
97
- )
98
- ),
99
- };
100
-
101
- const labels = {
102
- title:
103
- titleText ||
104
- tComponent<SuiteCoreStringKey>(
105
- SuiteCoreComponentId,
106
- SuiteCoreStringKey.Common_ChangePassword
107
- ),
108
- currentPassword:
109
- currentPasswordLabel ||
110
- tComponent<SuiteCoreStringKey>(
111
- SuiteCoreComponentId,
112
- SuiteCoreStringKey.Common_CurrentPassword
113
- ),
114
- newPassword:
115
- newPasswordLabel ||
116
- tComponent<SuiteCoreStringKey>(
117
- SuiteCoreComponentId,
118
- SuiteCoreStringKey.Common_NewPassword
119
- ),
120
- confirmPassword:
121
- confirmPasswordLabel ||
122
- tComponent<SuiteCoreStringKey>(
123
- SuiteCoreComponentId,
124
- SuiteCoreStringKey.Common_ConfirmNewPassword
125
- ),
126
- submitButton:
127
- submitButtonText ||
128
- tComponent<SuiteCoreStringKey>(
129
- SuiteCoreComponentId,
130
- SuiteCoreStringKey.Common_ChangePassword
131
- ),
132
- submittingButton:
133
- submittingButtonText ||
134
- tComponent<SuiteCoreStringKey>(
135
- SuiteCoreComponentId,
136
- SuiteCoreStringKey.Common_ChangingPassword
137
- ),
138
- success:
139
- successMessage ||
140
- tComponent<SuiteCoreStringKey>(
141
- SuiteCoreComponentId,
142
- SuiteCoreStringKey.PasswordChange_Success
143
- ),
144
- };
145
-
146
- const formik = useFormik<ChangePasswordFormValues>({
147
- initialValues: {
148
- currentPassword: '',
149
- newPassword: '',
150
- confirmPassword: '',
151
- },
152
- validationSchema: Yup.object({
153
- currentPassword: validation.currentPassword,
154
- newPassword: validation.newPassword,
155
- confirmPassword: validation.confirmPassword,
156
- }),
157
- onSubmit: async (values, { resetForm }) => {
158
- const result = await onSubmit(values);
159
-
160
- if ('success' in result) {
161
- setSuccess(true);
162
- setApiError('');
163
- resetForm();
164
- } else if ('error' in result && result.error) {
165
- setApiError(result.error);
166
- setSuccess(false);
167
- }
168
- },
169
- });
170
-
171
- return (
172
- <Container maxWidth="sm">
173
- <Box
174
- sx={{
175
- mt: 8,
176
- display: 'flex',
177
- flexDirection: 'column',
178
- alignItems: 'center',
179
- }}
180
- >
181
- <Typography variant="h4" component="h1" gutterBottom>
182
- {labels.title}
183
- </Typography>
184
-
185
- <Box
186
- component="form"
187
- onSubmit={formik.handleSubmit}
188
- sx={{ mt: 1, width: '100%' }}
189
- >
190
- <TextField
191
- fullWidth
192
- id="currentPassword"
193
- name="currentPassword"
194
- label={labels.currentPassword}
195
- type="password"
196
- value={formik.values.currentPassword}
197
- onChange={formik.handleChange}
198
- onBlur={formik.handleBlur}
199
- error={Boolean(
200
- formik.touched.currentPassword && formik.errors.currentPassword
201
- )}
202
- helperText={
203
- formik.touched.currentPassword && formik.errors.currentPassword
204
- }
205
- margin="normal"
206
- />
207
-
208
- <TextField
209
- fullWidth
210
- id="newPassword"
211
- name="newPassword"
212
- label={labels.newPassword}
213
- type="password"
214
- value={formik.values.newPassword}
215
- onChange={formik.handleChange}
216
- onBlur={formik.handleBlur}
217
- error={Boolean(
218
- formik.touched.newPassword && formik.errors.newPassword
219
- )}
220
- helperText={formik.touched.newPassword && formik.errors.newPassword}
221
- margin="normal"
222
- />
223
-
224
- <TextField
225
- fullWidth
226
- id="confirmPassword"
227
- name="confirmPassword"
228
- label={labels.confirmPassword}
229
- type="password"
230
- value={formik.values.confirmPassword}
231
- onChange={formik.handleChange}
232
- onBlur={formik.handleBlur}
233
- error={Boolean(
234
- formik.touched.confirmPassword && formik.errors.confirmPassword
235
- )}
236
- helperText={
237
- formik.touched.confirmPassword && formik.errors.confirmPassword
238
- }
239
- margin="normal"
240
- />
241
-
242
- {apiError && (
243
- <Alert severity="error" sx={{ mt: 2, mb: 2 }}>
244
- {apiError}
245
- </Alert>
246
- )}
247
-
248
- {success && (
249
- <Alert severity="success" sx={{ mt: 2, mb: 2 }}>
250
- {labels.success}
251
- </Alert>
252
- )}
253
-
254
- <Button
255
- type="submit"
256
- fullWidth
257
- variant="contained"
258
- color="primary"
259
- sx={{ mt: 3, mb: 2 }}
260
- disabled={formik.isSubmitting}
261
- >
262
- {formik.isSubmitting
263
- ? labels.submittingButton
264
- : labels.submitButton}
265
- </Button>
266
- </Box>
267
- </Box>
268
- </Container>
269
- );
270
- };
271
-
272
- export default ChangePasswordForm;
@@ -1,48 +0,0 @@
1
- import {
2
- Button,
3
- Dialog,
4
- DialogActions,
5
- DialogContent,
6
- DialogContentText,
7
- DialogTitle,
8
- } from '@mui/material';
9
- import React from 'react';
10
-
11
- export interface ConfirmationDialogProps {
12
- open: boolean;
13
- title: string;
14
- message: string;
15
- confirmText?: string;
16
- cancelText?: string;
17
- onConfirm: () => void;
18
- onCancel: () => void;
19
- }
20
-
21
- export const ConfirmationDialog: React.FC<ConfirmationDialogProps> = ({
22
- open,
23
- title,
24
- message,
25
- confirmText = 'Confirm',
26
- cancelText = 'Cancel',
27
- onConfirm,
28
- onCancel,
29
- }) => {
30
- return (
31
- <Dialog open={open} onClose={onCancel}>
32
- <DialogTitle>{title}</DialogTitle>
33
- <DialogContent>
34
- <DialogContentText>{message}</DialogContentText>
35
- </DialogContent>
36
- <DialogActions>
37
- <Button onClick={onCancel} color="primary">
38
- {cancelText}
39
- </Button>
40
- <Button onClick={onConfirm} color="primary">
41
- {confirmText}
42
- </Button>
43
- </DialogActions>
44
- </Dialog>
45
- );
46
- };
47
-
48
- export default ConfirmationDialog;
@@ -1,60 +0,0 @@
1
- import { CurrencyCode } from '@digitaldefiance/i18n-lib';
2
- import { MenuItem, TextField } from '@mui/material';
3
- import { Field, FieldProps } from 'formik';
4
- import { ChangeEvent, FC } from 'react';
5
-
6
- export interface CurrencyCodeSelectorProps {
7
- name: string;
8
- label: string;
9
- onCurrencyChange?: (code: string) => void;
10
- }
11
-
12
- export const CurrencyCodeSelector: FC<CurrencyCodeSelectorProps> = ({
13
- name,
14
- label,
15
- onCurrencyChange,
16
- }) => {
17
- return (
18
- <Field name={name}>
19
- {({ field, form }: FieldProps) => (
20
- <TextField
21
- select
22
- fullWidth
23
- label={label}
24
- {...field}
25
- onChange={(event: ChangeEvent<HTMLInputElement>) => {
26
- const selectedCode = event.target.value;
27
- form.setFieldValue(name, selectedCode);
28
- onCurrencyChange?.(selectedCode);
29
- }}
30
- error={form.touched[name] && Boolean(form.errors[name])}
31
- helperText={form.touched[name] && (form.errors[name] as string)}
32
- sx={{
33
- '& .MuiSelect-select': {
34
- paddingRight: '32px',
35
- },
36
- '& .MuiOutlinedInput-root': {
37
- '& fieldset': {
38
- borderColor: 'rgba(0, 0, 0, 0.23)',
39
- },
40
- '&:hover fieldset': {
41
- borderColor: 'rgba(0, 0, 0, 0.87)',
42
- },
43
- '&.Mui-focused fieldset': {
44
- borderColor: 'primary.main',
45
- },
46
- },
47
- }}
48
- >
49
- {CurrencyCode.getAll().map((code: string) => (
50
- <MenuItem key={code} value={code}>
51
- {code}
52
- </MenuItem>
53
- ))}
54
- </TextField>
55
- )}
56
- </Field>
57
- );
58
- };
59
-
60
- export default CurrencyCodeSelector;