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

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 (57) hide show
  1. package/README.md +133 -0
  2. package/package.json +4 -4
  3. package/src/components/TopMenu.js +2 -2
  4. package/src/components/VerifyEmailPage.js +7 -7
  5. package/src/contexts/AuthProvider.d.ts.map +1 -1
  6. package/src/contexts/AuthProvider.js +25 -11
  7. package/src/contexts/MenuContext.d.ts +1 -0
  8. package/src/contexts/MenuContext.d.ts.map +1 -1
  9. package/src/contexts/MenuContext.js +40 -31
  10. package/src/contexts/SuiteConfigProvider.d.ts +44 -0
  11. package/src/contexts/SuiteConfigProvider.d.ts.map +1 -0
  12. package/src/contexts/SuiteConfigProvider.js +43 -0
  13. package/src/contexts/ThemeProvider.d.ts +1 -0
  14. package/src/contexts/ThemeProvider.d.ts.map +1 -1
  15. package/src/contexts/ThemeProvider.js +3 -0
  16. package/src/contexts/index.d.ts +1 -0
  17. package/src/contexts/index.d.ts.map +1 -1
  18. package/src/contexts/index.js +1 -0
  19. package/src/hooks/index.d.ts +3 -0
  20. package/src/hooks/index.d.ts.map +1 -1
  21. package/src/hooks/index.js +3 -0
  22. package/src/hooks/useBackupCodes.d.ts +15 -0
  23. package/src/hooks/useBackupCodes.d.ts.map +1 -0
  24. package/src/hooks/useBackupCodes.js +70 -0
  25. package/src/hooks/useEmailVerification.d.ts +10 -0
  26. package/src/hooks/useEmailVerification.d.ts.map +1 -0
  27. package/src/hooks/useEmailVerification.js +36 -0
  28. package/src/hooks/useUserSettings.d.ts +29 -0
  29. package/src/hooks/useUserSettings.d.ts.map +1 -0
  30. package/src/hooks/useUserSettings.js +103 -0
  31. package/src/wrappers/BackupCodeLoginWrapper.d.ts +8 -0
  32. package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +1 -0
  33. package/src/wrappers/BackupCodeLoginWrapper.js +21 -0
  34. package/src/wrappers/BackupCodesWrapper.d.ts +7 -0
  35. package/src/wrappers/BackupCodesWrapper.d.ts.map +1 -0
  36. package/src/wrappers/BackupCodesWrapper.js +17 -0
  37. package/src/wrappers/ChangePasswordFormWrapper.d.ts +8 -0
  38. package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +1 -0
  39. package/src/wrappers/ChangePasswordFormWrapper.js +21 -0
  40. package/src/wrappers/LoginFormWrapper.d.ts +9 -0
  41. package/src/wrappers/LoginFormWrapper.d.ts.map +1 -0
  42. package/src/wrappers/LoginFormWrapper.js +43 -0
  43. package/src/wrappers/LogoutPageWrapper.d.ts +9 -0
  44. package/src/wrappers/LogoutPageWrapper.d.ts.map +1 -0
  45. package/src/wrappers/LogoutPageWrapper.js +21 -0
  46. package/src/wrappers/RegisterFormWrapper.d.ts +9 -0
  47. package/src/wrappers/RegisterFormWrapper.d.ts.map +1 -0
  48. package/src/wrappers/RegisterFormWrapper.js +26 -0
  49. package/src/wrappers/UserSettingsFormWrapper.d.ts +8 -0
  50. package/src/wrappers/UserSettingsFormWrapper.d.ts.map +1 -0
  51. package/src/wrappers/UserSettingsFormWrapper.js +23 -0
  52. package/src/wrappers/VerifyEmailPageWrapper.d.ts +8 -0
  53. package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +1 -0
  54. package/src/wrappers/VerifyEmailPageWrapper.js +20 -0
  55. package/src/wrappers/index.d.ts +16 -22
  56. package/src/wrappers/index.d.ts.map +1 -1
  57. package/src/wrappers/index.js +17 -158
