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

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 (311) hide show
  1. package/package.json +5 -4
  2. package/src/auth/AdminRoute.d.ts +8 -0
  3. package/src/auth/AdminRoute.d.ts.map +1 -0
  4. package/src/auth/AdminRoute.js +28 -0
  5. package/src/auth/Private.d.ts +6 -0
  6. package/src/auth/Private.d.ts.map +1 -0
  7. package/src/auth/Private.js +14 -0
  8. package/src/auth/PrivateRoute.d.ts +8 -0
  9. package/src/auth/PrivateRoute.d.ts.map +1 -0
  10. package/src/auth/PrivateRoute.js +23 -0
  11. package/src/auth/UnAuth.d.ts +6 -0
  12. package/src/auth/UnAuth.d.ts.map +1 -0
  13. package/src/auth/UnAuth.js +14 -0
  14. package/src/auth/UnAuthRoute.d.ts +8 -0
  15. package/src/auth/UnAuthRoute.d.ts.map +1 -0
  16. package/src/auth/UnAuthRoute.js +22 -0
  17. package/src/auth/{index.ts → index.d.ts} +3 -2
  18. package/src/auth/index.d.ts.map +1 -0
  19. package/src/auth/index.js +12 -0
  20. package/src/components/ApiAccess.d.ts +16 -0
  21. package/src/components/ApiAccess.d.ts.map +1 -0
  22. package/src/components/ApiAccess.js +77 -0
  23. package/src/components/BackupCodeLoginForm.d.ts +43 -0
  24. package/src/components/BackupCodeLoginForm.d.ts.map +1 -0
  25. package/src/components/BackupCodeLoginForm.js +139 -0
  26. package/src/components/BackupCodesForm.d.ts +26 -0
  27. package/src/components/BackupCodesForm.d.ts.map +1 -0
  28. package/src/components/BackupCodesForm.js +120 -0
  29. package/src/components/CategoryMenu.d.ts +17 -0
  30. package/src/components/CategoryMenu.d.ts.map +1 -0
  31. package/src/components/CategoryMenu.js +65 -0
  32. package/src/components/ChangePasswordForm.d.ts +26 -0
  33. package/src/components/ChangePasswordForm.d.ts.map +1 -0
  34. package/src/components/ChangePasswordForm.js +78 -0
  35. package/src/components/ConfirmationDialog.d.ts +13 -0
  36. package/src/components/ConfirmationDialog.d.ts.map +1 -0
  37. package/src/components/ConfirmationDialog.js +10 -0
  38. package/src/components/CurrencyCodeSelector.d.ts +9 -0
  39. package/src/components/CurrencyCodeSelector.d.ts.map +1 -0
  40. package/src/components/CurrencyCodeSelector.js +31 -0
  41. package/src/components/CurrencyInput.d.ts +13 -0
  42. package/src/components/CurrencyInput.d.ts.map +1 -0
  43. package/src/components/CurrencyInput.js +22 -0
  44. package/src/components/DashboardPage.d.ts +8 -0
  45. package/src/components/DashboardPage.d.ts.map +1 -0
  46. package/src/components/DashboardPage.js +10 -0
  47. package/src/components/DropdownMenu.d.ts +13 -0
  48. package/src/components/DropdownMenu.d.ts.map +1 -0
  49. package/src/components/DropdownMenu.js +63 -0
  50. package/src/components/ExpirationSecondsSelector.d.ts +13 -0
  51. package/src/components/ExpirationSecondsSelector.d.ts.map +1 -0
  52. package/src/components/ExpirationSecondsSelector.js +32 -0
  53. package/src/components/FakeEmailAdminPanel.d.ts +23 -0
  54. package/src/components/FakeEmailAdminPanel.d.ts.map +1 -0
  55. package/src/components/FakeEmailAdminPanel.js +147 -0
  56. package/src/components/Flag.d.ts +20 -0
  57. package/src/components/Flag.d.ts.map +1 -0
  58. package/src/components/Flag.js +43 -0
  59. package/src/components/ForgotPasswordForm.d.ts +18 -0
  60. package/src/components/ForgotPasswordForm.d.ts.map +1 -0
  61. package/src/components/ForgotPasswordForm.js +61 -0
  62. package/src/components/LoginForm.d.ts +44 -0
  63. package/src/components/LoginForm.d.ts.map +1 -0
  64. package/src/components/LoginForm.js +123 -0
  65. package/src/components/LogoutPage.d.ts +8 -0
  66. package/src/components/LogoutPage.d.ts.map +1 -0
  67. package/src/components/LogoutPage.js +16 -0
  68. package/src/components/RegisterForm.d.ts +100 -0
  69. package/src/components/RegisterForm.d.ts.map +1 -0
  70. package/src/components/RegisterForm.js +306 -0
  71. package/src/components/ResetPasswordForm.d.ts +23 -0
  72. package/src/components/ResetPasswordForm.d.ts.map +1 -0
  73. package/src/components/ResetPasswordForm.js +78 -0
  74. package/src/components/SideMenu.d.ts +8 -0
  75. package/src/components/SideMenu.d.ts.map +1 -0
  76. package/src/components/SideMenu.js +25 -0
  77. package/src/components/SideMenuListItem.d.ts +13 -0
  78. package/src/components/SideMenuListItem.d.ts.map +1 -0
  79. package/src/components/SideMenuListItem.js +44 -0
  80. package/src/components/T.d.ts +7 -0
  81. package/src/components/T.d.ts.map +1 -0
  82. package/src/components/T.js +13 -0
  83. package/src/components/TDiv.d.ts +9 -0
  84. package/src/components/TDiv.d.ts.map +1 -0
  85. package/src/components/TDiv.js +14 -0
  86. package/src/components/TImgAlt.d.ts +10 -0
  87. package/src/components/TImgAlt.d.ts.map +1 -0
  88. package/src/components/TImgAlt.js +14 -0
  89. package/src/components/TopMenu.d.ts +50 -0
  90. package/src/components/TopMenu.d.ts.map +1 -0
  91. package/src/components/TopMenu.js +79 -0
  92. package/src/components/TotpSetupForm.d.ts +24 -0
  93. package/src/components/TotpSetupForm.d.ts.map +1 -0
  94. package/src/components/TotpSetupForm.js +82 -0
  95. package/src/components/TotpVerificationForm.d.ts +23 -0
  96. package/src/components/TotpVerificationForm.d.ts.map +1 -0
  97. package/src/components/TotpVerificationForm.js +66 -0
  98. package/src/components/TranslatedTitle.d.ts +8 -0
  99. package/src/components/TranslatedTitle.d.ts.map +1 -0
  100. package/src/components/TranslatedTitle.js +15 -0
  101. package/src/components/UserLanguageSelector.d.ts +4 -0
  102. package/src/components/UserLanguageSelector.d.ts.map +1 -0
  103. package/src/components/UserLanguageSelector.js +31 -0
  104. package/src/components/UserMenu.d.ts +4 -0
  105. package/src/components/UserMenu.d.ts.map +1 -0
  106. package/src/components/UserMenu.js +12 -0
  107. package/src/components/UserSettingsForm.d.ts +113 -0
  108. package/src/components/UserSettingsForm.d.ts.map +1 -0
  109. package/src/components/UserSettingsForm.js +269 -0
  110. package/src/components/VerifyEmailPage.d.ts +24 -0
  111. package/src/components/VerifyEmailPage.d.ts.map +1 -0
  112. package/src/components/VerifyEmailPage.js +81 -0
  113. package/src/components/{index.ts → index.d.ts} +1 -1
  114. package/src/components/index.d.ts.map +1 -0
  115. package/src/components/index.js +35 -0
  116. package/src/contexts/AuthProvider.d.ts +186 -0
  117. package/src/contexts/AuthProvider.d.ts.map +1 -0
  118. package/src/contexts/AuthProvider.js +515 -0
  119. package/src/contexts/I18nProvider.d.ts +27 -0
  120. package/src/contexts/I18nProvider.d.ts.map +1 -0
  121. package/src/contexts/I18nProvider.js +60 -0
  122. package/src/contexts/MenuContext.d.ts +28 -0
  123. package/src/contexts/MenuContext.d.ts.map +1 -0
  124. package/src/contexts/MenuContext.js +292 -0
  125. package/src/contexts/SuiteConfigProvider.d.ts +44 -0
  126. package/src/contexts/SuiteConfigProvider.d.ts.map +1 -0
  127. package/src/contexts/SuiteConfigProvider.js +43 -0
  128. package/src/contexts/ThemeProvider.d.ts +15 -0
  129. package/src/contexts/ThemeProvider.d.ts.map +1 -0
  130. package/src/contexts/ThemeProvider.js +36 -0
  131. package/src/contexts/{index.ts → index.d.ts} +1 -0
  132. package/src/contexts/index.d.ts.map +1 -0
  133. package/src/contexts/index.js +8 -0
  134. package/src/hooks/{index.ts → index.d.ts} +1 -0
  135. package/src/hooks/index.d.ts.map +1 -0
  136. package/src/hooks/index.js +9 -0
  137. package/src/hooks/useAuthenticatedApi.d.ts +34 -0
  138. package/src/hooks/useAuthenticatedApi.d.ts.map +1 -0
  139. package/src/hooks/useAuthenticatedApi.js +46 -0
  140. package/src/hooks/useBackupCodes.d.ts +15 -0
  141. package/src/hooks/useBackupCodes.d.ts.map +1 -0
  142. package/src/hooks/useBackupCodes.js +74 -0
  143. package/src/hooks/useEmailVerification.d.ts +10 -0
  144. package/src/hooks/useEmailVerification.d.ts.map +1 -0
  145. package/src/hooks/useEmailVerification.js +40 -0
  146. package/src/hooks/useExpiringValue.d.ts +14 -0
  147. package/src/hooks/useExpiringValue.d.ts.map +1 -0
  148. package/src/hooks/useExpiringValue.js +53 -0
  149. package/src/hooks/useLocalStorage.d.ts +2 -0
  150. package/src/hooks/useLocalStorage.d.ts.map +1 -0
  151. package/src/hooks/useLocalStorage.js +15 -0
  152. package/src/hooks/useUserSettings.d.ts +48 -0
  153. package/src/hooks/useUserSettings.d.ts.map +1 -0
  154. package/src/hooks/useUserSettings.js +171 -0
  155. package/src/{index.ts → index.d.ts} +1 -1
  156. package/src/index.d.ts.map +1 -0
  157. package/src/index.js +12 -0
  158. package/src/interfaces/IAppConfig.d.ts +8 -0
  159. package/src/interfaces/IAppConfig.d.ts.map +1 -0
  160. package/src/interfaces/IAppConfig.js +2 -0
  161. package/src/interfaces/ICategoryConfig.d.ts +41 -0
  162. package/src/interfaces/ICategoryConfig.d.ts.map +1 -0
  163. package/src/interfaces/ICategoryConfig.js +2 -0
  164. package/src/interfaces/IMenuConfig.d.ts +28 -0
  165. package/src/interfaces/IMenuConfig.d.ts.map +1 -0
  166. package/src/interfaces/IMenuConfig.js +2 -0
  167. package/src/interfaces/IMenuOption.d.ts +82 -0
  168. package/src/interfaces/IMenuOption.d.ts.map +1 -0
  169. package/src/interfaces/IMenuOption.js +2 -0
  170. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  171. package/src/interfaces/index.d.ts.map +1 -0
  172. package/src/interfaces/index.js +7 -0
  173. package/src/services/__mocks__/authService.d.ts +21 -0
  174. package/src/services/__mocks__/authService.d.ts.map +1 -0
  175. package/src/services/__mocks__/authService.js +15 -0
  176. package/src/services/api.d.ts +3 -0
  177. package/src/services/api.d.ts.map +1 -0
  178. package/src/services/api.js +14 -0
  179. package/src/services/authService.d.ts +126 -0
  180. package/src/services/authService.d.ts.map +1 -0
  181. package/src/services/authService.js +471 -0
  182. package/src/services/authenticatedApi.d.ts +3 -0
  183. package/src/services/authenticatedApi.d.ts.map +1 -0
  184. package/src/services/authenticatedApi.js +18 -0
  185. package/src/services/index.d.ts +4 -0
  186. package/src/services/index.d.ts.map +1 -0
  187. package/src/services/index.js +6 -0
  188. package/src/types/MenuType.d.ts +11 -0
  189. package/src/types/MenuType.d.ts.map +1 -0
  190. package/src/types/MenuType.js +12 -0
  191. package/src/types/expirationSeconds.d.ts +3 -0
  192. package/src/types/expirationSeconds.d.ts.map +1 -0
  193. package/src/types/expirationSeconds.js +17 -0
  194. package/src/types/index.d.ts +2 -0
  195. package/src/types/index.d.ts.map +1 -0
  196. package/src/types/index.js +4 -0
  197. package/src/types/translation.d.ts +10 -0
  198. package/src/types/translation.d.ts.map +1 -0
  199. package/src/types/translation.js +9 -0
  200. package/src/wrappers/BackupCodeLoginWrapper.d.ts +8 -0
  201. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +1 -0
  202. package/src/wrappers/BackupCodeLoginWrapper.js +20 -0
  203. package/src/wrappers/BackupCodesWrapper.d.ts +7 -0
  204. package/src/wrappers/BackupCodesWrapper.d.ts.map +1 -0
  205. package/src/wrappers/BackupCodesWrapper.js +17 -0
  206. package/src/wrappers/ChangePasswordFormWrapper.d.ts +8 -0
  207. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +1 -0
  208. package/src/wrappers/ChangePasswordFormWrapper.js +21 -0
  209. package/src/wrappers/ForgotPasswordFormWrapper.d.ts +8 -0
  210. package/src/wrappers/ForgotPasswordFormWrapper.d.ts.map +1 -0
  211. package/src/wrappers/ForgotPasswordFormWrapper.js +29 -0
  212. package/src/wrappers/LoginFormWrapper.d.ts +21 -0
  213. package/src/wrappers/LoginFormWrapper.d.ts.map +1 -0
  214. package/src/wrappers/LoginFormWrapper.js +72 -0
  215. package/src/wrappers/LogoutPageWrapper.d.ts +9 -0
  216. package/src/wrappers/LogoutPageWrapper.d.ts.map +1 -0
  217. package/src/wrappers/LogoutPageWrapper.js +21 -0
  218. package/src/wrappers/RegisterFormWrapper.d.ts +20 -0
  219. package/src/wrappers/RegisterFormWrapper.d.ts.map +1 -0
  220. package/src/wrappers/RegisterFormWrapper.js +51 -0
  221. package/src/wrappers/ResetPasswordFormWrapper.d.ts +9 -0
  222. package/src/wrappers/ResetPasswordFormWrapper.d.ts.map +1 -0
  223. package/src/wrappers/ResetPasswordFormWrapper.js +34 -0
  224. package/src/wrappers/UserSettingsFormWrapper.d.ts +29 -0
  225. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +1 -0
  226. package/src/wrappers/UserSettingsFormWrapper.js +95 -0
  227. package/src/wrappers/VerifyEmailPageWrapper.d.ts +8 -0
  228. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +1 -0
  229. package/src/wrappers/VerifyEmailPageWrapper.js +21 -0
  230. package/src/wrappers/{index.tsx → index.d.ts} +1 -10
  231. package/src/wrappers/index.d.ts.map +1 -0
  232. package/src/wrappers/index.js +24 -0
  233. package/LICENSE +0 -21
  234. package/src/auth/AdminRoute.tsx +0 -54
  235. package/src/auth/Private.tsx +0 -17
  236. package/src/auth/PrivateRoute.tsx +0 -28
  237. package/src/auth/UnAuth.tsx +0 -16
  238. package/src/auth/UnAuthRoute.tsx +0 -30
  239. package/src/components/ApiAccess.tsx +0 -175
  240. package/src/components/BackupCodeLoginForm.tsx +0 -489
  241. package/src/components/BackupCodesForm.tsx +0 -287
  242. package/src/components/CategoryMenu.tsx +0 -155
  243. package/src/components/ChangePasswordForm.tsx +0 -273
  244. package/src/components/ConfirmationDialog.tsx +0 -48
  245. package/src/components/CurrencyCodeSelector.tsx +0 -60
  246. package/src/components/CurrencyInput.tsx +0 -80
  247. package/src/components/DashboardPage.tsx +0 -24
  248. package/src/components/DropdownMenu.tsx +0 -105
  249. package/src/components/ExpirationSecondsSelector.tsx +0 -60
  250. package/src/components/FakeEmailAdminPanel.tsx +0 -374
  251. package/src/components/Flag.tsx +0 -52
  252. package/src/components/ForgotPasswordForm.tsx +0 -174
  253. package/src/components/LoginForm.tsx +0 -468
  254. package/src/components/LogoutPage.tsx +0 -21
  255. package/src/components/RegisterForm.tsx +0 -1169
  256. package/src/components/ResetPasswordForm.tsx +0 -247
  257. package/src/components/SideMenu.tsx +0 -46
  258. package/src/components/SideMenuListItem.tsx +0 -75
  259. package/src/components/T.tsx +0 -24
  260. package/src/components/TDiv.tsx +0 -26
  261. package/src/components/TImgAlt.tsx +0 -28
  262. package/src/components/TopMenu.tsx +0 -252
  263. package/src/components/TotpSetupForm.tsx +0 -188
  264. package/src/components/TotpVerificationForm.tsx +0 -148
  265. package/src/components/TranslatedTitle.tsx +0 -31
  266. package/src/components/UserLanguageSelector.tsx +0 -45
  267. package/src/components/UserMenu.tsx +0 -15
  268. package/src/components/UserSettingsForm.tsx +0 -904
  269. package/src/components/VerifyEmailPage.tsx +0 -222
  270. package/src/components/__tests__/RegisterForm.totp.spec.tsx +0 -377
  271. package/src/components/__tests__/TotpSetupForm.spec.tsx +0 -258
  272. package/src/components/__tests__/TotpVerificationForm.spec.tsx +0 -259
  273. package/src/components/__tests__/UserSettingsForm.totp.spec.tsx +0 -396
  274. package/src/contexts/AuthProvider.spec.tsx +0 -1284
  275. package/src/contexts/AuthProvider.tsx +0 -977
  276. package/src/contexts/I18nProvider.tsx +0 -164
  277. package/src/contexts/MenuContext.tsx +0 -426
  278. package/src/contexts/SuiteConfigProvider.tsx +0 -93
  279. package/src/contexts/ThemeProvider.tsx +0 -67
  280. package/src/hooks/useAuthenticatedApi.tsx +0 -67
  281. package/src/hooks/useBackupCodes.ts +0 -105
  282. package/src/hooks/useEmailVerification.ts +0 -54
  283. package/src/hooks/useExpiringValue.ts +0 -78
  284. package/src/hooks/useLocalStorage.ts +0 -18
  285. package/src/hooks/useUserSettings.ts +0 -271
  286. package/src/interfaces/IAppConfig.ts +0 -7
  287. package/src/interfaces/ICategoryConfig.ts +0 -41
  288. package/src/interfaces/IMenuConfig.ts +0 -28
  289. package/src/interfaces/IMenuOption.ts +0 -79
  290. package/src/services/__mocks__/authService.ts +0 -14
  291. package/src/services/__tests__/authService.totp.property.spec.ts +0 -360
  292. package/src/services/__tests__/authService.totp.spec.ts +0 -439
  293. package/src/services/api.ts +0 -13
  294. package/src/services/authService.ts +0 -692
  295. package/src/services/authenticatedApi.ts +0 -17
  296. package/src/services/index.ts +0 -3
  297. package/src/types/MenuType.ts +0 -15
  298. package/src/types/expirationSeconds.ts +0 -18
  299. package/src/types/index.ts +0 -1
  300. package/src/types/translation.ts +0 -20
  301. package/src/wrappers/BackupCodeLoginWrapper.tsx +0 -34
  302. package/src/wrappers/BackupCodesWrapper.tsx +0 -28
  303. package/src/wrappers/ChangePasswordFormWrapper.tsx +0 -34
  304. package/src/wrappers/ForgotPasswordFormWrapper.tsx +0 -45
  305. package/src/wrappers/LoginFormWrapper.tsx +0 -108
  306. package/src/wrappers/LogoutPageWrapper.tsx +0 -30
  307. package/src/wrappers/RegisterFormWrapper.tsx +0 -109
  308. package/src/wrappers/ResetPasswordFormWrapper.tsx +0 -57
  309. package/src/wrappers/UserSettingsFormWrapper.tsx +0 -140
  310. package/src/wrappers/VerifyEmailPageWrapper.tsx +0 -27
  311. package/src/wrappers/__tests__/LoginFormWrapper.totp.spec.tsx +0 -339
