@digitaldefiance/express-suite-react-components 2.4.3 → 2.4.4

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.
package/README.md CHANGED
@@ -297,6 +297,12 @@ MIT © Digital Defiance
297
297
 
298
298
  ## ChangeLog
299
299
 
300
+ ### Version 2.4.4
301
+
302
+ - Fix t(tComponent( calls
303
+ - Add enableBackupCode to MenuProvider
304
+ - Add User Settings to menu
305
+
300
306
  ### Version 2.4.3
301
307
 
302
308
  - Simplify UserSettingsForm/Wrapper
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digitaldefiance/express-suite-react-components",
3
- "version": "2.4.3",
3
+ "version": "2.4.4",
4
4
  "description": "React MUI components for Digital Defiance Express Suite",
5
5
  "main": "src/index.js",
6
6
  "types": "src/index.d.ts",
@@ -25,14 +25,14 @@ const TopMenu = ({ Logo, additionalMenus }) => {
25
25
  const appConfig = 'APP_CONFIG' in window
26
26
  ? window.APP_CONFIG
27
27
  : undefined;
28
- const siteTitle = t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_SiteTemplate));
28
+ const siteTitle = tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_SiteTemplate);
29
29
  return ((0, jsx_runtime_1.jsxs)(material_1.AppBar, { position: "fixed", sx: { top: 10 }, children: [(0, jsx_runtime_1.jsxs)(material_1.Toolbar, { children: [(0, jsx_runtime_1.jsx)(material_1.IconButton, { size: "large", edge: "start", color: "inherit", "aria-label": "menu", sx: { mr: 2 }, onClick: handleOpenSideMenu, children: (0, jsx_runtime_1.jsx)(Menu_1.default, {}) }), (0, jsx_runtime_1.jsx)(material_1.Box, { sx: {
30
30
  height: 40,
31
31
  width: 40,
32
32
  marginRight: 2,
33
33
  display: 'flex',
34
34
  alignItems: 'center',
35
- }, children: Logo }), (0, jsx_runtime_1.jsx)(material_1.Typography, { variant: "h6", component: "div", sx: { flexGrow: 1 }, children: siteTitle }), (0, jsx_runtime_1.jsxs)(material_1.Box, { sx: { display: 'flex', alignItems: 'center' }, children: [isAuthenticated ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { color: "inherit", component: react_router_dom_1.Link, to: "/dashboard", children: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_Dashboard)) }), getTopMenus().map((menu, index) => menu.isUserMenu ? (0, jsx_runtime_1.jsx)(UserMenu_1.UserMenu, {}, `user-menu`) : (0, jsx_runtime_1.jsx)(DropdownMenu_1.DropdownMenu, { menuType: menu.menuType, menuIcon: menu.menuIcon }, `menu-${index}`))] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { color: "inherit", component: react_router_dom_1.Link, to: "/login", children: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Login_LoginButton)) }), (0, jsx_runtime_1.jsx)(material_1.Button, { color: "inherit", component: react_router_dom_1.Link, to: "/register", children: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.RegisterButton)) })] })), (0, jsx_runtime_1.jsx)(UserLanguageSelector_1.UserLanguageSelector, {})] })] }), (0, jsx_runtime_1.jsx)(SideMenu_1.SideMenu, { isOpen: isSideMenuOpen, onClose: handleCloseSideMenu })] }));
35
+ }, children: Logo }), (0, jsx_runtime_1.jsx)(material_1.Typography, { variant: "h6", component: "div", sx: { flexGrow: 1 }, children: siteTitle }), (0, jsx_runtime_1.jsxs)(material_1.Box, { sx: { display: 'flex', alignItems: 'center' }, children: [isAuthenticated ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { color: "inherit", component: react_router_dom_1.Link, to: "/dashboard", children: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_Dashboard) }), getTopMenus().map((menu, index) => menu.isUserMenu ? (0, jsx_runtime_1.jsx)(UserMenu_1.UserMenu, {}, `user-menu`) : (0, jsx_runtime_1.jsx)(DropdownMenu_1.DropdownMenu, { menuType: menu.menuType, menuIcon: menu.menuIcon }, `menu-${index}`))] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { color: "inherit", component: react_router_dom_1.Link, to: "/login", children: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Login_LoginButton) }), (0, jsx_runtime_1.jsx)(material_1.Button, { color: "inherit", component: react_router_dom_1.Link, to: "/register", children: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.RegisterButton) })] })), (0, jsx_runtime_1.jsx)(UserLanguageSelector_1.UserLanguageSelector, {})] })] }), (0, jsx_runtime_1.jsx)(SideMenu_1.SideMenu, { isOpen: isSideMenuOpen, onClose: handleCloseSideMenu })] }));
36
36
  };
37
37
  exports.TopMenu = TopMenu;