@@ -0,0 +1,44 @@
1
+ import { ReactNode } from 'react';
2
+ export interface SuiteConfigRoutes {
3
+ dashboard?: string;
4
+ login?: string;
5
+ register?: string;
6
+ verifyEmail?: string;
7
+ forgotPassword?: string;
8
+ resetPassword?: string;
9
+ settings?: string;
10
+ }
11
+ export interface SuiteConfigContextData {
12
+ /**
13
+ * Base URL for API calls
14
+ */
15
+ baseUrl: string;
16
+ /**
17
+ * Application routes for navigation
18
+ */
19
+ routes: SuiteConfigRoutes;
20
+ /**
21
+ * Available languages for the application
22
+ */
23
+ languages: Array<{
24
+ code: string;
25
+ label: string;
26
+ }>;
27
+ /**
28
+ * Available timezones
29
+ */
30
+ timezones?: string[];
31
+ }
32
+ export interface SuiteConfigProviderProps {
33
+ children: ReactNode;
34
+ baseUrl: string;
35
+ routes?: Partial<SuiteConfigRoutes>;
36
+ languages?: Array<{
37
+ code: string;
38
+ label: string;
39
+ }>;
40
+ timezones?: string[];
41
+ }
42
+ export declare const SuiteConfigProvider: ({ children, baseUrl, routes, languages, timezones, }: SuiteConfigProviderProps) => import("react/jsx-runtime").JSX.Element;
43
+ export declare const useSuiteConfig: () => SuiteConfigContextData;
44
+ //# sourceMappingURL=SuiteConfigProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SuiteConfigProvider.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/contexts/SuiteConfigProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,SAAS,EAAc,MAAM,OAAO,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,iBAAiB,CAAC;IAE1B;;OAEG;IACH,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAElD;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAyBD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,mBAAmB,GAAI,sDAMjC,wBAAwB,4CAa1B,CAAC;AAEF,eAAO,MAAM,cAAc,QAAO,sBAMjC,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useSuiteConfig = exports.SuiteConfigProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const defaultRoutes = {
7
+ dashboard: '/dashboard',
8
+ login: '/login',
9
+ register: '/register',
10
+ verifyEmail: '/verify-email',
11
+ forgotPassword: '/forgot-password',
12
+ resetPassword: '/reset-password',
13
+ settings: '/settings',
14
+ };
15
+ const defaultLanguages = [
16
+ { code: 'en-US', label: 'English (US)' },
17
+ { code: 'en-GB', label: 'English (UK)' },
18
+ { code: 'es-ES', label: 'Español' },
19
+ { code: 'fr-FR', label: 'Français' },
20
+ { code: 'de-DE', label: 'Deutsch' },
21
+ { code: 'ja', label: '日本語' },
22
+ { code: 'zh-CN', label: '中文 (简体)' },
23
+ { code: 'uk', label: 'Українська' },
24
+ ];
25
+ const SuiteConfigContext = (0, react_1.createContext)(undefined);
26
+ const SuiteConfigProvider = ({ children, baseUrl, routes = {}, languages = defaultLanguages, timezones, }) => {
27
+ const value = {
28
+ baseUrl,
29
+ routes: { ...defaultRoutes, ...routes },
30
+ languages,
31
+ timezones,
32
+ };
33
+ return ((0, jsx_runtime_1.jsx)(SuiteConfigContext.Provider, { value: value, children: children }));
34
+ };
35
+ exports.SuiteConfigProvider = SuiteConfigProvider;
36
+ const useSuiteConfig = () => {
37
+ const context = (0, react_1.useContext)(SuiteConfigContext);
38
+ if (!context) {
39
+ throw new Error('useSuiteConfig must be used within a SuiteConfigProvider');
40
+ }
41
+ return context;
42
+ };
43
+ exports.useSuiteConfig = useSuiteConfig;
@@ -2,6 +2,7 @@ import { PaletteMode, Theme } from '@mui/material';
2
2
  import { FC, ReactNode } from 'react';
3
3
  export interface ThemeContextType {
4
4
  toggleColorMode: () => void;
5
+ setColorMode: (mode: PaletteMode) => void;
5
6
  mode: PaletteMode;
6
7
  }
7
8
  export declare const useTheme: () => ThemeContextType;
@@ -1 +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,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,CAuBtD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,EAO/B,CAAC"}
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"}
@@ -20,6 +20,9 @@ const AppThemeProvider = ({ children, customTheme }) => {
20
20
  toggleColorMode: () => {
21
21
  setMode((prevMode) => (prevMode === 'light' ? 'dark' : 'light'));
22
22
  },
23
+ setColorMode: (newMode) => {
24
+ setMode(newMode);
25
+ },
23
26
  mode,
24
27
  }), [mode]);
