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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/package.json +5 -4
  2. package/src/auth/Private.d.ts +6 -0
  3. package/src/auth/Private.d.ts.map +1 -0
  4. package/src/auth/Private.js +14 -0
  5. package/src/auth/PrivateRoute.d.ts +8 -0
  6. package/src/auth/PrivateRoute.d.ts.map +1 -0
  7. package/src/auth/PrivateRoute.js +23 -0
  8. package/src/auth/UnAuth.d.ts +6 -0
  9. package/src/auth/UnAuth.d.ts.map +1 -0
  10. package/src/auth/UnAuth.js +14 -0
  11. package/src/auth/UnAuthRoute.d.ts +8 -0
  12. package/src/auth/UnAuthRoute.d.ts.map +1 -0
  13. package/src/auth/UnAuthRoute.js +22 -0
  14. package/src/auth/{index.ts → index.d.ts} +2 -1
  15. package/src/auth/index.d.ts.map +1 -0
  16. package/src/auth/index.js +10 -0
  17. package/src/components/ApiAccess.d.ts +16 -0
  18. package/src/components/ApiAccess.d.ts.map +1 -0
  19. package/src/components/ApiAccess.js +77 -0
  20. package/src/components/BackupCodeLoginForm.d.ts +43 -0
  21. package/src/components/BackupCodeLoginForm.d.ts.map +1 -0
  22. package/src/components/BackupCodeLoginForm.js +139 -0
  23. package/src/components/BackupCodesForm.d.ts +26 -0
  24. package/src/components/BackupCodesForm.d.ts.map +1 -0
  25. package/src/components/BackupCodesForm.js +120 -0
  26. package/src/components/ChangePasswordForm.d.ts +26 -0
  27. package/src/components/ChangePasswordForm.d.ts.map +1 -0
  28. package/src/components/ChangePasswordForm.js +78 -0
  29. package/src/components/ConfirmationDialog.d.ts +13 -0
  30. package/src/components/ConfirmationDialog.d.ts.map +1 -0
  31. package/src/components/ConfirmationDialog.js +10 -0
  32. package/src/components/CurrencyCodeSelector.d.ts +9 -0
  33. package/src/components/CurrencyCodeSelector.d.ts.map +1 -0
  34. package/src/components/CurrencyCodeSelector.js +31 -0
  35. package/src/components/CurrencyInput.d.ts +13 -0
  36. package/src/components/CurrencyInput.d.ts.map +1 -0
  37. package/src/components/CurrencyInput.js +22 -0
  38. package/src/components/DashboardPage.d.ts +8 -0
  39. package/src/components/DashboardPage.d.ts.map +1 -0
  40. package/src/components/DashboardPage.js +10 -0
  41. package/src/components/DropdownMenu.d.ts +9 -0
  42. package/src/components/DropdownMenu.d.ts.map +1 -0
  43. package/src/components/DropdownMenu.js +56 -0
  44. package/src/components/ExpirationSecondsSelector.d.ts +13 -0
  45. package/src/components/ExpirationSecondsSelector.d.ts.map +1 -0
  46. package/src/components/ExpirationSecondsSelector.js +32 -0
  47. package/src/components/Flag.d.ts +20 -0
  48. package/src/components/Flag.d.ts.map +1 -0
  49. package/src/components/Flag.js +43 -0
  50. package/src/components/ForgotPasswordForm.d.ts +18 -0
  51. package/src/components/ForgotPasswordForm.d.ts.map +1 -0
  52. package/src/components/ForgotPasswordForm.js +61 -0
  53. package/src/components/LoginForm.d.ts +44 -0
  54. package/src/components/LoginForm.d.ts.map +1 -0
  55. package/src/components/LoginForm.js +122 -0
  56. package/src/components/LogoutPage.d.ts +8 -0
  57. package/src/components/LogoutPage.d.ts.map +1 -0
  58. package/src/components/LogoutPage.js +16 -0
  59. package/src/components/RegisterForm.d.ts +56 -0
  60. package/src/components/RegisterForm.d.ts.map +1 -0
  61. package/src/components/RegisterForm.js +140 -0
  62. package/src/components/ResetPasswordForm.d.ts +23 -0
  63. package/src/components/ResetPasswordForm.d.ts.map +1 -0
  64. package/src/components/ResetPasswordForm.js +78 -0
  65. package/src/components/SideMenu.d.ts +8 -0
  66. package/src/components/SideMenu.d.ts.map +1 -0
  67. package/src/components/SideMenu.js +25 -0
  68. package/src/components/SideMenuListItem.d.ts +13 -0
  69. package/src/components/SideMenuListItem.d.ts.map +1 -0
  70. package/src/components/SideMenuListItem.js +44 -0
  71. package/src/components/TopMenu.d.ts +24 -0
  72. package/src/components/TopMenu.d.ts.map +1 -0
  73. package/src/components/TopMenu.js +35 -0
  74. package/src/components/TranslatedTitle.d.ts +7 -0
  75. package/src/components/TranslatedTitle.d.ts.map +1 -0
  76. package/src/components/TranslatedTitle.js +15 -0
  77. package/src/components/UserLanguageSelector.d.ts +4 -0
  78. package/src/components/UserLanguageSelector.d.ts.map +1 -0
  79. package/src/components/UserLanguageSelector.js +31 -0
  80. package/src/components/UserMenu.d.ts +4 -0
  81. package/src/components/UserMenu.d.ts.map +1 -0
  82. package/src/components/UserMenu.js +12 -0
  83. package/src/components/UserSettingsForm.d.ts +57 -0
  84. package/src/components/UserSettingsForm.d.ts.map +1 -0
  85. package/src/components/UserSettingsForm.js +126 -0
  86. package/src/components/VerifyEmailPage.d.ts +23 -0
  87. package/src/components/VerifyEmailPage.d.ts.map +1 -0
  88. package/src/components/VerifyEmailPage.js +70 -0
  89. package/src/components/{index.ts → index.d.ts} +1 -1
  90. package/src/components/index.d.ts.map +1 -0
  91. package/src/components/index.js +28 -0
  92. package/src/contexts/AuthProvider.d.ts +152 -0
  93. package/src/contexts/AuthProvider.d.ts.map +1 -0
  94. package/src/contexts/AuthProvider.js +502 -0
  95. package/src/contexts/I18nProvider.d.ts +16 -0
  96. package/src/contexts/I18nProvider.d.ts.map +1 -0
  97. package/src/contexts/I18nProvider.js +46 -0
  98. package/src/contexts/MenuContext.d.ts +20 -0
  99. package/src/contexts/MenuContext.d.ts.map +1 -0
  100. package/src/contexts/MenuContext.js +273 -0
  101. package/src/contexts/SuiteConfigProvider.d.ts +44 -0
  102. package/src/contexts/SuiteConfigProvider.d.ts.map +1 -0
  103. package/src/contexts/SuiteConfigProvider.js +43 -0
  104. package/src/contexts/ThemeProvider.d.ts +15 -0
  105. package/src/contexts/ThemeProvider.d.ts.map +1 -0
  106. package/src/contexts/ThemeProvider.js +36 -0
  107. package/src/contexts/{index.ts → index.d.ts} +1 -0
  108. package/src/contexts/index.d.ts.map +1 -0
  109. package/src/contexts/index.js +8 -0
  110. package/src/hooks/{index.ts → index.d.ts} +1 -0
  111. package/src/hooks/index.d.ts.map +1 -0
  112. package/src/hooks/index.js +8 -0
  113. package/src/hooks/useBackupCodes.d.ts +15 -0
  114. package/src/hooks/useBackupCodes.d.ts.map +1 -0
  115. package/src/hooks/useBackupCodes.js +74 -0
  116. package/src/hooks/useEmailVerification.d.ts +10 -0
  117. package/src/hooks/useEmailVerification.d.ts.map +1 -0
  118. package/src/hooks/useEmailVerification.js +40 -0
  119. package/src/hooks/useExpiringValue.d.ts +14 -0
  120. package/src/hooks/useExpiringValue.d.ts.map +1 -0
  121. package/src/hooks/useExpiringValue.js +53 -0
  122. package/src/hooks/useLocalStorage.d.ts +2 -0
  123. package/src/hooks/useLocalStorage.d.ts.map +1 -0
  124. package/src/hooks/useLocalStorage.js +15 -0
  125. package/src/hooks/useUserSettings.d.ts +48 -0
  126. package/src/hooks/useUserSettings.d.ts.map +1 -0
  127. package/src/hooks/useUserSettings.js +169 -0
  128. package/src/{index.ts → index.d.ts} +1 -1
  129. package/src/index.d.ts.map +1 -0
  130. package/src/index.js +12 -0
  131. package/src/interfaces/IAppConfig.d.ts +6 -0
  132. package/src/interfaces/IAppConfig.d.ts.map +1 -0
  133. package/src/interfaces/IAppConfig.js +2 -0
  134. package/src/interfaces/IMenuConfig.d.ts +11 -0
  135. package/src/interfaces/IMenuConfig.d.ts.map +1 -0
  136. package/src/interfaces/IMenuConfig.js +2 -0
  137. package/src/interfaces/IMenuOption.d.ts +58 -0
  138. package/src/interfaces/IMenuOption.d.ts.map +1 -0
  139. package/src/interfaces/IMenuOption.js +2 -0
  140. package/src/interfaces/index.d.ts +4 -0
  141. package/src/interfaces/index.d.ts.map +1 -0
  142. package/src/interfaces/index.js +6 -0
  143. package/src/services/__mocks__/authService.d.ts +21 -0
  144. package/src/services/__mocks__/authService.d.ts.map +1 -0
  145. package/src/services/__mocks__/authService.js +15 -0
  146. package/src/services/api.d.ts +3 -0
  147. package/src/services/api.d.ts.map +1 -0
  148. package/src/services/api.js +14 -0
  149. package/src/services/authService.d.ts +72 -0
  150. package/src/services/authService.d.ts.map +1 -0
  151. package/src/services/authService.js +335 -0
  152. package/src/services/authenticatedApi.d.ts +3 -0
  153. package/src/services/authenticatedApi.d.ts.map +1 -0
  154. package/src/services/authenticatedApi.js +18 -0
  155. package/src/services/index.d.ts +4 -0
  156. package/src/services/index.d.ts.map +1 -0
  157. package/src/services/index.js +6 -0
  158. package/src/types/MenuType.d.ts +11 -0
  159. package/src/types/MenuType.d.ts.map +1 -0
  160. package/src/types/MenuType.js +12 -0
  161. package/src/types/expirationSeconds.d.ts +3 -0
  162. package/src/types/expirationSeconds.d.ts.map +1 -0
  163. package/src/types/expirationSeconds.js +17 -0
  164. package/src/types/index.d.ts +2 -0
  165. package/src/types/index.d.ts.map +1 -0
  166. package/src/types/index.js +4 -0
  167. package/src/types/translation.d.ts +10 -0
  168. package/src/types/translation.d.ts.map +1 -0
  169. package/src/types/translation.js +9 -0
  170. package/src/wrappers/BackupCodeLoginWrapper.d.ts +8 -0
  171. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +1 -0
  172. package/src/wrappers/BackupCodeLoginWrapper.js +20 -0
  173. package/src/wrappers/BackupCodesWrapper.d.ts +7 -0
  174. package/src/wrappers/BackupCodesWrapper.d.ts.map +1 -0
  175. package/src/wrappers/BackupCodesWrapper.js +17 -0
  176. package/src/wrappers/ChangePasswordFormWrapper.d.ts +8 -0
  177. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +1 -0
  178. package/src/wrappers/ChangePasswordFormWrapper.js +21 -0
  179. package/src/wrappers/LoginFormWrapper.d.ts +9 -0
  180. package/src/wrappers/LoginFormWrapper.d.ts.map +1 -0
  181. package/src/wrappers/LoginFormWrapper.js +43 -0
  182. package/src/wrappers/LogoutPageWrapper.d.ts +9 -0
  183. package/src/wrappers/LogoutPageWrapper.d.ts.map +1 -0
  184. package/src/wrappers/LogoutPageWrapper.js +21 -0
  185. package/src/wrappers/RegisterFormWrapper.d.ts +9 -0
  186. package/src/wrappers/RegisterFormWrapper.d.ts.map +1 -0
  187. package/src/wrappers/RegisterFormWrapper.js +31 -0
  188. package/src/wrappers/UserSettingsFormWrapper.d.ts +8 -0
  189. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +1 -0
  190. package/src/wrappers/UserSettingsFormWrapper.js +24 -0
  191. package/src/wrappers/VerifyEmailPageWrapper.d.ts +8 -0
  192. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +1 -0
  193. package/src/wrappers/VerifyEmailPageWrapper.js +20 -0
  194. package/src/wrappers/{index.tsx → index.d.ts} +1 -8
  195. package/src/wrappers/index.d.ts.map +1 -0
  196. package/src/wrappers/index.js +20 -0
  197. package/LICENSE +0 -21
  198. package/src/auth/Private.tsx +0 -17
  199. package/src/auth/PrivateRoute.tsx +0 -28
  200. package/src/auth/UnAuth.tsx +0 -16
  201. package/src/auth/UnAuthRoute.tsx +0 -30
  202. package/src/components/ApiAccess.tsx +0 -174
  203. package/src/components/BackupCodeLoginForm.tsx +0 -488
  204. package/src/components/BackupCodesForm.tsx +0 -286
  205. package/src/components/ChangePasswordForm.tsx +0 -272
  206. package/src/components/ConfirmationDialog.tsx +0 -48
  207. package/src/components/CurrencyCodeSelector.tsx +0 -60
  208. package/src/components/CurrencyInput.tsx +0 -80
  209. package/src/components/DashboardPage.tsx +0 -24
  210. package/src/components/DropdownMenu.tsx +0 -92
  211. package/src/components/ExpirationSecondsSelector.tsx +0 -60
  212. package/src/components/Flag.tsx +0 -52
  213. package/src/components/ForgotPasswordForm.tsx +0 -173
  214. package/src/components/LoginForm.tsx +0 -455
  215. package/src/components/LogoutPage.tsx +0 -21
  216. package/src/components/RegisterForm.tsx +0 -602
  217. package/src/components/ResetPasswordForm.tsx +0 -246
  218. package/src/components/SideMenu.tsx +0 -46
  219. package/src/components/SideMenuListItem.tsx +0 -74
  220. package/src/components/TopMenu.tsx +0 -145
  221. package/src/components/TranslatedTitle.tsx +0 -29
  222. package/src/components/UserLanguageSelector.tsx +0 -45
  223. package/src/components/UserMenu.tsx +0 -15
  224. package/src/components/UserSettingsForm.tsx +0 -505
  225. package/src/components/VerifyEmailPage.tsx +0 -184
  226. package/src/contexts/AuthProvider.spec.tsx +0 -1195
  227. package/src/contexts/AuthProvider.tsx +0 -924
  228. package/src/contexts/I18nProvider.tsx +0 -114
  229. package/src/contexts/MenuContext.tsx +0 -398
  230. package/src/contexts/SuiteConfigProvider.tsx +0 -93
  231. package/src/contexts/ThemeProvider.tsx +0 -67
  232. package/src/hooks/useBackupCodes.ts +0 -105
  233. package/src/hooks/useEmailVerification.ts +0 -49
  234. package/src/hooks/useExpiringValue.ts +0 -78
  235. package/src/hooks/useLocalStorage.ts +0 -18
  236. package/src/hooks/useUserSettings.ts +0 -269
  237. package/src/interfaces/IAppConfig.ts +0 -5
  238. package/src/interfaces/IMenuConfig.ts +0 -11
  239. package/src/interfaces/IMenuOption.ts +0 -55
  240. package/src/interfaces/index.ts +0 -3
  241. package/src/services/__mocks__/authService.ts +0 -14
  242. package/src/services/api.ts +0 -13
  243. package/src/services/authService.ts +0 -500
  244. package/src/services/authenticatedApi.ts +0 -17
  245. package/src/services/index.ts +0 -3
  246. package/src/types/MenuType.ts +0 -15
  247. package/src/types/expirationSeconds.ts +0 -18
  248. package/src/types/index.ts +0 -1
  249. package/src/types/translation.ts +0 -20
  250. package/src/wrappers/BackupCodeLoginWrapper.tsx +0 -34
  251. package/src/wrappers/BackupCodesWrapper.tsx +0 -28
  252. package/src/wrappers/ChangePasswordFormWrapper.tsx +0 -34
  253. package/src/wrappers/LoginFormWrapper.tsx +0 -59
  254. package/src/wrappers/LogoutPageWrapper.tsx +0 -30
  255. package/src/wrappers/RegisterFormWrapper.tsx +0 -61
  256. package/src/wrappers/UserSettingsFormWrapper.tsx +0 -39
  257. package/src/wrappers/VerifyEmailPageWrapper.tsx +0 -27