38
38
  exports.default = exports.TopMenu;
@@ -12,13 +12,13 @@ const VerifyEmailPage = ({ token, onVerify, labels = {}, loginLink = '/login', r
12
12
  const [loading, setLoading] = (0, react_1.useState)(true);
13
13
  const [verificationStatus, setVerificationStatus] = (0, react_1.useState)('pending');
14
14
  const translatedLabels = {
15
- title: labels.title || t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_EmailVerification)),
16
- success: labels.success || t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.EmailVerification_Success)),
17
- failed: labels.failed || t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.EmailVerification_Failed)),
18
- noToken: labels.noToken || t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.NoVerificationTokenProvided)),
19
- proceedToLogin: labels.proceedToLogin || t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.ProceedToLogin)),
20
- contactSupport: labels.contactSupport || t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.HavingTroubleContactSupport)),
21
- requestNewEmail: labels.requestNewEmail || t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.RequestNewVerificationEmail)),
15
+ title: labels.title || tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Common_EmailVerification),
16
+ success: labels.success || tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.EmailVerification_Success),
17
+ failed: labels.failed || tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.EmailVerification_Failed),
18
+ noToken: labels.noToken || tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.NoVerificationTokenProvided),
19
+ proceedToLogin: labels.proceedToLogin || tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.ProceedToLogin),
20
+ contactSupport: labels.contactSupport || tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.HavingTroubleContactSupport),
21
+ requestNewEmail: labels.requestNewEmail || tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.RequestNewVerificationEmail),
22
22
  };
23
23
  (0, react_1.useEffect)(() => {
24
24
  const verifyEmail = async (verificationToken) => {
@@ -170,7 +170,7 @@ const AuthProviderInner = ({ children, baseUrl, constants, eciesConfig, onLogout
170
170
  }, []);
171
171
  const passwordLogin = (0, react_1.useCallback)(async (password, username, email) => {
172
172
  if (!isPasswordLoginAvailable()) {
173
- return { error: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Error_Login_PasswordLoginNotSetup)), errorType: 'PasswordLoginNotSetup' };
173
+ return { error: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Error_Login_PasswordLoginNotSetup), errorType: 'PasswordLoginNotSetup' };
174
174
  }
175
175
  setLoading(true);
176
176
  const passwordLoginService = getPasswordLoginService();
@@ -216,11 +216,11 @@ const AuthProviderInner = ({ children, baseUrl, constants, eciesConfig, onLogout
216
216
  setLoading(false);
217
217
  setWallet(wallet);
218
218
  setMnemonic(mnemonic);
219
- return { success: true, message: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_Setup_Success)) };
219
+ return { success: true, message: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_Setup_Success) };
220
220
  }
221
221
  catch {
222
222
  setLoading(false);
223
- return { success: false, message: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_Setup_Failure)) };
223
+ return { success: false, message: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_Setup_Failure) };
224
224
  }
225
225
  }, [setMnemonic, setWallet, t, tComponent]);
226
226
  const backupCodeLogin = (0, react_1.useCallback)(async (identifier, code, isEmail, recoverMnemonic, newPassword) => {
@@ -270,7 +270,7 @@ const AuthProviderInner = ({ children, baseUrl, constants, eciesConfig, onLogout
270
270
  }, [baseUrl]);
271
271
  const changePassword = (0, react_1.useCallback)(async (currentPassword, newPassword) => {
272
272
  if (!isPasswordLoginAvailable()) {
273
- return { error: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Error_Login_PasswordLoginNotSetup)), errorType: 'PasswordLoginNotSetup' };
273
+ return { error: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.Error_Login_PasswordLoginNotSetup), errorType: 'PasswordLoginNotSetup' };
274
274
  }
275
275
  setLoading(true);
276
276
  try {
@@ -278,13 +278,13 @@ const AuthProviderInner = ({ children, baseUrl, constants, eciesConfig, onLogout
278
278
  const { mnemonic, wallet } = await passwordLoginService.getWalletAndMnemonicFromLocalStorageBundle(new ecies_lib_1.SecureString(currentPassword));
279
279
  if (!mnemonic) {
280
280
  setLoading(false);
281
- return { error: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_InvalidCurrentPassword)), errorType: 'InvalidCurrentPassword' };
281
+ return { error: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordLogin_InvalidCurrentPassword), errorType: 'InvalidCurrentPassword' };
282
282
  }
283
283
  await passwordLoginService.setupPasswordLoginLocalStorageBundle(mnemonic, new ecies_lib_1.SecureString(newPassword));
284
284
  setLoading(false);
285
285
  setWallet(wallet);
286
286
  setMnemonic(mnemonic);
287
- return { success: true, message: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordChange_Success)) };
287
+ return { success: true, message: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_1.SuiteCoreStringKey.PasswordChange_Success) };
288
288
  }