25
28
  const theme = (0, react_1.useMemo)(() => (customTheme ? customTheme(mode) : (0, material_1.createTheme)({ palette: { mode } })), [mode, customTheme]);
@@ -2,4 +2,5 @@ export * from './AuthProvider';
2
2
  export * from './MenuContext';
3
3
  export * from './I18nProvider';
4
4
  export * from './ThemeProvider';
5
+ export * from './SuiteConfigProvider';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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"}
@@ -5,3 +5,4 @@ tslib_1.__exportStar(require("./AuthProvider"), exports);
5
5
  tslib_1.__exportStar(require("./MenuContext"), exports);
6
6
  tslib_1.__exportStar(require("./I18nProvider"), exports);
7
7
  tslib_1.__exportStar(require("./ThemeProvider"), exports);
8
+ tslib_1.__exportStar(require("./SuiteConfigProvider"), exports);
@@ -1,3 +1,6 @@
1
1
  export * from './useExpiringValue';
2
2
  export * from './useLocalStorage';
3
+ export * from './useBackupCodes';
4
+ export * from './useUserSettings';
5
+ export * from './useEmailVerification';
3
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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"}
@@ -3,3 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./useExpiringValue"), exports);
5
5
  tslib_1.__exportStar(require("./useLocalStorage"), exports);