@@ -0,0 +1,292 @@
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, hiddenMenuIds = [], }) => {
18
+ const { userData: user, isAuthenticated, admin: isGlobalAdmin, 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 hidden = new Set(hiddenMenuIds);
214
+ const MenuFilter = (o) => {
215
+ // Suppress any option whose id the consumer asked to hide.
216
+ if (hidden.has(o.id))
217
+ return false;
218
+ // Apply the custom filter first
219
+ let customFilterPasses = true;
220
+ if (o.filter !== undefined) {
221
+ customFilterPasses = o.filter(o);
222
+ }
223
+ if (!customFilterPasses)
224
+ return false;
225
+ if (o.divider === true && !includeDividers)
226
+ return false;
227
+ if (o.requiresAdmin === true && !isGlobalAdmin)
228
+ return false;
229
+ return (o.includeOnMenus.includes(menuType) &&
230
+ (o.requiresAuth === undefined || o.requiresAuth === isAuthenticated));
231
+ };
232
+ const filtered = menuOptions.filter(MenuFilter);
233
+ // Drop dividers left orphaned once hidden items are removed: a divider at
234
+ // the start or end of the list, or immediately following another divider,
235
+ // carries no meaning and would show as a stray separator.
236
+ return filtered.filter((o, i) => {
237
+ if (o.divider !== true)
238
+ return true;
239
+ const prev = filtered[i - 1];
240
+ if (prev === undefined || prev.divider === true)
241
+ return false;
242
+ if (i === filtered.length - 1)
243
+ return false;
244
+ return true;
245
+ });
246
+ }, [hiddenMenuIds, isAuthenticated, isGlobalAdmin, menuOptions]);
247
+ (0, react_1.useEffect)(() => {
248
+ if (menuConfigs.length > 0) {
249
+ return registerMenuOptions(menuConfigs.flatMap((config) => config.options));
250
+ }
251
+ return undefined;
252
+ }, [menuConfigs, registerMenuOptions]);
253
+ const getTopMenus = (0, react_1.useCallback)(() => {
254
+ const menus = [
255
+ ...menuConfigs.map((config) => ({ ...config, isUserMenu: false })),
256
+ {
257
+ menuType: MenuType_1.MenuTypes.UserMenu,
258
+ menuIcon: (0, jsx_runtime_1.jsx)(icons_material_1.AccountCircle, {}),
259
+ priority: 0,
260
+ options: [],
261
+ isUserMenu: true,
262
+ },
263
+ ];
264
+ return menus.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
265
+ }, [menuConfigs]);
266
+ const contextValue = (0, react_1.useMemo)(() => {
267
+ return {
268
+ menuOptions: menuOptions,
269
+ getMenuOptions: getMenuOptions,
270
+ registerMenuOption: registerMenuOption,
271
+ registerMenuOptions: registerMenuOptions,
272
+ getTopMenus: getTopMenus,
273
+ };
274
+ }, [
275
+ menuOptions,
276
+ getMenuOptions,
277
+ registerMenuOption,
278
+ registerMenuOptions,
279
+ getTopMenus,
280
+ ]);
281
+ const memoizedChildren = (0, react_1.useMemo)(() => children, [children]);
282
+ return ((0, jsx_runtime_1.jsx)(MenuContext.Provider, { value: contextValue, children: memoizedChildren }));
283
+ };
284
+ exports.MenuProvider = MenuProvider;
285
+ const useMenu = () => {
286
+ const context = (0, react_1.useContext)(MenuContext);
287
+ if (context === undefined) {
288
+ throw new Error('useMenu must be used within a MenuProvider');
289
+ }
290
+ return context;
291
+ };
292
+ 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.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,gCAa1B,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);
@@ -4,3 +4,4 @@ export * from './useBackupCodes';
4
4
  export * from './useUserSettings';
