@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
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useMenu = exports.MenuProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ // src/app/menuContext.tsx
6
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
7
+ const icons_material_1 = require("@mui/icons-material");
8
+ const react_1 = require("react");
9
+ const hooks_1 = require("../hooks");
10
+ const services_1 = require("../services");
11
+ const MenuType_1 = require("../types/MenuType");
12
+ const AuthProvider_1 = require("./AuthProvider");
13
+ const I18nProvider_1 = require("./I18nProvider");
14
+ const SuiteConfigProvider_1 = require("./SuiteConfigProvider");
15
+ const ThemeProvider_1 = require("./ThemeProvider");
16
+ const MenuContext = (0, react_1.createContext)(undefined);
17
+ const MenuProvider = ({ children, menuConfigs = [], enableBackupCodes = true, }) => {
18
+ const { userData: user, isAuthenticated, mnemonic, clearMnemonic, wallet, clearWallet, } = (0, AuthProvider_1.useAuth)();
19
+ const { mode: colorMode } = (0, ThemeProvider_1.useTheme)();
20
+ const registeredMenuOptions = (0, react_1.useRef)(new Set());
21
+ const [registeredOptions, setRegisteredOptions] = (0, react_1.useState)(new Map());
22
+ const { tComponent } = (0, I18nProvider_1.useI18n)();
23
+ const { baseUrl } = (0, SuiteConfigProvider_1.useSuiteConfig)();
24
+ const authenticatedApi = (0, react_1.useMemo)(() => (0, services_1.createAuthenticatedApiClient)(baseUrl), [baseUrl]);
25
+ const { toggleColorMode } = (0, hooks_1.useUserSettings)({
26
+ authenticatedApi,
27
+ isAuthenticated,
28
+ });
29
+ const registerMenuOption = (0, react_1.useCallback)((option) => {
30
+ const unregister = () => {
31
+ setRegisteredOptions((prev) => {
32
+ const newMap = new Map(prev);
33
+ newMap.delete(option.id);
34
+ return newMap;
35
+ });
36
+ registeredMenuOptions.current.delete(unregister);
37
+ };
38
+ setRegisteredOptions((prev) => {
39
+ const newMap = new Map(prev);
40
+ newMap.set(option.id, option);
41
+ return newMap;
42
+ });
43
+ registeredMenuOptions.current.add(unregister);
44
+ return unregister;
45
+ }, []);
46
+ const registerMenuOptions = (0, react_1.useCallback)((options) => {
47
+ const unregisterFunctions = options.map(registerMenuOption);
48
+ return () => unregisterFunctions.forEach((f) => f());
49
+ }, [registerMenuOption]);
50
+ const menuOptions = (0, react_1.useMemo)(() => {
51
+ const isUserRestricted = () => {
52
+ return user?.roles?.some((role) => role.child) ?? false;
53
+ };
54
+ let index = 0;
55
+ const baseOptions = [
56
+ {
57
+ id: 'dashboard',
58
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_Dashboard),
59
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Dashboard, {}),
60
+ link: '/dashboard',
61
+ requiresAuth: true,
62
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
63
+ index: index++,
64
+ },
65
+ {
66
+ id: 'user-divider',
67
+ label: '',
68
+ divider: true,
69
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
70
+ index: index++,
71
+ requiresAuth: false,
72
+ },
73
+ {
74
+ id: 'logout',
75
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.LogoutButton),
76
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.ExitToApp, {}),
77
+ link: '/logout',
78
+ requiresAuth: true,
79
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
80
+ index: index++,
81
+ },
82
+ {
83
+ id: 'login',
84
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Login_LoginButton),
85
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Login, {}),
86
+ link: '/login',
87
+ requiresAuth: false,
88
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
89
+ index: index++,
90
+ },
91
+ {
92
+ id: 'register',
93
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.RegisterButton),
94
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.PersonAdd, {}),
95
+ link: '/register',
96
+ requiresAuth: false,
97
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
98
+ index: index++,
99
+ },
100
+ {
101
+ id: 'forgot-password',
102
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.ForgotPassword_Title),
103
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.LockOpen, {}),
104
+ link: '/forgot-password',
105
+ requiresAuth: false,
106
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
107
+ index: index++,
108
+ },
109
+ {
110
+ id: 'change-password',
111
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_ChangePassword),
112
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.LockReset, {}),
113
+ link: '/change-password',
114
+ requiresAuth: true,
115
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
116
+ index: index++,
117
+ },
118
+ ...(enableBackupCodes
119
+ ? [
120
+ {
121
+ id: 'backup-code',
122
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.BackupCodeRecovery_Title),
123
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
124
+ link: '/backup-code',
125
+ requiresAuth: false,
126
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
127
+ index: index++,
128
+ },
129
+ {
130
+ id: 'backup-codes',
131
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.BackupCodeRecovery_GenerateNewCodes),
132
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Autorenew, {}),
133
+ link: '/backup-codes',
134
+ requiresAuth: true,
135
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
136
+ index: index++,
137
+ },
138
+ ]
139
+ : []),
140
+ {
141
+ id: 'divider',
142
+ label: '',
143
+ divider: true,
144
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
145
+ index: index++,
146
+ requiresAuth: false,
147
+ },
148
+ {
149
+ id: 'clear-mnemonic',
150
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_ClearMnemonic),
151
+ action: clearMnemonic,
152
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
153
+ requiresAuth: true,
154
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
155
+ index: index++,
156
+ filter: () => !!mnemonic,
157
+ },
158
+ {
159
+ id: 'clear-wallet',
160
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_ClearWallet),
161
+ action: clearWallet,
162
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
163
+ requiresAuth: true,
164
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
165
+ index: index++,
166
+ filter: () => !!wallet,
167
+ },
168
+ ...(isUserRestricted() ? [] : []),
169
+ {
170
+ id: 'color-divider',
171
+ label: '',
172
+ divider: true,
173
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
174
+ index: index++,
175
+ requiresAuth: undefined,
176
+ },
177
+ {
178
+ id: 'theme-toggle',
179
+ label: colorMode === 'dark'
180
+ ? tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_ThemeToggle_Light)
181
+ : tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_ThemeToggle_Dark),
182
+ icon: colorMode === 'dark' ? (0, jsx_runtime_1.jsx)(icons_material_1.Brightness7, {}) : (0, jsx_runtime_1.jsx)(icons_material_1.Brightness4, {}),
183
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
184
+ index: index++,
185
+ requiresAuth: undefined,
186
+ action: toggleColorMode,
187
+ },
188
+ {
189
+ id: 'user-settings',
190
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Settings_Title),
191
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Settings, {}),
192
+ link: '/user-settings',
193
+ requiresAuth: true,
194
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
195
+ index: index++,
196
+ },
197
+ ];
198
+ const allOptions = [...baseOptions, ...registeredOptions.values()];
199
+ return allOptions.sort((a, b) => a.index - b.index);
200
+ }, [
201
+ tComponent,
202
+ registeredOptions,
203
+ user?.roles,
204
+ colorMode,
205
+ toggleColorMode,
206
+ clearMnemonic,
207
+ clearWallet,
208
+ mnemonic,
209
+ wallet,
210
+ enableBackupCodes,
211
+ ]);
212
+ const getMenuOptions = (0, react_1.useCallback)((menuType, includeDividers) => {
213
+ const MenuFilter = (o) => {
214
+ // Apply the custom filter first
215
+ let customFilterPasses = true;
216
+ if (o.filter !== undefined) {
217
+ customFilterPasses = o.filter(o);
218
+ }
219
+ if (!customFilterPasses)
220
+ return false;
221
+ if (o.divider === true && !includeDividers)
222
+ return false;
223
+ return (o.includeOnMenus.includes(menuType) &&
224
+ (o.requiresAuth === undefined || o.requiresAuth === isAuthenticated));
225
+ };
226
+ return menuOptions.filter(MenuFilter);
227
+ }, [isAuthenticated, menuOptions]);
228
+ (0, react_1.useEffect)(() => {
229
+ if (menuConfigs.length > 0) {
230
+ return registerMenuOptions(menuConfigs.flatMap((config) => config.options));
231
+ }
232
+ return undefined;
233
+ }, [menuConfigs, registerMenuOptions]);
234
+ const getTopMenus = (0, react_1.useCallback)(() => {
235
+ const menus = [
236
+ ...menuConfigs.map((config) => ({ ...config, isUserMenu: false })),
237
+ {
238
+ menuType: MenuType_1.MenuTypes.UserMenu,
239
+ menuIcon: (0, jsx_runtime_1.jsx)(icons_material_1.AccountCircle, {}),
240
+ priority: 0,
241
+ options: [],
242
+ isUserMenu: true,
243
+ },
244
+ ];
245
+ return menus.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
246
+ }, [menuConfigs]);
247
+ const contextValue = (0, react_1.useMemo)(() => {
248
+ return {
249
+ menuOptions: menuOptions,
250
+ getMenuOptions: getMenuOptions,
251
+ registerMenuOption: registerMenuOption,
252
+ registerMenuOptions: registerMenuOptions,
253
+ getTopMenus: getTopMenus,
254
+ };
255
+ }, [
256
+ menuOptions,
257
+ getMenuOptions,
258
+ registerMenuOption,
259
+ registerMenuOptions,
260
+ getTopMenus,
261
+ ]);
262
+ const memoizedChildren = (0, react_1.useMemo)(() => children, [children]);
263
+ return ((0, jsx_runtime_1.jsx)(MenuContext.Provider, { value: contextValue, children: memoizedChildren }));
264
+ };
265
+ exports.MenuProvider = MenuProvider;
266
+ const useMenu = () => {
267
+ const context = (0, react_1.useContext)(MenuContext);
268
+ if (context === undefined) {
269
+ throw new Error('useMenu must be used within a MenuProvider');
270
+ }
271
+ return context;
272
+ };
273
+ exports.useMenu = useMenu;
@@ -0,0 +1,44 @@
1
+ import { ReactNode } from 'react';
2
+ export interface SuiteConfigRoutes {
3
+ dashboard?: string;
4
+ login?: string;
5
+ register?: string;
6
+ verifyEmail?: string;
7
+ forgotPassword?: string;
8
+ resetPassword?: string;
9
+ settings?: string;
10
+ }
11
+ export interface SuiteConfigContextData {
12
+ /**
13
+ * Base URL for API calls
14
+ */
15
+ baseUrl: string;
16
+ /**
17
+ * Application routes for navigation
18
+ */
19
+ routes: SuiteConfigRoutes;
20
+ /**
21
+ * Available languages for the application
22
+ */
23
+ languages: Array<{
24
+ code: string;
25
+ label: string;
26
+ }>;
27
+ /**
28
+ * Available timezones
29
+ */
30
+ timezones?: string[];
31
+ }
32
+ export interface SuiteConfigProviderProps {
33
+ children: ReactNode;
34
+ baseUrl: string;
35
+ routes?: Partial<SuiteConfigRoutes>;
36
+ languages?: Array<{
37
+ code: string;
38
+ label: string;
39
+ }>;
40
+ timezones?: string[];
41
+ }
42
+ export declare const SuiteConfigProvider: ({ children, baseUrl, routes, languages, timezones, }: SuiteConfigProviderProps) => import("react/jsx-runtime").JSX.Element;
43
+ export declare const useSuiteConfig: () => SuiteConfigContextData;
44
+ //# sourceMappingURL=SuiteConfigProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuiteConfigProvider.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/contexts/SuiteConfigProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAc,MAAM,OAAO,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAC;IAE1B;;OAEG;IACH,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAyBD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,mBAAmB,GAAI,sDAMjC,wBAAwB,4CAa1B,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,sBAMjC,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useSuiteConfig = exports.SuiteConfigProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const defaultRoutes = {
7
+ dashboard: '/dashboard',
8
+ login: '/login',
9
+ register: '/register',
10
+ verifyEmail: '/verify-email',
11
+ forgotPassword: '/forgot-password',
12
+ resetPassword: '/reset-password',
13
+ settings: '/settings',
14
+ };
15
+ const defaultLanguages = [
16
+ { code: 'en-US', label: 'English (US)' },
17
+ { code: 'en-GB', label: 'English (UK)' },
18
+ { code: 'es-ES', label: 'Español' },
19
+ { code: 'fr-FR', label: 'Français' },
20
+ { code: 'de-DE', label: 'Deutsch' },
21
+ { code: 'ja', label: '日本語' },
22
+ { code: 'zh-CN', label: '中文 (简体)' },
23
+ { code: 'uk', label: 'Українська' },
24
+ ];
25
+ const SuiteConfigContext = (0, react_1.createContext)(undefined);
26
+ const SuiteConfigProvider = ({ children, baseUrl, routes = {}, languages = defaultLanguages, timezones, }) => {
27
+ const value = {
28
+ baseUrl,
29
+ routes: { ...defaultRoutes, ...routes },
30
+ languages,
31
+ timezones,
32
+ };
33
+ return ((0, jsx_runtime_1.jsx)(SuiteConfigContext.Provider, { value: value, children: children }));
34
+ };
35
+ exports.SuiteConfigProvider = SuiteConfigProvider;
36
+ const useSuiteConfig = () => {
37
+ const context = (0, react_1.useContext)(SuiteConfigContext);
38
+ if (!context) {
39
+ throw new Error('useSuiteConfig must be used within a SuiteConfigProvider');
40
+ }
41
+ return context;
42
+ };
43
+ exports.useSuiteConfig = useSuiteConfig;
@@ -0,0 +1,15 @@
1
+ import { PaletteMode, Theme } from '@mui/material';
2
+ import { FC, ReactNode } from 'react';
3
+ export interface ThemeContextType {
4
+ toggleColorMode: () => void;
5
+ setColorMode: (mode: PaletteMode) => void;
6
+ mode: PaletteMode;
7
+ }
8
+ export declare const useTheme: () => ThemeContextType;
9
+ export interface AppThemeProviderProps {
10
+ children: ReactNode;
11
+ customTheme?: (mode: PaletteMode) => Theme;
12
+ }
13
+ export declare const AppThemeProvider: FC<AppThemeProviderProps>;
14
+ export declare const ThemeToggleButton: FC;
15
+ //# sourceMappingURL=ThemeProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeProvider.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/contexts/ThemeProvider.tsx"],"names":[],"mappings":"AACA,OAAO,EAGL,WAAW,EAEX,KAAK,EACN,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,EAAE,EAAE,SAAS,EAAgD,MAAM,OAAO,CAAC;AAEpF,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC1C,IAAI,EAAE,WAAW,CAAC;CACnB;AAID,eAAO,MAAM,QAAQ,wBAMpB,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,KAAK,CAAC;CAC5C;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA0BtD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,EAO/B,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThemeToggleButton = exports.AppThemeProvider = exports.useTheme = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const icons_material_1 = require("@mui/icons-material");
6
+ const material_1 = require("@mui/material");
7
+ const react_1 = require("react");
8
+ const ThemeContext = (0, react_1.createContext)(undefined);
9
+ const useTheme = () => {
10
+ const context = (0, react_1.useContext)(ThemeContext);
11
+ if (!context) {
12
+ throw new Error('useTheme must be used within an AppThemeProvider');
13
+ }
14
+ return context;
15
+ };
16
+ exports.useTheme = useTheme;
17
+ const AppThemeProvider = ({ children, customTheme }) => {
18
+ const [mode, setMode] = (0, react_1.useState)('light');
19
+ const colorMode = (0, react_1.useMemo)(() => ({
20
+ toggleColorMode: () => {
21
+ setMode((prevMode) => (prevMode === 'light' ? 'dark' : 'light'));
22
+ },
23
+ setColorMode: (newMode) => {
24
+ setMode(newMode);
25
+ },
26
+ mode,
27
+ }), [mode]);
28
+ const theme = (0, react_1.useMemo)(() => (customTheme ? customTheme(mode) : (0, material_1.createTheme)({ palette: { mode } })), [mode, customTheme]);
29
+ return ((0, jsx_runtime_1.jsx)(ThemeContext.Provider, { value: colorMode, children: (0, jsx_runtime_1.jsx)(material_1.ThemeProvider, { theme: theme, children: children }) }));
30
+ };
31
+ exports.AppThemeProvider = AppThemeProvider;
32
+ const ThemeToggleButton = () => {
33
+ const { mode, toggleColorMode } = (0, exports.useTheme)();
34
+ return ((0, jsx_runtime_1.jsx)(material_1.IconButton, { onClick: toggleColorMode, color: "inherit", children: mode === 'dark' ? (0, jsx_runtime_1.jsx)(icons_material_1.Brightness7, {}) : (0, jsx_runtime_1.jsx)(icons_material_1.Brightness4, {}) }));
35
+ };
36
+ exports.ThemeToggleButton = ThemeToggleButton;
@@ -3,3 +3,4 @@ export * from './MenuContext';
3
3
  export * from './I18nProvider';
