@digitaldefiance/express-suite-react-components 2.9.7 → 2.9.9

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 +6 -5
  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 +70 -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 +106 -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 +108 -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 +66 -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 +54 -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 +99 -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 +54 -0
  60. package/src/components/RegisterForm.d.ts.map +1 -0
  61. package/src/components/RegisterForm.js +105 -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 +68 -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 +42 -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 +56 -0
  84. package/src/components/UserSettingsForm.d.ts.map +1 -0
  85. package/src/components/UserSettingsForm.js +93 -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 +61 -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 +446 -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 +244 -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 +70 -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 +36 -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 +46 -0
  126. package/src/hooks/useUserSettings.d.ts.map +1 -0
  127. package/src/hooks/useUserSettings.js +152 -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 +347 -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 +21 -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 +26 -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 -134
  203. package/src/components/BackupCodeLoginForm.tsx +0 -314
  204. package/src/components/BackupCodesForm.tsx +0 -198
  205. package/src/components/ChangePasswordForm.tsx +0 -182
  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 -65
  212. package/src/components/Flag.tsx +0 -53
  213. package/src/components/ForgotPasswordForm.tsx +0 -120
  214. package/src/components/LoginForm.tsx +0 -307
  215. package/src/components/LogoutPage.tsx +0 -21
  216. package/src/components/RegisterForm.tsx +0 -354
  217. package/src/components/ResetPasswordForm.tsx +0 -164
  218. package/src/components/SideMenu.tsx +0 -46
  219. package/src/components/SideMenuListItem.tsx +0 -74
  220. package/src/components/TopMenu.tsx +0 -149
  221. package/src/components/TranslatedTitle.tsx +0 -22
  222. package/src/components/UserLanguageSelector.tsx +0 -45
  223. package/src/components/UserMenu.tsx +0 -15
  224. package/src/components/UserSettingsForm.tsx +0 -328
  225. package/src/components/VerifyEmailPage.tsx +0 -133
  226. package/src/contexts/AuthProvider.spec.tsx +0 -1060
  227. package/src/contexts/AuthProvider.tsx +0 -741
  228. package/src/contexts/I18nProvider.tsx +0 -85
  229. package/src/contexts/MenuContext.tsx +0 -310
  230. package/src/contexts/SuiteConfigProvider.tsx +0 -93
  231. package/src/contexts/ThemeProvider.tsx +0 -67
  232. package/src/hooks/useBackupCodes.ts +0 -85
  233. package/src/hooks/useEmailVerification.ts +0 -39
  234. package/src/hooks/useExpiringValue.ts +0 -78
  235. package/src/hooks/useLocalStorage.ts +0 -18
  236. package/src/hooks/useUserSettings.ts +0 -216
  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 -422
  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 -35
  251. package/src/wrappers/BackupCodesWrapper.tsx +0 -28
  252. package/src/wrappers/ChangePasswordFormWrapper.tsx +0 -31
  253. package/src/wrappers/LoginFormWrapper.tsx +0 -59
  254. package/src/wrappers/LogoutPageWrapper.tsx +0 -30
  255. package/src/wrappers/RegisterFormWrapper.tsx +0 -48
  256. package/src/wrappers/UserSettingsFormWrapper.tsx +0 -39
  257. package/src/wrappers/VerifyEmailPageWrapper.tsx +0 -27