6
+ tslib_1.__exportStar(require("./useBackupCodes"), exports);
7
+ tslib_1.__exportStar(require("./useUserSettings"), exports);
8
+ tslib_1.__exportStar(require("./useEmailVerification"), exports);
@@ -0,0 +1,15 @@
1
+ export interface UseBackupCodesOptions {
2
+ initialCodeCount?: number | null;
3
+ }
4
+ export interface UseBackupCodesResult {
5
+ backupCodesRemaining: number | null;
6
+ isLoading: boolean;
7
+ error: Error | null;
8
+ generateBackupCodes: (password?: string, mnemonic?: string) => Promise<{
9
+ message: string;
10
+ backupCodes: string[];
11
+ }>;
12
+ refreshCodeCount: () => Promise<void>;
13
+ }
14
+ export declare const useBackupCodes: (options?: UseBackupCodesOptions) => UseBackupCodesResult;
15
+ //# sourceMappingURL=useBackupCodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBackupCodes.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/useBackupCodes.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,mBAAmB,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QACrE,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC,CAAC;IACH,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,eAAO,MAAM,cAAc,GACzB,UAAS,qBAA0B,KAClC,oBA8DF,CAAC"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useBackupCodes = void 0;
4
+ const react_1 = require("react");
5
+ const services_1 = require("../services");
6
+ const contexts_1 = require("../contexts");
7
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
8
+ const useBackupCodes = (options = {}) => {
9
+ const { baseUrl } = (0, contexts_1.useSuiteConfig)();
10
+ const [backupCodesRemaining, setBackupCodesRemaining] = (0, react_1.useState)(options.initialCodeCount ?? null);
11
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
12
+ const [error, setError] = (0, react_1.useState)(null);
13
+ const requestedOnMountRef = (0, react_1.useRef)(false);
14
+ const api = (0, react_1.useMemo)(() => (0, services_1.createAuthenticatedApiClient)(baseUrl), [baseUrl]);
15
+ const refreshCodeCount = (0, react_1.useCallback)(async () => {
16
+ setIsLoading(true);
17
+ setError(null);
18
+ try {
19
+ const result = await api.get('/user/backup-codes');
20
+ if (result?.data?.codeCount !== undefined) {
21
+ setBackupCodesRemaining(result.data.codeCount);
22
+ }
23
+ }
24
+ catch (err) {
25
+ setError(err instanceof Error ? err : new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.BackupCodes_FailedToFetch));
26
+ setBackupCodesRemaining(0);
27
+ }
28
+ finally {
29
+ setIsLoading(false);
30
+ }
31
+ }, [api]);
32
+ (0, react_1.useEffect)(() => {
33
+ if (requestedOnMountRef.current)
34
+ return;
35
+ if (backupCodesRemaining !== null)
36
+ return;
37
+ requestedOnMountRef.current = true;
38
+ refreshCodeCount();
39
+ }, [backupCodesRemaining, refreshCodeCount]);
40
+ const generateBackupCodes = async (password, mnemonic) => {
41
+ setIsLoading(true);
42
+ setError(null);
43
+ try {
44
+ const result = await api.post('/user/backup-codes', {
45
+ ...(password ? { password } : {}),
46
+ ...(mnemonic ? { mnemonic } : {}),
47
+ });
48
+ return {
49
+ message: result.data.message,
50
+ backupCodes: result.data.backupCodes,
51
+ };
52
+ }
53
+ catch (err) {
54
+ const error = err instanceof Error ? err : new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.BackupCodes_FailedToGenerate);
55
+ setError(error);
56
+ throw error;
57
+ }
58
+ finally {
59
+ setIsLoading(false);
60
+ }
61
+ };
62
+ return {
63
+ backupCodesRemaining,
64
+ isLoading,
65
+ error,
66
+ generateBackupCodes,
67
+ refreshCodeCount,
68
+ };
69
+ };
70
+ exports.useBackupCodes = useBackupCodes;
@@ -0,0 +1,10 @@
1
+ export interface UseEmailVerificationResult {
2
+ isVerifying: boolean;
3
+ error: Error | null;
4
+ verifyEmail: (token: string) => Promise<{
5
+ success: boolean;
6
+ message?: string;
7
+ }>;
8
+ }
9
+ export declare const useEmailVerification: () => UseEmailVerificationResult;
10
+ //# sourceMappingURL=useEmailVerification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEmailVerification.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/useEmailVerification.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED,eAAO,MAAM,oBAAoB,QAAO,0BA2BvC,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useEmailVerification = void 0;
4
+ const react_1 = require("react");
5
+ const services_1 = require("../services");
6
+ const contexts_1 = require("../contexts");
7
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
8
+ const useEmailVerification = () => {
9
+ const { baseUrl } = (0, contexts_1.useSuiteConfig)();
10
+ const api = (0, react_1.useMemo)(() => (0, services_1.createAuthenticatedApiClient)(baseUrl), [baseUrl]);
11
+ const [isVerifying, setIsVerifying] = (0, react_1.useState)(false);
12
+ const [error, setError] = (0, react_1.useState)(null);
13
+ const verifyEmail = async (verificationToken) => {
14
+ setIsVerifying(true);
15
+ setError(null);
16
+ try {
17
+ const result = await api.post('/verify-email', { token: verificationToken });
18
+ return { success: true, message: result.data.message };
19
+ }
20
+ catch (err) {
21
+ const errorMessage = err.response?.data?.message || (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Error_VerificationFailed);
22
+ const error = new Error(errorMessage);
23
+ setError(error);
24
+ return { success: false, message: errorMessage };
25
+ }
26
+ finally {
27
+ setIsVerifying(false);
28
+ }
29
+ };
30
+ return {
31
+ isVerifying,
32
+ error,
33
+ verifyEmail,
34
+ };
35
+ };
36
+ exports.useEmailVerification = useEmailVerification;
@@ -0,0 +1,29 @@
1
+ export interface UserSettingsValues {
2
+ email: string;
3
+ timezone: string;
4
+ siteLanguage: string;
5
+ currency: string;
6
+ darkMode: boolean;
7
+ directChallenge: boolean;
8
+ [key: string]: any;
9
+ }
10
+ export interface UseUserSettingsResult {
11
+ settings: UserSettingsValues | null;
12
+ isLoading: boolean;
13
+ error: Error | null;
14
+ updateSettings: (values: UserSettingsValues) => Promise<{
15
+ success: boolean;
16
+ message: string;
17
+ } | {
18
+ error: string;
19
+ errorType?: string;
20
+ field?: string;
21
+ errors?: Array<{
22
+ path: string;
23
+ msg: string;
24
+ }>;
25
+ }>;
26
+ refreshSettings: () => Promise<void>;
27
+ }
28
+ export declare const useUserSettings: () => UseUserSettingsResult;
29
+ //# sourceMappingURL=useUserSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUserSettings.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/useUserSettings.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,CAAC;QACtD,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG;QACF,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC/C,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,eAAO,MAAM,eAAe,QAAO,qBA+FlC,CAAC"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useUserSettings = void 0;
4
+ const react_1 = require("react");
5
+ const services_1 = require("../services");
6
+ const contexts_1 = require("../contexts");
7
+ const contexts_2 = require("../contexts");
8
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
9
+ const useUserSettings = () => {
10
+ const { baseUrl } = (0, contexts_1.useSuiteConfig)();
11
+ const { userData, setCurrencyCode, setLanguage } = (0, contexts_2.useAuth)();
12
+ const { setColorMode } = (0, contexts_2.useTheme)();
13
+ const api = (0, react_1.useMemo)(() => (0, services_1.createAuthenticatedApiClient)(baseUrl), [baseUrl]);
14
+ const [settings, setSettings] = (0, react_1.useState)(null);
15
+ const [isLoading, setIsLoading] = (0, react_1.useState)(true);
16
+ const [error, setError] = (0, react_1.useState)(null);
17
+ const refreshSettings = (0, react_1.useCallback)(async () => {
18
+ setIsLoading(true);
19
+ setError(null);
20
+ try {
21
+ const result = await api.get('/user/settings');
22
+ if (result?.data?.settings) {
23
+ setSettings(result.data.settings);
24
+ }
25
+ else {
26
+ // Fallback to userData - use current value without dependency
27
+ const fallback = {
28
+ email: userData?.email || '',
29
+ timezone: userData?.timezone || 'UTC',
30
+ siteLanguage: userData?.siteLanguage || 'en-US',
31
+ currency: userData?.currency || 'USD',
32
+ darkMode: userData?.darkMode || false,
33
+ directChallenge: userData?.directChallenge || false,
34
+ };
35
+ setSettings(fallback);
36
+ }
37
+ }
38
+ catch (err) {
39
+ setError(err instanceof Error ? err : new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Settings_RetrieveFailure));
40
+ // Use fallback from userData
41
+ const fallback = {
42
+ email: userData?.email || '',
43
+ timezone: userData?.timezone || 'UTC',
44
+ siteLanguage: userData?.siteLanguage || 'en-US',
45
+ currency: userData?.currency || 'USD',
46
+ darkMode: userData?.darkMode || false,
47
+ directChallenge: userData?.directChallenge || false,
48
+ };
49
+ setSettings(fallback);
50
+ }
51
+ finally {
52
+ setIsLoading(false);
53
+ }
54
+ // eslint-disable-next-line react-hooks/exhaustive-deps
55
+ }, [api]); // userData intentionally omitted to prevent infinite loops
56
+ (0, react_1.useEffect)(() => {
57
+ refreshSettings();
58
+ }, [refreshSettings]);
59
+ const updateSettings = async (values) => {
60
+ setIsLoading(true);
61
+ setError(null);
62
+ try {
63
+ const result = await api.post('/user/settings', values);
64
+ // Update context values
65
+ if (values.currency) {
66
+ await setCurrencyCode(values.currency);
67
+ }
68
+ if (values.siteLanguage) {
69
+ await setLanguage(values.siteLanguage);
70
+ }
71
+ if (values.darkMode !== userData?.darkMode) {
72
+ setColorMode(values.darkMode ? 'dark' : 'light');
73
+ }
74
+ // Update local state
75
+ setSettings(values);
76
+ return {
77
+ success: true,
78
+ message: result.data.message || (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Settings_SaveSuccess)
79
+ };
80
+ }
81
+ catch (err) {
82
+ const errorMessage = err.response?.data?.message || (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Settings_UpdateFailed);
83
+ setError(err instanceof Error ? err : new Error(errorMessage));
84
+ return {
85
+ error: errorMessage,
86
+ errorType: err.response?.data?.errorType,
87
+ field: err.response?.data?.field,
88
+ errors: err.response?.data?.errors,
89
+ };
90
+ }
91
+ finally {
92
+ setIsLoading(false);
93
+ }
94
+ };
95
+ return {
96
+ settings,
97
+ isLoading,
98
+ error,
99
+ updateSettings,
100
+ refreshSettings,
101
+ };
102
+ };
103
+ exports.useUserSettings = useUserSettings;
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ import { BackupCodeLoginForm } from '../components/BackupCodeLoginForm';
3
+ export interface BackupCodeLoginWrapperProps {
4
+ onSuccess?: () => void;
5
+ componentProps?: Partial<React.ComponentProps<typeof BackupCodeLoginForm>>;
6
+ }
7
+ export declare const BackupCodeLoginWrapper: FC<BackupCodeLoginWrapperProps>;
8
+ //# sourceMappingURL=BackupCodeLoginWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackupCodeLoginWrapper.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/wrappers/BackupCodeLoginWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAE3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAGxE,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC;CAC5E;AAED,eAAO,MAAM,sBAAsB,EAAE,EAAE,CAAC,2BAA2B,CAwBlE,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BackupCodeLoginWrapper = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_router_dom_1 = require("react-router-dom");
6
+ const BackupCodeLoginForm_1 = require("../components/BackupCodeLoginForm");
7
+ const contexts_1 = require("../contexts");
8
+ const BackupCodeLoginWrapper = ({ onSuccess, componentProps = {}, }) => {
9
+ const { backupCodeLogin, isAuthenticated } = (0, contexts_1.useAuth)();
10
+ const navigate = (0, react_router_dom_1.useNavigate)();
11
+ const { routes } = (0, contexts_1.useSuiteConfig)();
12
+ const handleSubmit = async (...args) => {
13
+ const result = await backupCodeLogin(...args);
14
+ if ('token' in result && onSuccess) {
15
+ onSuccess();
16
+ }
17
+ return result;
18
+ };
19
+ return ((0, jsx_runtime_1.jsx)(BackupCodeLoginForm_1.BackupCodeLoginForm, { onSubmit: handleSubmit, onNavigate: navigate, isAuthenticated: isAuthenticated, ...componentProps }));
20
+ };
21
+ exports.BackupCodeLoginWrapper = BackupCodeLoginWrapper;
@@ -0,0 +1,7 @@
1
+ import { FC } from 'react';
2
+ import { BackupCodesForm } from '../components/BackupCodesForm';
3
+ export interface BackupCodesWrapperProps {
4
+ componentProps?: Partial<React.ComponentProps<typeof BackupCodesForm>>;
5
+ }
6
+ export declare const BackupCodesWrapper: FC<BackupCodesWrapperProps>;
7
+ //# sourceMappingURL=BackupCodesWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackupCodesWrapper.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/wrappers/BackupCodesWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;CACxE;AAED,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAkB1D,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BackupCodesWrapper = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_router_dom_1 = require("react-router-dom");
6
+ const BackupCodesForm_1 = require("../components/BackupCodesForm");
7
+ const hooks_1 = require("../hooks");
8
+ const BackupCodesWrapper = ({ componentProps = {}, }) => {
9
+ const location = (0, react_router_dom_1.useLocation)();
10
+ const initialCodeCount = location.state?.codeCount ?? null;
11
+ const { backupCodesRemaining, generateBackupCodes } = (0, hooks_1.useBackupCodes)({ initialCodeCount });
12
+ const handleSubmit = async (values) => {
13
+ return await generateBackupCodes(values.password, values.mnemonic);
14
+ };
15
+ return ((0, jsx_runtime_1.jsx)(BackupCodesForm_1.BackupCodesForm, { onSubmit: handleSubmit, backupCodesRemaining: backupCodesRemaining, ...componentProps }));
16
+ };
17
+ exports.BackupCodesWrapper = BackupCodesWrapper;
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ import { ChangePasswordForm } from '../components/ChangePasswordForm';
3
+ export interface ChangePasswordFormWrapperProps {
4
+ onSuccess?: () => void;
5
+ componentProps?: Partial<React.ComponentProps<typeof ChangePasswordForm>>;
6
+ }
7
+ export declare const ChangePasswordFormWrapper: FC<ChangePasswordFormWrapperProps>;
8
+ //# sourceMappingURL=ChangePasswordFormWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangePasswordFormWrapper.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/wrappers/ChangePasswordFormWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAGtE,MAAM,WAAW,8BAA8B;IAC7C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;CAC3E;AAED,eAAO,MAAM,yBAAyB,EAAE,EAAE,CAAC,8BAA8B,CAqBxE,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChangePasswordFormWrapper = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const ChangePasswordForm_1 = require("../components/ChangePasswordForm");
6
+ const contexts_1 = require("../contexts");
7
+ const ChangePasswordFormWrapper = ({ onSuccess, componentProps = {}, }) => {
8
+ const { changePassword } = (0, contexts_1.useAuth)();
9
+ const handleSubmit = async (values) => {
10
+ const result = await changePassword(values.currentPassword, values.newPassword);
11
+ if ('error' in result) {
12
+ throw new Error(result.error);
13
+ }
14
+ if (onSuccess) {
15
+ onSuccess();
16
+ }
17
+ return result;
18
+ };
19
+ return (0, jsx_runtime_1.jsx)(ChangePasswordForm_1.ChangePasswordForm, { onSubmit: handleSubmit, ...componentProps });
20
+ };
21
+ exports.ChangePasswordFormWrapper = ChangePasswordFormWrapper;
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ import { LoginFormProps } from '../components/LoginForm';
3
+ export interface LoginFormWrapperProps {
4
+ onSuccess?: () => void;
5
+ redirectTo?: string;
6
+ componentProps?: Partial<Omit<LoginFormProps, 'onSubmit'>>;
7
+ }
8
+ export declare const LoginFormWrapper: FC<LoginFormWrapperProps>;
9
+ //# sourceMappingURL=LoginFormWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoginFormWrapper.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/wrappers/LoginFormWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAG3B,OAAO,EAA8B,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIrF,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC;CAC5D;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA6CtD,CAAC"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoginFormWrapper = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_router_dom_1 = require("react-router-dom");
6
+ const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
7
+ const LoginForm_1 = require("../components/LoginForm");
8
+ const contexts_1 = require("../contexts");
9
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
10
+ const LoginFormWrapper = ({ onSuccess, redirectTo, componentProps = {}, }) => {
11
+ const { directLogin, passwordLogin } = (0, contexts_1.useAuth)();
12
+ const navigate = (0, react_router_dom_1.useNavigate)();
13
+ const { routes } = (0, contexts_1.useSuiteConfig)();
14
+ const handleSubmit = async (values) => {
15
+ const email = values.email && values.email.trim().length > 0 ? new ecies_lib_1.EmailString(values.email) : undefined;
16
+ const username = values.username && values.username.trim() ? values.username : undefined;
17
+ if (values.password) {
18
+ const result = await passwordLogin(new ecies_lib_1.SecureString(values.password), username, email);
19
+ if ('error' in result) {
20
+ throw new Error(result.error);
21
+ }
22
+ if (onSuccess) {
23
+ onSuccess();
24
+ }
25
+ navigate(redirectTo || routes.dashboard || '/dashboard');
26
+ }
27
+ else if (values.mnemonic) {
28
+ const result = await directLogin(new ecies_lib_1.SecureString(values.mnemonic), username, email);
29
+ if ('error' in result) {
30
+ throw new Error(result.error);
31
+ }
32
+ if (onSuccess) {
33
+ onSuccess();
34
+ }
35
+ navigate(redirectTo || routes.dashboard || '/dashboard');
36
+ }
37
+ else {
38
+ throw new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Error_NoPasswordOrMnemonicProvided);
39
+ }
40
+ };
41
+ return (0, jsx_runtime_1.jsx)(LoginForm_1.LoginForm, { onSubmit: handleSubmit, ...componentProps });
42
+ };
43
+ exports.LoginFormWrapper = LoginFormWrapper;
@@ -0,0 +1,9 @@
1
+ import { FC } from 'react';
2
+ import { LogoutPage } from '../components/LogoutPage';
3
+ export interface LogoutPageWrapperProps {
4
+ onSuccess?: () => void;
5
+ redirectTo?: string;
6
+ componentProps?: Partial<React.ComponentProps<typeof LogoutPage>>;
7
+ }
8
+ export declare const LogoutPageWrapper: FC<LogoutPageWrapperProps>;
9
+ //# sourceMappingURL=LogoutPageWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogoutPageWrapper.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/wrappers/LogoutPageWrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtD,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC;CACnE;AAED,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAkBxD,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LogoutPageWrapper = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_router_dom_1 = require("react-router-dom");
6
+ const LogoutPage_1 = require("../components/LogoutPage");
7
+ const contexts_1 = require("../contexts");
8
+ const LogoutPageWrapper = ({ onSuccess, redirectTo, componentProps = {}, }) => {
9
+ const { logout } = (0, contexts_1.useAuth)();
10
+ const navigate = (0, react_router_dom_1.useNavigate)();
11
+ const { routes } = (0, contexts_1.useSuiteConfig)();
12
+ const handleLogout = async () => {
13
+ await logout();
14
+ if (onSuccess) {
15
+ onSuccess();
16
+ }
17
+ navigate(redirectTo || routes.login || '/login');
18
+ };
19
+ return (0, jsx_runtime_1.jsx)(LogoutPage_1.LogoutPage, { onLogout: handleLogout, onNavigate: navigate, ...componentProps });
20
+ };
21
+ exports.LogoutPageWrapper = LogoutPageWrapper;