4
4
  export * from './ThemeProvider';
5
5
  export * from './SuiteConfigProvider';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/contexts/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./AuthProvider"), exports);
5
+ tslib_1.__exportStar(require("./MenuContext"), exports);
6
+ tslib_1.__exportStar(require("./I18nProvider"), exports);
7
+ tslib_1.__exportStar(require("./ThemeProvider"), exports);
8
+ tslib_1.__exportStar(require("./SuiteConfigProvider"), exports);
@@ -3,3 +3,4 @@ export * from './useLocalStorage';
3
3
  export * from './useBackupCodes';
4
4
  export * from './useUserSettings';
5
5
  export * from './useEmailVerification';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./useExpiringValue"), exports);
5
+ tslib_1.__exportStar(require("./useLocalStorage"), exports);
6
+ tslib_1.__exportStar(require("./useBackupCodes"), exports);
7
+ tslib_1.__exportStar(require("./useUserSettings"), exports);
8
+ tslib_1.__exportStar(require("./useEmailVerification"), exports);
@@ -0,0 +1,15 @@
1
+ export interface UseBackupCodesOptions {
2
+ initialCodeCount?: number | null;
3
+ }
4
+ export interface UseBackupCodesResult {
5
+ backupCodesRemaining: number | null;
6
+ isLoading: boolean;
7
+ error: Error | null;
8
+ generateBackupCodes: (password?: string, mnemonic?: string) => Promise<{
9
+ message: string;
10
+ backupCodes: string[];
11
+ }>;
12
+ refreshCodeCount: () => Promise<void>;
13
+ }
14
+ export declare const useBackupCodes: (options?: UseBackupCodesOptions) => UseBackupCodesResult;
15
+ //# sourceMappingURL=useBackupCodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBackupCodes.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/useBackupCodes.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,mBAAmB,EAAE,CACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,KACd,OAAO,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC,CAAC;IACH,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,cAAc,GACzB,UAAS,qBAA0B,KAClC,oBA4EF,CAAC"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useBackupCodes = void 0;
4
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
5
+ const react_1 = require("react");
6
+ const contexts_1 = require("../contexts");
7
+ const services_1 = require("../services");
8
+ const useBackupCodes = (options = {}) => {
9
+ const { baseUrl } = (0, contexts_1.useSuiteConfig)();
10
+ const [backupCodesRemaining, setBackupCodesRemaining] = (0, react_1.useState)(options.initialCodeCount ?? null);
11
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
12
+ const [error, setError] = (0, react_1.useState)(null);
13
+ const requestedOnMountRef = (0, react_1.useRef)(false);
14
+ const api = (0, react_1.useMemo)(() => (0, services_1.createAuthenticatedApiClient)(baseUrl), [baseUrl]);
15
+ const refreshCodeCount = (0, react_1.useCallback)(async () => {
16
+ setIsLoading(true);
17
+ setError(null);
18
+ try {
19
+ const result = await api.get('/user/backup-codes');
20
+ if (result?.data?.codeCount !== undefined) {
21
+ setBackupCodesRemaining(result.data.codeCount);
22
+ }
23
+ }
24
+ catch (err) {
25
+ setError(err instanceof Error
26
+ ? err
27
+ : new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.BackupCodes_FailedToFetch));
28
+ setBackupCodesRemaining(0);
29
+ }
30
+ finally {
31
+ setIsLoading(false);
32
+ }
33
+ }, [api]);
34
+ (0, react_1.useEffect)(() => {
35
+ if (requestedOnMountRef.current)
36
+ return;
37
+ if (backupCodesRemaining !== null)
38
+ return;
39
+ requestedOnMountRef.current = true;
40
+ refreshCodeCount();
41
+ }, [backupCodesRemaining, refreshCodeCount]);
42
+ const generateBackupCodes = async (password, mnemonic) => {
43
+ setIsLoading(true);
44
+ setError(null);
45
+ try {
46
+ const result = await api.post('/user/backup-codes', {
47
+ ...(password ? { password } : {}),
48
+ ...(mnemonic ? { mnemonic } : {}),
49
+ });
50
+ return {
51
+ message: result.data.message,
52
+ backupCodes: result.data.backupCodes,
53
+ };
54
+ }
55
+ catch (err) {
56
+ const error = err instanceof Error
57
+ ? err
58
+ : new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.BackupCodes_FailedToGenerate);
59
+ setError(error);
60
+ throw error;
61
+ }
62
+ finally {
63
+ setIsLoading(false);
64
+ }
65
+ };
66
+ return {
67
+ backupCodesRemaining,
68
+ isLoading,
69
+ error,
70
+ generateBackupCodes,
71
+ refreshCodeCount,
72
+ };
73
+ };
74
+ exports.useBackupCodes = useBackupCodes;
@@ -0,0 +1,10 @@
1
+ export interface UseEmailVerificationResult {
2
+ isVerifying: boolean;
3
+ error: Error | null;
4
+ verifyEmail: (token: string) => Promise<{
5
+ success: boolean;
6
+ message?: string;
7
+ }>;
8
+ }
9
+ export declare const useEmailVerification: () => UseEmailVerificationResult;
10
+ //# sourceMappingURL=useEmailVerification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEmailVerification.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/useEmailVerification.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,CACX,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,eAAO,MAAM,oBAAoB,QAAO,0BAgCvC,CAAC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useEmailVerification = void 0;
4
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
5
+ const react_1 = require("react");
6
+ const contexts_1 = require("../contexts");
7
+ const services_1 = require("../services");
8
+ const useEmailVerification = () => {
9
+ const { baseUrl } = (0, contexts_1.useSuiteConfig)();
10
+ const api = (0, react_1.useMemo)(() => (0, services_1.createAuthenticatedApiClient)(baseUrl), [baseUrl]);
11
+ const [isVerifying, setIsVerifying] = (0, react_1.useState)(false);
12
+ const [error, setError] = (0, react_1.useState)(null);
13
+ const verifyEmail = async (verificationToken) => {
14
+ setIsVerifying(true);
15
+ setError(null);
16
+ try {
17
+ const result = await api.post('/verify-email', {
18
+ token: verificationToken,
19
+ });
20
+ return { success: true, message: result.data.message };
21
+ }
22
+ catch (err) {
23
+ const axiosError = err;
24
+ const errorMessage = axiosError.response?.data?.message ||
25
+ (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Error_VerificationFailed);
26
+ const error = new Error(errorMessage);
27
+ setError(error);
28
+ return { success: false, message: errorMessage };
29
+ }
30
+ finally {
31
+ setIsVerifying(false);
32
+ }
33
+ };
34
+ return {
35
+ isVerifying,
36
+ error,
37
+ verifyEmail,
38
+ };
39
+ };
40
+ exports.useEmailVerification = useEmailVerification;
@@ -0,0 +1,14 @@
1
+ export interface TimerInfo {
2
+ timeout: NodeJS.Timeout;
3
+ startTime: number;
4
+ durationMs: number;
5
+ }
6
+ export interface ExpiringValueReturn<T> {
7
+ value: T | undefined;
8
+ setValue: (newValue: T, durationSeconds?: number, saveToStorage?: boolean) => () => void;
9
+ clearValue: () => void;
10
+ getRemainingTime: () => number;
11
+ isActive: boolean;
12
+ }
13
+ export declare function useExpiringValue<T>(defaultDurationSeconds: number, localStorageKey?: string): ExpiringValueReturn<T>;
14
+ //# sourceMappingURL=useExpiringValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useExpiringValue.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/useExpiringValue.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC;IACrB,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;IACzF,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,sBAAsB,EAAE,MAAM,EAC9B,eAAe,CAAC,EAAE,MAAM,GACvB,mBAAmB,CAAC,CAAC,CAAC,CA0DxB"}