@@ -0,0 +1,244 @@
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 suite_core_lib_2 = require("@digitaldefiance/suite-core-lib");
8
+ const icons_material_1 = require("@mui/icons-material");
9
+ const react_1 = require("react");
10
+ const AuthProvider_1 = require("./AuthProvider");
11
+ const ThemeProvider_1 = require("./ThemeProvider");
12
+ const MenuType_1 = require("../types/MenuType");
13
+ const I18nProvider_1 = require("./I18nProvider");
14
+ const hooks_1 = require("../hooks");
15
+ const SuiteConfigProvider_1 = require("./SuiteConfigProvider");
16
+ const services_1 = require("../services");
17
+ const MenuContext = (0, react_1.createContext)(undefined);
18
+ const MenuProvider = ({ children, menuConfigs = [], enableBackupCodes = true }) => {
19
+ const { userData: user, isAuthenticated, mnemonic, clearMnemonic, wallet, clearWallet } = (0, AuthProvider_1.useAuth)();
20
+ const { mode: colorMode } = (0, ThemeProvider_1.useTheme)();
21
+ const registeredMenuOptions = (0, react_1.useRef)(new Set());
22
+ const [registeredOptions, setRegisteredOptions] = (0, react_1.useState)(new Map());
23
+ const { tComponent } = (0, I18nProvider_1.useI18n)();
24
+ const { baseUrl } = (0, SuiteConfigProvider_1.useSuiteConfig)();
25
+ const authenticatedApi = (0, react_1.useMemo)(() => (0, services_1.createAuthenticatedApiClient)(baseUrl), [baseUrl]);
26
+ const { toggleColorMode } = (0, hooks_1.useUserSettings)({ authenticatedApi, isAuthenticated });
27
+ const registerMenuOption = (0, react_1.useCallback)((option) => {
28
+ const unregister = () => {
29
+ setRegisteredOptions((prev) => {
30
+ const newMap = new Map(prev);
31
+ newMap.delete(option.id);
32
+ return newMap;
33
+ });
34
+ registeredMenuOptions.current.delete(unregister);
35
+ };
36
+ setRegisteredOptions((prev) => {
37
+ const newMap = new Map(prev);
38
+ newMap.set(option.id, option);
39
+ return newMap;
40
+ });
41
+ registeredMenuOptions.current.add(unregister);
42
+ return unregister;
43
+ }, []);
44
+ const registerMenuOptions = (0, react_1.useCallback)((options) => {
45
+ const unregisterFunctions = options.map(registerMenuOption);
46
+ return () => unregisterFunctions.forEach((f) => f());
47
+ }, [registerMenuOption]);
48
+ const menuOptions = (0, react_1.useMemo)(() => {
49
+ const isUserRestricted = () => {
50
+ return user?.roles?.some((role) => role.child) ?? false;
51
+ };
52
+ let index = 0;
53
+ const baseOptions = [
54
+ {
55
+ id: 'dashboard',
56
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_Dashboard),
57
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Dashboard, {}),
58
+ link: '/dashboard',
59
+ requiresAuth: true,
60
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
61
+ index: index++,
62
+ },
63
+ {
64
+ id: 'user-divider',
65
+ label: '',
66
+ divider: true,
67
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
68
+ index: index++,
69
+ requiresAuth: false,
70
+ },
71
+ {
72
+ id: 'logout',
73
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.LogoutButton),
74
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.ExitToApp, {}),
75
+ link: '/logout',
76
+ requiresAuth: true,
77
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
78
+ index: index++,
79
+ },
80
+ {
81
+ id: 'login',
82
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Login_LoginButton),
83
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Login, {}),
84
+ link: '/login',
85
+ requiresAuth: false,
86
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
87
+ index: index++,
88
+ },
89
+ {
90
+ id: 'register',
91
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.RegisterButton),
92
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.PersonAdd, {}),
93
+ link: '/register',
94
+ requiresAuth: false,
95
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
96
+ index: index++,
97
+ },
98
+ {
99
+ id: 'forgot-password',
100
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.ForgotPassword_Title),
101
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.LockOpen, {}),
102
+ link: '/forgot-password',
103
+ requiresAuth: false,
104
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
105
+ index: index++,
106
+ },
107
+ {
108
+ id: 'change-password',
109
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ChangePassword),
110
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.LockReset, {}),
111
+ link: '/change-password',
112
+ requiresAuth: true,
113
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
114
+ index: index++,
115
+ },
116
+ ...(enableBackupCodes ? [{
117
+ id: 'backup-code',
118
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.BackupCodeRecovery_Title),
119
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
120
+ link: '/backup-code',
121
+ requiresAuth: false,
122
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
123
+ index: index++,
124
+ },
125
+ {
126
+ id: 'backup-codes',
127
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.BackupCodeRecovery_GenerateNewCodes),
128
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Autorenew, {}),
129
+ link: '/backup-codes',
130
+ requiresAuth: true,
131
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
132
+ index: index++,
133
+ }] : []),
134
+ {
135
+ id: 'divider',
136
+ label: '',
137
+ divider: true,
138
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
139
+ index: index++,
140
+ requiresAuth: false,
141
+ },
142
+ {
143
+ id: 'clear-mnemonic',
144
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ClearMnemonic),
145
+ action: clearMnemonic,
146
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
147
+ requiresAuth: true,
148
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
149
+ index: index++,
150
+ filter: () => !!mnemonic,
151
+ },
152
+ {
153
+ id: 'clear-wallet',
154
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ClearWallet),
155
+ action: clearWallet,
156
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
157
+ requiresAuth: true,
158
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
159
+ index: index++,
160
+ filter: () => !!wallet,
161
+ },
162
+ ...(isUserRestricted() ? [] : []),
163
+ {
164
+ id: 'color-divider',
165
+ label: '',
166
+ divider: true,
167
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
168
+ index: index++,
169
+ requiresAuth: undefined,
170
+ },
171
+ {
172
+ id: 'theme-toggle',
173
+ label: colorMode === 'dark'
174
+ ? tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ThemeToggle_Light)
175
+ : tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ThemeToggle_Dark),
176
+ icon: colorMode === 'dark' ? (0, jsx_runtime_1.jsx)(icons_material_1.Brightness7, {}) : (0, jsx_runtime_1.jsx)(icons_material_1.Brightness4, {}),
177
+ includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
178
+ index: index++,
179
+ requiresAuth: undefined,
180
+ action: toggleColorMode,
181
+ },
182
+ {
183
+ id: 'user-settings',
184
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Settings_Title),
185
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Settings, {}),
186
+ link: '/user-settings',
187
+ requiresAuth: true,
188
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
189
+ index: index++,
190
+ }
191
+ ];
192
+ const allOptions = [...baseOptions, ...registeredOptions.values()];
193
+ return allOptions.sort((a, b) => a.index - b.index);
194
+ }, [tComponent, registeredOptions, user?.roles, colorMode, toggleColorMode, clearMnemonic, clearWallet, mnemonic, wallet]);
195
+ const getMenuOptions = (0, react_1.useCallback)((menuType, includeDividers) => {
196
+ const MenuFilter = (o) => {
197
+ // Apply the custom filter first
198
+ let customFilterPasses = true;
199
+ if (o.filter !== undefined) {
200
+ customFilterPasses = o.filter(o);
201
+ }
202
+ if (!customFilterPasses)
203
+ return false;
204
+ if (o.divider === true && !includeDividers)
205
+ return false;
206
+ return (o.includeOnMenus.includes(menuType) &&
207
+ (o.requiresAuth === undefined || o.requiresAuth === isAuthenticated));
208
+ };
209
+ return menuOptions.filter(MenuFilter);
210
+ }, [isAuthenticated, menuOptions]);
211
+ (0, react_1.useEffect)(() => {
212
+ if (menuConfigs.length > 0) {
213
+ return registerMenuOptions(menuConfigs.flatMap(config => config.options));
214
+ }
215
+ return undefined;
216
+ }, [menuConfigs, registerMenuOptions]);
217
+ const getTopMenus = (0, react_1.useCallback)(() => {
218
+ const menus = [
219
+ ...menuConfigs.map(config => ({ ...config, isUserMenu: false })),
220
+ { menuType: MenuType_1.MenuTypes.UserMenu, menuIcon: (0, jsx_runtime_1.jsx)(icons_material_1.AccountCircle, {}), priority: 0, options: [], isUserMenu: true }
221
+ ];
222
+ return menus.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
223
+ }, [menuConfigs]);
224
+ const contextValue = (0, react_1.useMemo)(() => {
225
+ return {
226
+ menuOptions: menuOptions,
227
+ getMenuOptions: getMenuOptions,
228
+ registerMenuOption: registerMenuOption,
229
+ registerMenuOptions: registerMenuOptions,
230
+ getTopMenus: getTopMenus,
231
+ };
232
+ }, [menuOptions, getMenuOptions, registerMenuOption, registerMenuOptions, getTopMenus]);
233
+ const memoizedChildren = (0, react_1.useMemo)(() => children, [children]);
234
+ return ((0, jsx_runtime_1.jsx)(MenuContext.Provider, { value: contextValue, children: memoizedChildren }));
235
+ };
236
+ exports.MenuProvider = MenuProvider;
237
+ const useMenu = () => {
238
+ const context = (0, react_1.useContext)(MenuContext);
239
+ if (context === undefined) {
240
+ throw new Error('useMenu must be used within a MenuProvider');
241
+ }
242
+ return context;
243
+ };
244
+ 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":"AAKA,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,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QACrE,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,oBA8DF,CAAC"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useBackupCodes = void 0;
4
+ const react_1 = require("react");
5
+ const services_1 = require("../services");
6
+ const contexts_1 = require("../contexts");
7
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
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 ? err : new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.BackupCodes_FailedToFetch));
26
+ setBackupCodesRemaining(0);
27
+ }
28
+ finally {
29
+ setIsLoading(false);
30
+ }
31
+ }, [api]);
32
+ (0, react_1.useEffect)(() => {
33
+ if (requestedOnMountRef.current)
34
+ return;
35
+ if (backupCodesRemaining !== null)
36
+ return;
37
+ requestedOnMountRef.current = true;
38
+ refreshCodeCount();
39
+ }, [backupCodesRemaining, refreshCodeCount]);
40
+ const generateBackupCodes = async (password, mnemonic) => {
41
+ setIsLoading(true);
42
+ setError(null);
43
+ try {
44
+ const result = await api.post('/user/backup-codes', {
45
+ ...(password ? { password } : {}),
46
+ ...(mnemonic ? { mnemonic } : {}),
47
+ });
48
+ return {
49
+ message: result.data.message,
50
+ backupCodes: result.data.backupCodes,
51
+ };
52
+ }
53
+ catch (err) {
54
+ const error = err instanceof Error ? err : new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.BackupCodes_FailedToGenerate);
55
+ setError(error);
56
+ throw error;
57
+ }
58
+ finally {
59
+ setIsLoading(false);
60
+ }
61
+ };
62
+ return {
63
+ backupCodesRemaining,
64
+ isLoading,
65
+ error,
66
+ generateBackupCodes,
67
+ refreshCodeCount,
68
+ };
69
+ };
70
+ 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":"AAKA,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED,eAAO,MAAM,oBAAoB,QAAO,0BA2BvC,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useEmailVerification = void 0;
4
+ const react_1 = require("react");
5
+ const services_1 = require("../services");
6
+ const contexts_1 = require("../contexts");
7
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
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', { token: verificationToken });
18
+ return { success: true, message: result.data.message };
19
+ }
20
+ catch (err) {
21
+ const errorMessage = err.response?.data?.message || (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Error_VerificationFailed);
22
+ const error = new Error(errorMessage);
23
+ setError(error);
24
+ return { success: false, message: errorMessage };
25
+ }
26
+ finally {
27
+ setIsVerifying(false);
28
+ }
29
+ };
30
+ return {
31
+ isVerifying,
32
+ error,
33
+ verifyEmail,
34
+ };
35
+ };
36
+ 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"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useExpiringValue = useExpiringValue;
4
+ const react_1 = require("react");
5
+ function useExpiringValue(defaultDurationSeconds, localStorageKey) {
6
+ const [value, _setValue] = (0, react_1.useState)(undefined);
7
+ const [timer, setTimer] = (0, react_1.useState)(undefined);
8
+ const [durationSeconds, _setDurationSeconds] = (0, react_1.useState)(() => {
9
+ if (localStorageKey) {
10
+ const stored = localStorage.getItem(localStorageKey);
11
+ return stored ? parseInt(stored, 10) : defaultDurationSeconds;
12
+ }
13
+ return defaultDurationSeconds;
14
+ });
15
+ const getRemainingTime = (0, react_1.useCallback)(() => {
16
+ if (!timer)
17
+ return 0;
18
+ const elapsed = Date.now() - timer.startTime;
19
+ const remaining = Math.max(0, timer.durationMs - elapsed);
20
+ return Math.ceil(remaining / 1000);
21
+ }, [timer]);
22
+ const setValue = (0, react_1.useCallback)((newValue, customDurationSeconds, saveToStorage) => {
23
+ const finalDurationSeconds = customDurationSeconds ?? durationSeconds;
24
+ if (saveToStorage && customDurationSeconds !== undefined && localStorageKey) {
25
+ _setDurationSeconds(customDurationSeconds);
26
+ localStorage.setItem(localStorageKey, customDurationSeconds.toString());
27
+ }
28
+ _setValue(newValue);
29
+ if (timer) {
30
+ clearTimeout(timer.timeout);
31
+ }
32
+ const startTime = Date.now();
33
+ const durationMs = finalDurationSeconds * 1000;
34
+ const timeout = setTimeout(() => {
35
+ _setValue(undefined);
36
+ setTimer(undefined);
37
+ }, durationMs);
38
+ setTimer({ timeout, startTime, durationMs });
39
+ return () => {
40
+ clearTimeout(timeout);
41
+ setTimer(undefined);
42
+ };
43
+ }, [durationSeconds, timer, localStorageKey]);
44
+ const clearValue = (0, react_1.useCallback)(() => {
45
+ if (timer) {
46
+ clearTimeout(timer.timeout);
47
+ setTimer(undefined);
48
+ }
49
+ _setValue(undefined);
50
+ }, [timer]);
51
+ const isActive = Boolean(timer && value !== undefined);
52
+ return { value, setValue, clearValue, getRemainingTime, isActive };
53
+ }
@@ -0,0 +1,2 @@
1
+ export declare function useLocalStorage<T>(key: string, defaultValue: T): [T, (value: T) => void];
2
+ //# sourceMappingURL=useLocalStorage.d.ts.map