5
5
  export * from './useEmailVerification';
6
6
  export * from './useAuthenticatedApi';
7
+ //# 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;AACvC,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,9 @@
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);
9
+ tslib_1.__exportStar(require("./useAuthenticatedApi"), exports);
@@ -0,0 +1,34 @@
1
+ /**
2
+ * useAuthenticatedApi — React hook + provider for a shared authenticated
3
+ * Axios instance.
4
+ *
5
+ * The provider creates a single AxiosInstance via createAuthenticatedApiClient
6
+ * using the baseUrl from SuiteConfigProvider. All component libraries consume
7
+ * the same instance through the useAuthenticatedApi() hook, eliminating
8
+ * duplicate axios instances and circular dependency issues.
9
+ *
10
+ * Usage:
11
+ * // In the app root (wrap inside SuiteConfigProvider):
12
+ * <AuthenticatedApiProvider>
13
+ * <App />
14
+ * </AuthenticatedApiProvider>
15
+ *
16
+ * // In any component library:
17
+ * const api = useAuthenticatedApi();
18
+ * const res = await api.get('/some-endpoint');
19
+ */
20
+ import { ReactNode } from 'react';
21
+ import type { AxiosInstance } from 'axios';
22
+ export interface AuthenticatedApiProviderProps {
23
+ children: ReactNode;
24
+ /** Optional token key in localStorage. Defaults to 'authToken'. */
25
+ tokenKey?: string;
26
+ }
27
+ export declare const AuthenticatedApiProvider: ({ children, tokenKey, }: AuthenticatedApiProviderProps) => import("react").JSX.Element;
28
+ /**
29
+ * Returns the shared authenticated Axios instance.
30
+ * Must be used within an AuthenticatedApiProvider (which itself must be
31
+ * inside a SuiteConfigProvider).
32
+ */
33
+ export declare const useAuthenticatedApi: () => AxiosInstance;
34
+ //# sourceMappingURL=useAuthenticatedApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthenticatedApi.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/useAuthenticatedApi.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAiB,SAAS,EAAuB,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQ3C,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,EAAE,SAAS,CAAC;IACpB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,wBAAwB,GAAI,yBAGtC,6BAA6B,gCAa/B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,QAAO,aAQtC,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useAuthenticatedApi = exports.AuthenticatedApiProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * useAuthenticatedApi — React hook + provider for a shared authenticated
7
+ * Axios instance.
8
+ *
9
+ * The provider creates a single AxiosInstance via createAuthenticatedApiClient
10
+ * using the baseUrl from SuiteConfigProvider. All component libraries consume
11
+ * the same instance through the useAuthenticatedApi() hook, eliminating
12
+ * duplicate axios instances and circular dependency issues.
13
+ *
14
+ * Usage:
15
+ * // In the app root (wrap inside SuiteConfigProvider):
16
+ * <AuthenticatedApiProvider>
17
+ * <App />
18
+ * </AuthenticatedApiProvider>
19
+ *
20
+ * // In any component library:
21
+ * const api = useAuthenticatedApi();
22
+ * const res = await api.get('/some-endpoint');
23
+ */
24
+ const react_1 = require("react");
25
+ const authenticatedApi_1 = require("../services/authenticatedApi");
26
+ const SuiteConfigProvider_1 = require("../contexts/SuiteConfigProvider");
27
+ const AuthenticatedApiContext = (0, react_1.createContext)(undefined);
28
+ const AuthenticatedApiProvider = ({ children, tokenKey, }) => {
29
+ const { baseUrl } = (0, SuiteConfigProvider_1.useSuiteConfig)();
30
+ const api = (0, react_1.useMemo)(() => (0, authenticatedApi_1.createAuthenticatedApiClient)(baseUrl, tokenKey), [baseUrl, tokenKey]);
31
+ return ((0, jsx_runtime_1.jsx)(AuthenticatedApiContext.Provider, { value: api, children: children }));
32
+ };
33
+ exports.AuthenticatedApiProvider = AuthenticatedApiProvider;
34
+ /**
35
+ * Returns the shared authenticated Axios instance.
36
+ * Must be used within an AuthenticatedApiProvider (which itself must be
37
+ * inside a SuiteConfigProvider).
38
+ */
39
+ const useAuthenticatedApi = () => {
40
+ const context = (0, react_1.useContext)(AuthenticatedApiContext);
41
+ if (!context) {
42
+ throw new Error('useAuthenticatedApi must be used within an AuthenticatedApiProvider');
43
+ }
44
+ return context;
45
+ };
46
+ exports.useAuthenticatedApi = useAuthenticatedApi;
@@ -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;