289
289
  catch (error) {
290
290
  setLoading(false);
@@ -5,6 +5,7 @@ import { IMenuConfig } from '../interfaces/IMenuConfig';
5
5
  interface MenuProviderProps {
6
6
  children: ReactNode;
7
7
  menuConfigs?: IMenuConfig[];
8
+ enableBackupCodes?: boolean;
8
9
  }
9
10
  interface MenuContextType {
10
11
  menuOptions: IMenuOption[];
@@ -1 +1 @@
1
- {"version":3,"file":"MenuContext.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/contexts/MenuContext.tsx"],"names":[],"mappings":"AAgBA,OAAO,EACL,EAAE,EACF,SAAS,EAQV,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,QAAQ,EAAa,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,UAAU,iBAAiB;IACzB,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,cAAc,EAAE,CACd,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,OAAO,KACrB,WAAW,EAAE,CAAC;IACnB,kBAAkB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC;IACxD,mBAAmB,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,MAAM,IAAI,CAAC;IAC5D,WAAW,EAAE,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;CACvC;AAID,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAwO9C,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,eAM1B,CAAC"}
1
+ {"version":3,"file":"MenuContext.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/contexts/MenuContext.tsx"],"names":[],"mappings":"AAiBA,OAAO,EACL,EAAE,EACF,SAAS,EAQV,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,QAAQ,EAAa,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,UAAU,iBAAiB;IACzB,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,WAAW,EAAE,CAAC;IAC3B,cAAc,EAAE,CACd,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,OAAO,KACrB,WAAW,EAAE,CAAC;IACnB,kBAAkB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,IAAI,CAAC;IACxD,mBAAmB,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,MAAM,IAAI,CAAC;IAC5D,WAAW,EAAE,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;CACvC;AAID,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAiP9C,CAAC;AAEF,eAAO,MAAM,OAAO,QAAO,eAM1B,CAAC"}
@@ -12,11 +12,11 @@ const MenuType_1 = require("../types/MenuType");
12
12
  const I18nProvider_1 = require("./I18nProvider");
13
13
  const ThemeProvider_1 = require("./ThemeProvider");
14
14
  const MenuContext = (0, react_1.createContext)(undefined);
15
- const MenuProvider = ({ children, menuConfigs = [] }) => {
15
+ const MenuProvider = ({ children, menuConfigs = [], enableBackupCodes = true }) => {
16
16
  const { userData: user, isAuthenticated, mnemonic, clearMnemonic, wallet, clearWallet } = (0, AuthProvider_1.useAuth)();
17
17
  const registeredMenuOptions = (0, react_1.useRef)(new Set());
18
18
  const [registeredOptions, setRegisteredOptions] = (0, react_1.useState)(new Map());
19
- const { t, tComponent } = (0, I18nProvider_1.useI18n)();
19
+ const { tComponent } = (0, I18nProvider_1.useI18n)();
20
20
  const { mode, toggleColorMode } = (0, ThemeProvider_1.useTheme)();
21
21
  const registerMenuOption = (0, react_1.useCallback)((option) => {
22
22
  const unregister = () => {
@@ -47,7 +47,7 @@ const MenuProvider = ({ children, menuConfigs = [] }) => {
47
47
  const baseOptions = [
48
48
  {
49
49
  id: 'dashboard',
50
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_Dashboard)),
50
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_Dashboard),
51
51
  icon: (0, jsx_runtime_1.jsx)(icons_material_1.Dashboard, {}),
52
52
  link: '/dashboard',
53
53
  requiresAuth: true,
@@ -64,7 +64,7 @@ const MenuProvider = ({ children, menuConfigs = [] }) => {
64
64
  },
65
65
  {
66
66
  id: 'logout',
67
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.LogoutButton)),
67
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.LogoutButton),
68
68
  icon: (0, jsx_runtime_1.jsx)(icons_material_1.ExitToApp, {}),
69
69
  link: '/logout',
70
70
  requiresAuth: true,
@@ -73,7 +73,7 @@ const MenuProvider = ({ children, menuConfigs = [] }) => {
73
73
  },
74
74
  {
75
75
  id: 'login',
76
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Login_LoginButton)),
76
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Login_LoginButton),
77
77
  icon: (0, jsx_runtime_1.jsx)(icons_material_1.Login, {}),
78
78
  link: '/login',
79
79
  requiresAuth: false,
@@ -82,7 +82,7 @@ const MenuProvider = ({ children, menuConfigs = [] }) => {
82
82
  },
83
83
  {
84
84
  id: 'register',
85
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.RegisterButton)),
85
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.RegisterButton),
86
86
  icon: (0, jsx_runtime_1.jsx)(icons_material_1.PersonAdd, {}),
87
87
  link: '/register',
88
88
  requiresAuth: false,