@@ -1,114 +0,0 @@
1
- import {
2
- GlobalActiveContext,
3
- I18nEngine,
4
- IActiveContext,
5
- LanguageRegistry,
6
- } from '@digitaldefiance/i18n-lib';
7
- import {
8
- createContext,
9
- FC,
10
- ReactNode,
11
- useCallback,
12
- useContext,
13
- useState,
14
- } from 'react';
15
-
16
- export interface I18nProviderProps {
17
- children: ReactNode;
18
- i18nEngine: I18nEngine;
19
- onLanguageChange?: (language: string) => Promise<void>;
20
- }
21
-
22
- export interface I18nContextType {
23
- t: (
24
- key: string,
25
- vars?: Record<string, string | number>,
26
- language?: string
27
- ) => string;
28
- tComponent: <TStringKey extends string>(
29
- componentId: string,
30
- stringKey: TStringKey,
31
- vars?: Record<string, string | number>,
32
- language?: string
33
- ) => string;
34
- changeLanguage: (language: string) => void;
35
- currentLanguage: string;
36
- }
37
-
38
- const I18nContext = createContext<I18nContextType | undefined>(undefined);
39
-
40
- export const I18nProvider: FC<I18nProviderProps> = ({
41
- children,
42
- i18nEngine,
43
- onLanguageChange,
44
- }) => {
45
- const context = GlobalActiveContext.getInstance<
46
- string,
47
- IActiveContext<string>
48
- >();
49
- const [currentLanguage, setCurrentLanguage] = useState<string>(
50
- context.userLanguage
51
- );
52
-
53
- const changeLanguage = useCallback(
54
- async (language: string) => {
55
- const languageDetails = LanguageRegistry.getLanguageByCode(language);
56
- if (language && languageDetails) {
57
- context.userLanguage = language;
58
- i18nEngine.setLanguage(language);
59
- localStorage.setItem('language', languageDetails.name);
60
- localStorage.setItem('languageCode', language);
61
- setCurrentLanguage(language);
62
- if (onLanguageChange) {
63
- await onLanguageChange(language);
64
- }
65
- }
66
- },
67
- [onLanguageChange, i18nEngine, context]
68
- );
69
-
70
- const t = useCallback(
71
- (
72
- key: string,
73
- vars?: Record<string, string | number>,
74
- language?: string
75
- ) => {
76
- return i18nEngine.t(key, vars, language ?? currentLanguage);
77
- },
78
- [i18nEngine, currentLanguage]
79
- );
80
-
81
- const tComponent = useCallback(
82
- <TStringKey extends string>(
83
- componentId: string,
84
- stringKey: TStringKey,
85
- vars?: Record<string, string | number>,
86
- language?: string
87
- ): string => {
88
- return i18nEngine.translate(
89
- componentId,
90
- stringKey,
91
- vars,
92
- language ?? currentLanguage
93
- );
94
- },
95
- [currentLanguage, i18nEngine]
96
- );
97
-
98
- const value = {
99
- t,
100
- tComponent,
101
- changeLanguage,
102
- currentLanguage,
103
- };
104
-
105
- return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;
106
- };
107
-
108
- export const useI18n = () => {
109
- const context = useContext(I18nContext);
110
- if (context === undefined) {
111
- throw new Error('useI18n must be used within an I18nProvider');
112
- }
113
- return context;
114
- };
@@ -1,398 +0,0 @@
1
- // src/app/menuContext.tsx
2
- import {
3
- IRoleDTO,
4
- SuiteCoreComponentId,
5
- SuiteCoreStringKey,
6
- } from '@digitaldefiance/suite-core-lib';
7
- import {
8
- AccountCircle,
9
- Autorenew as AutorenewIcon,
10
- Brightness4,
11
- Brightness7,
12
- Dashboard as DashboardIcon,
13
- Key as KeyIcon,
14
- LockOpen as LockOpenIcon,
15
- LockReset as LockResetIcon,
16
- Login as LoginIcon,
17
- ExitToApp as LogoutIcon,
18
- PersonAdd as PersonAddIcon,
19
- Settings,
20
- } from '@mui/icons-material';
21
- import {
22
- FC,
23
- ReactNode,
24
- createContext,
25
- useCallback,
26
- useContext,
27
- useEffect,
28
- useMemo,
29
- useRef,
30
- useState,
31
- } from 'react';
32
- import { useUserSettings } from '../hooks';
33
- import { IMenuConfig } from '../interfaces/IMenuConfig';
34
- import { IMenuOption } from '../interfaces/IMenuOption';
35
- import { createAuthenticatedApiClient } from '../services';
36
- import { MenuType, MenuTypes } from '../types/MenuType';
37
- import { useAuth } from './AuthProvider';
38
- import { useI18n } from './I18nProvider';
39
- import { useSuiteConfig } from './SuiteConfigProvider';
40
- import { useTheme } from './ThemeProvider';
41
-
42
- interface MenuProviderProps {
43
- children: ReactNode;
44
- menuConfigs?: IMenuConfig[];
45
- enableBackupCodes?: boolean;
46
- }
47
-
48
- interface MenuContextType {
49
- menuOptions: IMenuOption[];
50
- getMenuOptions: (
51
- menuType: MenuType,
52
- includeDividers: boolean
53
- ) => IMenuOption[];
54
- registerMenuOption: (option: IMenuOption) => () => void;
55
- registerMenuOptions: (options: IMenuOption[]) => () => void;
56
- getTopMenus: () => Array<IMenuConfig>;
57
- }
58
-
59
- const MenuContext = createContext<MenuContextType | undefined>(undefined);
60
-
61
- export const MenuProvider: FC<MenuProviderProps> = ({
62
- children,
63
- menuConfigs = [],
64
- enableBackupCodes = true,
65
- }) => {
66
- const {
67
- userData: user,
68
- isAuthenticated,
69
- mnemonic,
70
- clearMnemonic,
71
- wallet,
72
- clearWallet,
73
- } = useAuth();
74
- const { mode: colorMode } = useTheme();
75
- const registeredMenuOptions = useRef(new Set<() => void>());
76
- const [registeredOptions, setRegisteredOptions] = useState<
77
- Map<string, IMenuOption>
78
- >(new Map<string, IMenuOption>());
79
- const { tComponent } = useI18n();
80
- const { baseUrl } = useSuiteConfig();
81
- const authenticatedApi = useMemo(
82
- () => createAuthenticatedApiClient(baseUrl),
83
- [baseUrl]
84
- );
85
- const { toggleColorMode } = useUserSettings({
86
- authenticatedApi,
87
- isAuthenticated,
88
- });
89
-
90
- const registerMenuOption = useCallback((option: IMenuOption) => {
91
- const unregister = () => {
92
- setRegisteredOptions((prev) => {
93
- const newMap = new Map(prev);
94
- newMap.delete(option.id);
95
- return newMap;
96
- });
97
- registeredMenuOptions.current.delete(unregister);
98
- };
99
-
100
- setRegisteredOptions((prev) => {
101
- const newMap = new Map(prev);
102
- newMap.set(option.id, option);
103
- return newMap;
104
- });
105
- registeredMenuOptions.current.add(unregister);
106
-
107
- return unregister;
108
- }, []);
109
-
110
- const registerMenuOptions = useCallback(
111
- (options: IMenuOption[]) => {
112
- const unregisterFunctions = options.map(registerMenuOption);
113
- return () => unregisterFunctions.forEach((f) => f());
114
- },
115
- [registerMenuOption]
116
- );
117
-
118
- const menuOptions = useMemo(() => {
119
- const isUserRestricted = () => {
120
- return user?.roles?.some((role: IRoleDTO) => role.child) ?? false;
121
- };
122
- let index = 0;
123
- const baseOptions: IMenuOption[] = [
124
- {
125
- id: 'dashboard',
126
- label: tComponent<SuiteCoreStringKey>(
127
- SuiteCoreComponentId,
128
- SuiteCoreStringKey.Common_Dashboard
129
- ),
130
- icon: <DashboardIcon />,
131
- link: '/dashboard',
132
- requiresAuth: true,
133
- includeOnMenus: [MenuTypes.SideMenu],
134
- index: index++,
135
- },
136
- {
137
- id: 'user-divider',
138
- label: '',
139
- divider: true,
140
- includeOnMenus: [MenuTypes.SideMenu],
141
- index: index++,
142
- requiresAuth: false,
143
- },
144
- {
145
- id: 'logout',
146
- label: tComponent<SuiteCoreStringKey>(
147
- SuiteCoreComponentId,
148
- SuiteCoreStringKey.LogoutButton
149
- ),
150
- icon: <LogoutIcon />,
151
- link: '/logout',
152
- requiresAuth: true,
153
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
154
- index: index++,
155
- },
156
- {
157
- id: 'login',
158
- label: tComponent<SuiteCoreStringKey>(
159
- SuiteCoreComponentId,
160
- SuiteCoreStringKey.Login_LoginButton
161
- ),
162
- icon: <LoginIcon />,
163
- link: '/login',
164
- requiresAuth: false,
165
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
166
- index: index++,
167
- },
168
- {
169
- id: 'register',
170
- label: tComponent<SuiteCoreStringKey>(
171
- SuiteCoreComponentId,
172
- SuiteCoreStringKey.RegisterButton
173
- ),
174
- icon: <PersonAddIcon />,
175
- link: '/register',
176
- requiresAuth: false,
177
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
178
- index: index++,
179
- },
180
- {
181
- id: 'forgot-password',
182
- label: tComponent<SuiteCoreStringKey>(
183
- SuiteCoreComponentId,
184
- SuiteCoreStringKey.ForgotPassword_Title
185
- ),
186
- icon: <LockOpenIcon />,
187
- link: '/forgot-password',
188
- requiresAuth: false,
189
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
190
- index: index++,
191
- },
192
- {
193
- id: 'change-password',
194
- label: tComponent<SuiteCoreStringKey>(
195
- SuiteCoreComponentId,
196
- SuiteCoreStringKey.Common_ChangePassword
197
- ),
198
- icon: <LockResetIcon />,
199
- link: '/change-password',
200
- requiresAuth: true,
201
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
202
- index: index++,
203
- },
204
- ...(enableBackupCodes
205
- ? [
206
- {
207
- id: 'backup-code',
208
- label: tComponent<SuiteCoreStringKey>(
209
- SuiteCoreComponentId,
210
- SuiteCoreStringKey.BackupCodeRecovery_Title
211
- ),
212
- icon: <KeyIcon />,
213
- link: '/backup-code',
214
- requiresAuth: false,
215
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
216
- index: index++,
217
- },
218
- {
219
- id: 'backup-codes',
220
- label: tComponent<SuiteCoreStringKey>(
221
- SuiteCoreComponentId,
222
- SuiteCoreStringKey.BackupCodeRecovery_GenerateNewCodes
223
- ),
224
- icon: <AutorenewIcon />,
225
- link: '/backup-codes',
226
- requiresAuth: true,
227
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
228
- index: index++,
229
- },
230
- ]
231
- : []),
232
- {
233
- id: 'divider',
234
- label: '',
235
- divider: true,
236
- includeOnMenus: [MenuTypes.SideMenu],
237
- index: index++,
238
- requiresAuth: false,
239
- },
240
- {
241
- id: 'clear-mnemonic',
242
- label: tComponent<SuiteCoreStringKey>(
243
- SuiteCoreComponentId,
244
- SuiteCoreStringKey.Common_ClearMnemonic
245
- ),
246
- action: clearMnemonic,
247
- icon: <KeyIcon />,
248
- requiresAuth: true,
249
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
250
- index: index++,
251
- filter: () => !!mnemonic,
252
- },
253
- {
254
- id: 'clear-wallet',
255
- label: tComponent<SuiteCoreStringKey>(
256
- SuiteCoreComponentId,
257
- SuiteCoreStringKey.Common_ClearWallet
258
- ),
259
- action: clearWallet,
260
- icon: <KeyIcon />,
261
- requiresAuth: true,
262
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
263
- index: index++,
264
- filter: () => !!wallet,
265
- },
266
- ...(isUserRestricted() ? [] : []),
267
- {
268
- id: 'color-divider',
269
- label: '',
270
- divider: true,
271
- includeOnMenus: [MenuTypes.SideMenu],
272
- index: index++,
273
- requiresAuth: undefined,
274
- },
275
- {
276
- id: 'theme-toggle',
277
- label:
278
- colorMode === 'dark'
279
- ? tComponent<SuiteCoreStringKey>(
280
- SuiteCoreComponentId,
281
- SuiteCoreStringKey.Common_ThemeToggle_Light
282
- )
283
- : tComponent<SuiteCoreStringKey>(
284
- SuiteCoreComponentId,
285
- SuiteCoreStringKey.Common_ThemeToggle_Dark
286
- ),
287
- icon: colorMode === 'dark' ? <Brightness7 /> : <Brightness4 />,
288
- includeOnMenus: [MenuTypes.SideMenu],
289
- index: index++,
290
- requiresAuth: undefined,
291
- action: toggleColorMode,
292
- },
293
- {
294
- id: 'user-settings',
295
- label: tComponent<SuiteCoreStringKey>(
296
- SuiteCoreComponentId,
297
- SuiteCoreStringKey.Settings_Title
298
- ),
299
- icon: <Settings />,
300
- link: '/user-settings',
301
- requiresAuth: true,
302
- includeOnMenus: [MenuTypes.UserMenu, MenuTypes.SideMenu],
303
- index: index++,
304
- },
305
- ];
306
-
307
- const allOptions = [...baseOptions, ...registeredOptions.values()];
308
- return allOptions.sort((a, b) => a.index - b.index);
309
- }, [
310
- tComponent,
311
- registeredOptions,
312
- user?.roles,
313
- colorMode,
314
- toggleColorMode,
315
- clearMnemonic,
316
- clearWallet,
317
- mnemonic,
318
- wallet,
319
- enableBackupCodes,
320
- ]);
321
-
322
- const getMenuOptions = useCallback(
323
- (menuType: MenuType, includeDividers: boolean) => {
324
- const MenuFilter = (o: IMenuOption) => {
325
- // Apply the custom filter first
326
- let customFilterPasses = true;
327
- if (o.filter !== undefined) {
328
- customFilterPasses = o.filter(o);
329
- }
330
- if (!customFilterPasses) return false;
331
-
332
- if (o.divider === true && !includeDividers) return false;
333
-
334
- return (
335
- o.includeOnMenus.includes(menuType) &&
336
- (o.requiresAuth === undefined || o.requiresAuth === isAuthenticated)
337
- );
338
- };
339
-
340
- return menuOptions.filter(MenuFilter);
341
- },
342
- [isAuthenticated, menuOptions]
343
- );
344
-
345
- useEffect(() => {
346
- if (menuConfigs.length > 0) {
347
- return registerMenuOptions(
348
- menuConfigs.flatMap((config) => config.options)
349
- );
350
- }
351
- return undefined;
352
- }, [menuConfigs, registerMenuOptions]);
353
-
354
- const getTopMenus = useCallback(() => {
355
- const menus: Array<IMenuConfig & { isUserMenu?: boolean }> = [
356
- ...menuConfigs.map((config) => ({ ...config, isUserMenu: false })),
357
- {
358
- menuType: MenuTypes.UserMenu,
359
- menuIcon: <AccountCircle />,
360
- priority: 0,
361
- options: [],
362
- isUserMenu: true,
363
- },
364
- ];
365
- return menus.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
366
- }, [menuConfigs]);
367
-
368
- const contextValue = useMemo(() => {
369
- return {
370
- menuOptions: menuOptions,
371
- getMenuOptions: getMenuOptions,
372
- registerMenuOption: registerMenuOption,
373
- registerMenuOptions: registerMenuOptions,
374
- getTopMenus: getTopMenus,
375
- };
376
- }, [
377
- menuOptions,
378
- getMenuOptions,
379
- registerMenuOption,
380
- registerMenuOptions,
381
- getTopMenus,
382
- ]);
383
-
384
- const memoizedChildren = useMemo(() => children, [children]);
385
- return (
386
- <MenuContext.Provider value={contextValue}>
387
- {memoizedChildren}
388
- </MenuContext.Provider>
389
- );
390
- };
391
-
392
- export const useMenu = (): MenuContextType => {
393
- const context = useContext(MenuContext);
394
- if (context === undefined) {
395
- throw new Error('useMenu must be used within a MenuProvider');
396
- }
397
- return context;
398
- };
@@ -1,93 +0,0 @@
1
- import { createContext, ReactNode, useContext } from 'react';
2
-
3
- export interface SuiteConfigRoutes {
4
- dashboard?: string;
5
- login?: string;
6
- register?: string;
7
- verifyEmail?: string;
8
- forgotPassword?: string;
9
- resetPassword?: string;
10
- settings?: string;
11
- }
12
-
13
- export interface SuiteConfigContextData {
14
- /**
15
- * Base URL for API calls
16
- */
17
- baseUrl: string;
18
-
19
- /**
20
- * Application routes for navigation
21
- */
22
- routes: SuiteConfigRoutes;
23
-
24
- /**
25
- * Available languages for the application
26
- */
27
- languages: Array<{ code: string; label: string }>;
28
-
29
- /**
30
- * Available timezones
31
- */
32
- timezones?: string[];
33
- }
34
-
35
- const defaultRoutes: SuiteConfigRoutes = {
36
- dashboard: '/dashboard',
37
- login: '/login',
38
- register: '/register',
39
- verifyEmail: '/verify-email',
40
- forgotPassword: '/forgot-password',
41
- resetPassword: '/reset-password',
42
- settings: '/settings',
43
- };
44
-
45
- const defaultLanguages = [
46
- { code: 'en-US', label: 'English (US)' },
47
- { code: 'en-GB', label: 'English (UK)' },
48
- { code: 'es-ES', label: 'Español' },
49
- { code: 'fr-FR', label: 'Français' },
50
- { code: 'de-DE', label: 'Deutsch' },
51
- { code: 'ja', label: '日本語' },
52
- { code: 'zh-CN', label: '中文 (简体)' },
53
- { code: 'uk', label: 'Українська' },
54
- ];
55
-
56
- const SuiteConfigContext = createContext<SuiteConfigContextData | undefined>(undefined);
57
-
58
- export interface SuiteConfigProviderProps {
59
- children: ReactNode;
60
- baseUrl: string;
61
- routes?: Partial<SuiteConfigRoutes>;
62
- languages?: Array<{ code: string; label: string }>;
63
- timezones?: string[];
64
- }
65
-
66
- export const SuiteConfigProvider = ({
67
- children,
68
- baseUrl,
69
- routes = {},
70
- languages = defaultLanguages,
71
- timezones,
72
- }: SuiteConfigProviderProps) => {
73
- const value: SuiteConfigContextData = {
74
- baseUrl,
75
- routes: { ...defaultRoutes, ...routes },
76
- languages,
77
- timezones,
78
- };
79
-
80
- return (
81
- <SuiteConfigContext.Provider value={value}>
82
- {children}
83
- </SuiteConfigContext.Provider>
84
- );
85
- };
86
-
87
- export const useSuiteConfig = (): SuiteConfigContextData => {
88
- const context = useContext(SuiteConfigContext);
89
- if (!context) {
90
- throw new Error('useSuiteConfig must be used within a SuiteConfigProvider');
91
- }
92
- return context;
93
- };
@@ -1,67 +0,0 @@
1
- import { Brightness4, Brightness7 } from '@mui/icons-material';
2
- import {
3
- IconButton,
4
- ThemeProvider as MuiThemeProvider,
5
- PaletteMode,
6
- createTheme,
7
- Theme,
8
- } from '@mui/material';
9
- import { FC, ReactNode, createContext, useContext, useMemo, useState } from 'react';
10
-
11
- export interface ThemeContextType {
12
- toggleColorMode: () => void;
13
- setColorMode: (mode: PaletteMode) => void;
14
- mode: PaletteMode;
15
- }
16
-
17
- const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
18
-
19
- export const useTheme = () => {
20
- const context = useContext(ThemeContext);
21
- if (!context) {
22
- throw new Error('useTheme must be used within an AppThemeProvider');
23
- }
24
- return context;
25
- };
26
-
27
- export interface AppThemeProviderProps {
28
- children: ReactNode;
29
- customTheme?: (mode: PaletteMode) => Theme;
30
- }
31
-
32
- export const AppThemeProvider: FC<AppThemeProviderProps> = ({ children, customTheme }) => {
33
- const [mode, setMode] = useState<PaletteMode>('light');
34
-
35
- const colorMode = useMemo(
36
- () => ({
37
- toggleColorMode: () => {
38
- setMode((prevMode) => (prevMode === 'light' ? 'dark' : 'light'));
39
- },
40
- setColorMode: (newMode: PaletteMode) => {
41
- setMode(newMode);
42
- },
43
- mode,
44
- }),
45
- [mode]
46
- );
47
-
48
- const theme = useMemo(
49
- () => (customTheme ? customTheme(mode) : createTheme({ palette: { mode } })),
50
- [mode, customTheme]
51
- );
52
-
53
- return (
54
- <ThemeContext.Provider value={colorMode}>
55
- <MuiThemeProvider theme={theme}>{children}</MuiThemeProvider>
56
- </ThemeContext.Provider>
57
- );
58
- };
59
-
60
- export const ThemeToggleButton: FC = () => {
61
- const { mode, toggleColorMode } = useTheme();
62
- return (
63
- <IconButton onClick={toggleColorMode} color="inherit">
64
- {mode === 'dark' ? <Brightness7 /> : <Brightness4 />}
65
- </IconButton>
66
- );
67
- };