@@ -91,7 +91,7 @@ const MenuProvider = ({ children, menuConfigs = [] }) => {
91
91
  },
92
92
  {
93
93
  id: 'forgot-password',
94
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.ForgotPassword_Title)),
94
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.ForgotPassword_Title),
95
95
  icon: (0, jsx_runtime_1.jsx)(icons_material_1.LockOpen, {}),
96
96
  link: '/forgot-password',
97
97
  requiresAuth: false,
@@ -100,31 +100,31 @@ const MenuProvider = ({ children, menuConfigs = [] }) => {
100
100
  },
101
101
  {
102
102
  id: 'change-password',
103
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ChangePassword)),
103
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ChangePassword),
104
104
  icon: (0, jsx_runtime_1.jsx)(icons_material_1.LockReset, {}),
105
105
  link: '/change-password',
106
106
  requiresAuth: true,
107
107
  includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
108
108
  index: index++,
109
109
  },
110
- {
111
- id: 'backup-code',
112
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.BackupCodeRecovery_Title)),
113
- icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
114
- link: '/backup-code',
115
- requiresAuth: false,
116
- includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
117
- index: index++,
118
- },
119
- {
120
- id: 'backup-codes',
121
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.BackupCodeRecovery_GenerateNewCodes)),
122
- icon: (0, jsx_runtime_1.jsx)(icons_material_1.Autorenew, {}),
123
- link: '/backup-codes',
124
- requiresAuth: true,
125
- includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
126
- index: index++,
127
- },
110
+ ...(enableBackupCodes ? [{
111
+ id: 'backup-code',
112
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.BackupCodeRecovery_Title),
113
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
114
+ link: '/backup-code',
115
+ requiresAuth: false,
116
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
117
+ index: index++,
118
+ },
119
+ {
120
+ id: 'backup-codes',
121
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.BackupCodeRecovery_GenerateNewCodes),
122
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Autorenew, {}),
123
+ link: '/backup-codes',
124
+ requiresAuth: true,
125
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
126
+ index: index++,
127
+ }] : []),
128
128
  {
129
129
  id: 'divider',
130
130
  label: '',
@@ -135,7 +135,7 @@ const MenuProvider = ({ children, menuConfigs = [] }) => {
135
135
  },
136
136
  {
137
137
  id: 'clear-mnemonic',
138
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ClearMnemonic)),
138
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ClearMnemonic),
139
139
  action: clearMnemonic,
140
140
  icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
141
141
  requiresAuth: true,
@@ -145,7 +145,7 @@ const MenuProvider = ({ children, menuConfigs = [] }) => {
145
145
  },
146
146
  {
147
147
  id: 'clear-wallet',
148
- label: t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ClearWallet)),
148
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ClearWallet),
149
149
  action: clearWallet,
150
150
  icon: (0, jsx_runtime_1.jsx)(icons_material_1.Key, {}),
151
151
  requiresAuth: true,
@@ -165,18 +165,27 @@ const MenuProvider = ({ children, menuConfigs = [] }) => {
165
165
  {
166
166
  id: 'theme-toggle',
167
167
  label: mode === 'dark'
168
- ? t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ThemeToggle_Light))
169
- : t(tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ThemeToggle_Dark)),
168
+ ? tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ThemeToggle_Light)
169
+ : tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Common_ThemeToggle_Dark),
170
170
  icon: mode === 'dark' ? (0, jsx_runtime_1.jsx)(icons_material_1.Brightness7, {}) : (0, jsx_runtime_1.jsx)(icons_material_1.Brightness4, {}),
171
171
  includeOnMenus: [MenuType_1.MenuTypes.SideMenu],
172
172
  index: index++,
173
173
  requiresAuth: undefined,
174
174
  action: toggleColorMode,
175
175
  },
176
+ {
177
+ id: 'user-settings',
178
+ label: tComponent(suite_core_lib_1.SuiteCoreComponentId, suite_core_lib_2.SuiteCoreStringKey.Settings_Title),
179
+ icon: (0, jsx_runtime_1.jsx)(icons_material_1.Settings, {}),
180
+ link: '/user-settings',
181
+ requiresAuth: true,
182
+ includeOnMenus: [MenuType_1.MenuTypes.UserMenu, MenuType_1.MenuTypes.SideMenu],
183
+ index: index++,
184
+ }
176
185
  ];
177
186
  const allOptions = [...baseOptions, ...registeredOptions.values()];
178
187
  return allOptions.sort((a, b) => a.index - b.index);
179
- }, [t, tComponent, registeredOptions, user?.roles, mode, toggleColorMode]);
188
+ }, [tComponent, registeredOptions, user?.roles, mode, toggleColorMode]);
180
189
  const getMenuOptions = (0, react_1.useCallback)((menuType, includeDividers) => {
181
190
  const MenuFilter = (o) => {
182
191
  // Apply the custom filter first