@digitaldefiance/express-suite-react-components 5.0.2 → 5.0.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/package.json +5 -4
- package/src/auth/AdminRoute.d.ts +8 -0
- package/src/auth/AdminRoute.d.ts.map +1 -0
- package/src/auth/AdminRoute.js +28 -0
- package/src/auth/Private.d.ts +6 -0
- package/src/auth/Private.d.ts.map +1 -0
- package/src/auth/Private.js +14 -0
- package/src/auth/PrivateRoute.d.ts +8 -0
- package/src/auth/PrivateRoute.d.ts.map +1 -0
- package/src/auth/PrivateRoute.js +23 -0
- package/src/auth/UnAuth.d.ts +6 -0
- package/src/auth/UnAuth.d.ts.map +1 -0
- package/src/auth/UnAuth.js +14 -0
- package/src/auth/UnAuthRoute.d.ts +8 -0
- package/src/auth/UnAuthRoute.d.ts.map +1 -0
- package/src/auth/UnAuthRoute.js +22 -0
- package/src/auth/{index.ts → index.d.ts} +3 -2
- package/src/auth/index.d.ts.map +1 -0
- package/src/auth/index.js +12 -0
- package/src/components/ApiAccess.d.ts +16 -0
- package/src/components/ApiAccess.d.ts.map +1 -0
- package/src/components/ApiAccess.js +77 -0
- package/src/components/BackupCodeLoginForm.d.ts +43 -0
- package/src/components/BackupCodeLoginForm.d.ts.map +1 -0
- package/src/components/BackupCodeLoginForm.js +139 -0
- package/src/components/BackupCodesForm.d.ts +26 -0
- package/src/components/BackupCodesForm.d.ts.map +1 -0
- package/src/components/BackupCodesForm.js +120 -0
- package/src/components/CategoryMenu.d.ts +17 -0
- package/src/components/CategoryMenu.d.ts.map +1 -0
- package/src/components/CategoryMenu.js +65 -0
- package/src/components/ChangePasswordForm.d.ts +26 -0
- package/src/components/ChangePasswordForm.d.ts.map +1 -0
- package/src/components/ChangePasswordForm.js +78 -0
- package/src/components/ConfirmationDialog.d.ts +13 -0
- package/src/components/ConfirmationDialog.d.ts.map +1 -0
- package/src/components/ConfirmationDialog.js +10 -0
- package/src/components/CurrencyCodeSelector.d.ts +9 -0
- package/src/components/CurrencyCodeSelector.d.ts.map +1 -0
- package/src/components/CurrencyCodeSelector.js +31 -0
- package/src/components/CurrencyInput.d.ts +13 -0
- package/src/components/CurrencyInput.d.ts.map +1 -0
- package/src/components/CurrencyInput.js +22 -0
- package/src/components/DashboardPage.d.ts +8 -0
- package/src/components/DashboardPage.d.ts.map +1 -0
- package/src/components/DashboardPage.js +10 -0
- package/src/components/DropdownMenu.d.ts +13 -0
- package/src/components/DropdownMenu.d.ts.map +1 -0
- package/src/components/DropdownMenu.js +63 -0
- package/src/components/ExpirationSecondsSelector.d.ts +13 -0
- package/src/components/ExpirationSecondsSelector.d.ts.map +1 -0
- package/src/components/ExpirationSecondsSelector.js +32 -0
- package/src/components/FakeEmailAdminPanel.d.ts +23 -0
- package/src/components/FakeEmailAdminPanel.d.ts.map +1 -0
- package/src/components/FakeEmailAdminPanel.js +147 -0
- package/src/components/Flag.d.ts +20 -0
- package/src/components/Flag.d.ts.map +1 -0
- package/src/components/Flag.js +43 -0
- package/src/components/ForgotPasswordForm.d.ts +18 -0
- package/src/components/ForgotPasswordForm.d.ts.map +1 -0
- package/src/components/ForgotPasswordForm.js +61 -0
- package/src/components/LoginForm.d.ts +44 -0
- package/src/components/LoginForm.d.ts.map +1 -0
- package/src/components/LoginForm.js +123 -0
- package/src/components/LogoutPage.d.ts +8 -0
- package/src/components/LogoutPage.d.ts.map +1 -0
- package/src/components/LogoutPage.js +16 -0
- package/src/components/RegisterForm.d.ts +100 -0
- package/src/components/RegisterForm.d.ts.map +1 -0
- package/src/components/RegisterForm.js +306 -0
- package/src/components/ResetPasswordForm.d.ts +23 -0
- package/src/components/ResetPasswordForm.d.ts.map +1 -0
- package/src/components/ResetPasswordForm.js +78 -0
- package/src/components/SideMenu.d.ts +8 -0
- package/src/components/SideMenu.d.ts.map +1 -0
- package/src/components/SideMenu.js +25 -0
- package/src/components/SideMenuListItem.d.ts +13 -0
- package/src/components/SideMenuListItem.d.ts.map +1 -0
- package/src/components/SideMenuListItem.js +44 -0
- package/src/components/T.d.ts +7 -0
- package/src/components/T.d.ts.map +1 -0
- package/src/components/T.js +13 -0
- package/src/components/TDiv.d.ts +9 -0
- package/src/components/TDiv.d.ts.map +1 -0
- package/src/components/TDiv.js +14 -0
- package/src/components/TImgAlt.d.ts +10 -0
- package/src/components/TImgAlt.d.ts.map +1 -0
- package/src/components/TImgAlt.js +14 -0
- package/src/components/TopMenu.d.ts +50 -0
- package/src/components/TopMenu.d.ts.map +1 -0
- package/src/components/TopMenu.js +79 -0
- package/src/components/TotpSetupForm.d.ts +24 -0
- package/src/components/TotpSetupForm.d.ts.map +1 -0
- package/src/components/TotpSetupForm.js +82 -0
- package/src/components/TotpVerificationForm.d.ts +23 -0
- package/src/components/TotpVerificationForm.d.ts.map +1 -0
- package/src/components/TotpVerificationForm.js +66 -0
- package/src/components/TranslatedTitle.d.ts +8 -0
- package/src/components/TranslatedTitle.d.ts.map +1 -0
- package/src/components/TranslatedTitle.js +15 -0
- package/src/components/UserLanguageSelector.d.ts +4 -0
- package/src/components/UserLanguageSelector.d.ts.map +1 -0
- package/src/components/UserLanguageSelector.js +31 -0
- package/src/components/UserMenu.d.ts +4 -0
- package/src/components/UserMenu.d.ts.map +1 -0
- package/src/components/UserMenu.js +12 -0
- package/src/components/UserSettingsForm.d.ts +113 -0
- package/src/components/UserSettingsForm.d.ts.map +1 -0
- package/src/components/UserSettingsForm.js +269 -0
- package/src/components/VerifyEmailPage.d.ts +24 -0
- package/src/components/VerifyEmailPage.d.ts.map +1 -0
- package/src/components/VerifyEmailPage.js +81 -0
- package/src/components/{index.ts → index.d.ts} +1 -1
- package/src/components/index.d.ts.map +1 -0
- package/src/components/index.js +35 -0
- package/src/contexts/AuthProvider.d.ts +19 -0
- package/src/contexts/AuthProvider.d.ts.map +1 -0
- package/src/contexts/AuthProvider.js +514 -0
- package/src/contexts/I18nProvider.d.ts +27 -0
- package/src/contexts/I18nProvider.d.ts.map +1 -0
- package/src/contexts/I18nProvider.js +60 -0
- package/src/contexts/MenuContext.d.ts +28 -0
- package/src/contexts/MenuContext.d.ts.map +1 -0
- package/src/contexts/MenuContext.js +307 -0
- package/src/contexts/SuiteConfigProvider.d.ts +44 -0
- package/src/contexts/SuiteConfigProvider.d.ts.map +1 -0
- package/src/contexts/SuiteConfigProvider.js +43 -0
- package/src/contexts/ThemeProvider.d.ts +15 -0
- package/src/contexts/ThemeProvider.d.ts.map +1 -0
- package/src/contexts/ThemeProvider.js +36 -0
- package/src/contexts/auth-context.d.ts +172 -0
- package/src/contexts/auth-context.d.ts.map +1 -0
- package/src/contexts/auth-context.js +13 -0
- package/src/contexts/{index.ts → index.d.ts} +1 -0
- package/src/contexts/index.d.ts.map +1 -0
- package/src/contexts/index.js +8 -0
- package/src/hooks/{index.ts → index.d.ts} +1 -0
- package/src/hooks/index.d.ts.map +1 -0
- package/src/hooks/index.js +9 -0
- package/src/hooks/useAuthenticatedApi.d.ts +34 -0
- package/src/hooks/useAuthenticatedApi.d.ts.map +1 -0
- package/src/hooks/useAuthenticatedApi.js +46 -0
- package/src/hooks/useBackupCodes.d.ts +15 -0
- package/src/hooks/useBackupCodes.d.ts.map +1 -0
- package/src/hooks/useBackupCodes.js +74 -0
- package/src/hooks/useEmailVerification.d.ts +10 -0
- package/src/hooks/useEmailVerification.d.ts.map +1 -0
- package/src/hooks/useEmailVerification.js +40 -0
- package/src/hooks/useExpiringValue.d.ts +14 -0
- package/src/hooks/useExpiringValue.d.ts.map +1 -0
- package/src/hooks/useExpiringValue.js +53 -0
- package/src/hooks/useLocalStorage.d.ts +2 -0
- package/src/hooks/useLocalStorage.d.ts.map +1 -0
- package/src/hooks/useLocalStorage.js +15 -0
- package/src/hooks/useUserSettings.d.ts +48 -0
- package/src/hooks/useUserSettings.d.ts.map +1 -0
- package/src/hooks/useUserSettings.js +171 -0
- package/src/{index.ts → index.d.ts} +1 -1
- package/src/index.d.ts.map +1 -0
- package/src/index.js +12 -0
- package/src/interfaces/IAppConfig.d.ts +8 -0
- package/src/interfaces/IAppConfig.d.ts.map +1 -0
- package/src/interfaces/IAppConfig.js +2 -0
- package/src/interfaces/ICategoryConfig.d.ts +41 -0
- package/src/interfaces/ICategoryConfig.d.ts.map +1 -0
- package/src/interfaces/ICategoryConfig.js +2 -0
- package/src/interfaces/IMenuConfig.d.ts +28 -0
- package/src/interfaces/IMenuConfig.d.ts.map +1 -0
- package/src/interfaces/IMenuConfig.js +2 -0
- package/src/interfaces/IMenuOption.d.ts +82 -0
- package/src/interfaces/IMenuOption.d.ts.map +1 -0
- package/src/interfaces/IMenuOption.js +2 -0
- package/src/interfaces/{index.ts → index.d.ts} +1 -0
- package/src/interfaces/index.d.ts.map +1 -0
- package/src/interfaces/index.js +7 -0
- package/src/services/__mocks__/authService.d.ts +21 -0
- package/src/services/__mocks__/authService.d.ts.map +1 -0
- package/src/services/__mocks__/authService.js +15 -0
- package/src/services/api.d.ts +3 -0
- package/src/services/api.d.ts.map +1 -0
- package/src/services/api.js +14 -0
- package/src/services/authService.d.ts +126 -0
- package/src/services/authService.d.ts.map +1 -0
- package/src/services/authService.js +471 -0
- package/src/services/authenticatedApi.d.ts +3 -0
- package/src/services/authenticatedApi.d.ts.map +1 -0
- package/src/services/authenticatedApi.js +18 -0
- package/src/services/index.d.ts +4 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.js +6 -0
- package/src/types/MenuType.d.ts +11 -0
- package/src/types/MenuType.d.ts.map +1 -0
- package/src/types/MenuType.js +12 -0
- package/src/types/expirationSeconds.d.ts +3 -0
- package/src/types/expirationSeconds.d.ts.map +1 -0
- package/src/types/expirationSeconds.js +17 -0
- package/src/types/index.d.ts +2 -0
- package/src/types/index.d.ts.map +1 -0
- package/src/types/index.js +4 -0
- package/src/types/translation.d.ts +10 -0
- package/src/types/translation.d.ts.map +1 -0
- package/src/types/translation.js +9 -0
- package/src/wrappers/BackupCodeLoginWrapper.d.ts +8 -0
- package/src/wrappers/BackupCodeLoginWrapper.d.ts.map +1 -0
- package/src/wrappers/BackupCodeLoginWrapper.js +20 -0
- package/src/wrappers/BackupCodesWrapper.d.ts +7 -0
- package/src/wrappers/BackupCodesWrapper.d.ts.map +1 -0
- package/src/wrappers/BackupCodesWrapper.js +17 -0
- package/src/wrappers/ChangePasswordFormWrapper.d.ts +8 -0
- package/src/wrappers/ChangePasswordFormWrapper.d.ts.map +1 -0
- package/src/wrappers/ChangePasswordFormWrapper.js +21 -0
- package/src/wrappers/ForgotPasswordFormWrapper.d.ts +8 -0
- package/src/wrappers/ForgotPasswordFormWrapper.d.ts.map +1 -0
- package/src/wrappers/ForgotPasswordFormWrapper.js +29 -0
- package/src/wrappers/LoginFormWrapper.d.ts +21 -0
- package/src/wrappers/LoginFormWrapper.d.ts.map +1 -0
- package/src/wrappers/LoginFormWrapper.js +72 -0
- package/src/wrappers/LogoutPageWrapper.d.ts +9 -0
- package/src/wrappers/LogoutPageWrapper.d.ts.map +1 -0
- package/src/wrappers/LogoutPageWrapper.js +21 -0
- package/src/wrappers/RegisterFormWrapper.d.ts +20 -0
- package/src/wrappers/RegisterFormWrapper.d.ts.map +1 -0
- package/src/wrappers/RegisterFormWrapper.js +51 -0
- package/src/wrappers/ResetPasswordFormWrapper.d.ts +9 -0
- package/src/wrappers/ResetPasswordFormWrapper.d.ts.map +1 -0
- package/src/wrappers/ResetPasswordFormWrapper.js +34 -0
- package/src/wrappers/UserSettingsFormWrapper.d.ts +29 -0
- package/src/wrappers/UserSettingsFormWrapper.d.ts.map +1 -0
- package/src/wrappers/UserSettingsFormWrapper.js +95 -0
- package/src/wrappers/VerifyEmailPageWrapper.d.ts +8 -0
- package/src/wrappers/VerifyEmailPageWrapper.d.ts.map +1 -0
- package/src/wrappers/VerifyEmailPageWrapper.js +21 -0
- package/src/wrappers/{index.tsx → index.d.ts} +1 -10
- package/src/wrappers/index.d.ts.map +1 -0
- package/src/wrappers/index.js +24 -0
- package/LICENSE +0 -21
- package/src/auth/AdminRoute.tsx +0 -54
- package/src/auth/Private.tsx +0 -17
- package/src/auth/PrivateRoute.tsx +0 -28
- package/src/auth/UnAuth.tsx +0 -16
- package/src/auth/UnAuthRoute.tsx +0 -30
- package/src/components/ApiAccess.tsx +0 -175
- package/src/components/BackupCodeLoginForm.tsx +0 -489
- package/src/components/BackupCodesForm.tsx +0 -287
- package/src/components/CategoryMenu.tsx +0 -155
- package/src/components/ChangePasswordForm.tsx +0 -273
- package/src/components/ConfirmationDialog.tsx +0 -48
- package/src/components/CurrencyCodeSelector.tsx +0 -60
- package/src/components/CurrencyInput.tsx +0 -80
- package/src/components/DashboardPage.tsx +0 -24
- package/src/components/DropdownMenu.tsx +0 -105
- package/src/components/ExpirationSecondsSelector.tsx +0 -60
- package/src/components/FakeEmailAdminPanel.tsx +0 -374
- package/src/components/Flag.tsx +0 -52
- package/src/components/ForgotPasswordForm.tsx +0 -174
- package/src/components/LoginForm.tsx +0 -468
- package/src/components/LogoutPage.tsx +0 -21
- package/src/components/RegisterForm.tsx +0 -1169
- package/src/components/ResetPasswordForm.tsx +0 -247
- package/src/components/SideMenu.tsx +0 -46
- package/src/components/SideMenuListItem.tsx +0 -75
- package/src/components/T.tsx +0 -24
- package/src/components/TDiv.tsx +0 -26
- package/src/components/TImgAlt.tsx +0 -28
- package/src/components/TopMenu.tsx +0 -252
- package/src/components/TotpSetupForm.tsx +0 -188
- package/src/components/TotpVerificationForm.tsx +0 -148
- package/src/components/TranslatedTitle.tsx +0 -31
- package/src/components/UserLanguageSelector.tsx +0 -45
- package/src/components/UserMenu.tsx +0 -15
- package/src/components/UserSettingsForm.tsx +0 -904
- package/src/components/VerifyEmailPage.tsx +0 -222
- package/src/components/__tests__/RegisterForm.totp.spec.tsx +0 -377
- package/src/components/__tests__/TotpSetupForm.spec.tsx +0 -258
- package/src/components/__tests__/TotpVerificationForm.spec.tsx +0 -259
- package/src/components/__tests__/UserSettingsForm.totp.spec.tsx +0 -396
- package/src/contexts/AuthProvider.spec.tsx +0 -1284
- package/src/contexts/AuthProvider.tsx +0 -977
- package/src/contexts/I18nProvider.tsx +0 -164
- package/src/contexts/MenuContext.tsx +0 -426
- package/src/contexts/SuiteConfigProvider.tsx +0 -93
- package/src/contexts/ThemeProvider.tsx +0 -67
- package/src/hooks/useAuthenticatedApi.tsx +0 -67
- package/src/hooks/useBackupCodes.ts +0 -105
- package/src/hooks/useEmailVerification.ts +0 -54
- package/src/hooks/useExpiringValue.ts +0 -78
- package/src/hooks/useLocalStorage.ts +0 -18
- package/src/hooks/useUserSettings.ts +0 -271
- package/src/interfaces/IAppConfig.ts +0 -7
- package/src/interfaces/ICategoryConfig.ts +0 -41
- package/src/interfaces/IMenuConfig.ts +0 -28
- package/src/interfaces/IMenuOption.ts +0 -79
- package/src/services/__mocks__/authService.ts +0 -14
- package/src/services/__tests__/authService.totp.property.spec.ts +0 -360
- package/src/services/__tests__/authService.totp.spec.ts +0 -439
- package/src/services/api.ts +0 -13
- package/src/services/authService.ts +0 -692
- package/src/services/authenticatedApi.ts +0 -17
- package/src/services/index.ts +0 -3
- package/src/types/MenuType.ts +0 -15
- package/src/types/expirationSeconds.ts +0 -18
- package/src/types/index.ts +0 -1
- package/src/types/translation.ts +0 -20
- package/src/wrappers/BackupCodeLoginWrapper.tsx +0 -34
- package/src/wrappers/BackupCodesWrapper.tsx +0 -28
- package/src/wrappers/ChangePasswordFormWrapper.tsx +0 -34
- package/src/wrappers/ForgotPasswordFormWrapper.tsx +0 -45
- package/src/wrappers/LoginFormWrapper.tsx +0 -108
- package/src/wrappers/LogoutPageWrapper.tsx +0 -30
- package/src/wrappers/RegisterFormWrapper.tsx +0 -109
- package/src/wrappers/ResetPasswordFormWrapper.tsx +0 -57
- package/src/wrappers/UserSettingsFormWrapper.tsx +0 -140
- package/src/wrappers/VerifyEmailPageWrapper.tsx +0 -27
- package/src/wrappers/__tests__/LoginFormWrapper.totp.spec.tsx +0 -339
|
@@ -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);
|
|
@@ -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;
|
|
@@ -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":"AAQA,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,CACX,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD;AAED,eAAO,MAAM,oBAAoB,QAAO,0BAqCvC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useEmailVerification = 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 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 = (0, react_1.useCallback)(async (verificationToken) => {
|
|
14
|
+
setIsVerifying(true);
|
|
15
|
+
setError(null);
|
|
16
|
+
try {
|
|
17
|
+
const result = await api.post('/user/verify-email', {
|
|
18
|
+
token: verificationToken,
|
|
19
|
+
});
|
|
20
|
+
return { success: true, message: result.data.message };
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
const axiosError = err;
|
|
24
|
+
const errorMessage = axiosError.response?.data?.message ||
|
|
25
|
+
(0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Error_VerificationFailed);
|
|
26
|
+
const error = new Error(errorMessage);
|
|
27
|
+
setError(error);
|
|
28
|
+
return { success: false, message: errorMessage };
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
setIsVerifying(false);
|
|
32
|
+
}
|
|
33
|
+
}, [api]);
|
|
34
|
+
return {
|
|
35
|
+
isVerifying,
|
|
36
|
+
error,
|
|
37
|
+
verifyEmail,
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
exports.useEmailVerification = useEmailVerification;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface TimerInfo {
|
|
2
|
+
timeout: NodeJS.Timeout;
|
|
3
|
+
startTime: number;
|
|
4
|
+
durationMs: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ExpiringValueReturn<T> {
|
|
7
|
+
value: T | undefined;
|
|
8
|
+
setValue: (newValue: T, durationSeconds?: number, saveToStorage?: boolean) => () => void;
|
|
9
|
+
clearValue: () => void;
|
|
10
|
+
getRemainingTime: () => number;
|
|
11
|
+
isActive: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function useExpiringValue<T>(defaultDurationSeconds: number, localStorageKey?: string): ExpiringValueReturn<T>;
|
|
14
|
+
//# sourceMappingURL=useExpiringValue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useExpiringValue.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/useExpiringValue.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC;IACrB,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;IACzF,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,sBAAsB,EAAE,MAAM,EAC9B,eAAe,CAAC,EAAE,MAAM,GACvB,mBAAmB,CAAC,CAAC,CAAC,CA0DxB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useExpiringValue = useExpiringValue;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
function useExpiringValue(defaultDurationSeconds, localStorageKey) {
|
|
6
|
+
const [value, _setValue] = (0, react_1.useState)(undefined);
|
|
7
|
+
const [timer, setTimer] = (0, react_1.useState)(undefined);
|
|
8
|
+
const [durationSeconds, _setDurationSeconds] = (0, react_1.useState)(() => {
|
|
9
|
+
if (localStorageKey) {
|
|
10
|
+
const stored = localStorage.getItem(localStorageKey);
|
|
11
|
+
return stored ? parseInt(stored, 10) : defaultDurationSeconds;
|
|
12
|
+
}
|
|
13
|
+
return defaultDurationSeconds;
|
|
14
|
+
});
|
|
15
|
+
const getRemainingTime = (0, react_1.useCallback)(() => {
|
|
16
|
+
if (!timer)
|
|
17
|
+
return 0;
|
|
18
|
+
const elapsed = Date.now() - timer.startTime;
|
|
19
|
+
const remaining = Math.max(0, timer.durationMs - elapsed);
|
|
20
|
+
return Math.ceil(remaining / 1000);
|
|
21
|
+
}, [timer]);
|
|
22
|
+
const setValue = (0, react_1.useCallback)((newValue, customDurationSeconds, saveToStorage) => {
|
|
23
|
+
const finalDurationSeconds = customDurationSeconds ?? durationSeconds;
|
|
24
|
+
if (saveToStorage && customDurationSeconds !== undefined && localStorageKey) {
|
|
25
|
+
_setDurationSeconds(customDurationSeconds);
|
|
26
|
+
localStorage.setItem(localStorageKey, customDurationSeconds.toString());
|
|
27
|
+
}
|
|
28
|
+
_setValue(newValue);
|
|
29
|
+
if (timer) {
|
|
30
|
+
clearTimeout(timer.timeout);
|
|
31
|
+
}
|
|
32
|
+
const startTime = Date.now();
|
|
33
|
+
const durationMs = finalDurationSeconds * 1000;
|
|
34
|
+
const timeout = setTimeout(() => {
|
|
35
|
+
_setValue(undefined);
|
|
36
|
+
setTimer(undefined);
|
|
37
|
+
}, durationMs);
|
|
38
|
+
setTimer({ timeout, startTime, durationMs });
|
|
39
|
+
return () => {
|
|
40
|
+
clearTimeout(timeout);
|
|
41
|
+
setTimer(undefined);
|
|
42
|
+
};
|
|
43
|
+
}, [durationSeconds, timer, localStorageKey]);
|
|
44
|
+
const clearValue = (0, react_1.useCallback)(() => {
|
|
45
|
+
if (timer) {
|
|
46
|
+
clearTimeout(timer.timeout);
|
|
47
|
+
setTimer(undefined);
|
|
48
|
+
}
|
|
49
|
+
_setValue(undefined);
|
|
50
|
+
}, [timer]);
|
|
51
|
+
const isActive = Boolean(timer && value !== undefined);
|
|
52
|
+
return { value, setValue, clearValue, getRemainingTime, isActive };
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLocalStorage.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/hooks/useLocalStorage.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,CAAC,GACd,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC,CAWzB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useLocalStorage = useLocalStorage;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
|
|
6
|
+
function useLocalStorage(key, defaultValue) {
|
|
7
|
+
const [storedValue, setStoredValue] = (0, react_1.useState)(() => {
|
|
8
|
+
return suite_core_lib_1.LocalStorageManager.getValue(key, defaultValue);
|
|
9
|
+
});
|
|
10
|
+
const setValue = (0, react_1.useCallback)((value) => {
|
|
11
|
+
setStoredValue(value);
|
|
12
|
+
suite_core_lib_1.LocalStorageManager.setValue(key, value);
|
|
13
|
+
}, [key]);
|
|
14
|
+
return [storedValue, setValue];
|
|
15
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { IUserSettings, IUserSettingsDTO } from '@digitaldefiance/suite-core-lib';
|
|
2
|
+
export interface UseUserSettingsOptions {
|
|
3
|
+
authenticatedApi: {
|
|
4
|
+
post: <T = unknown>(url: string, data: Record<string, unknown>) => Promise<{
|
|
5
|
+
data: T;
|
|
6
|
+
}>;
|
|
7
|
+
};
|
|
8
|
+
isAuthenticated: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface UseUserSettingsResult {
|
|
11
|
+
currentLanguage: string;
|
|
12
|
+
changeLanguage: (languageCode: string) => Promise<void>;
|
|
13
|
+
userSettings: IUserSettings | undefined;
|
|
14
|
+
setUserSettingAndUpdateSettings: (setting?: Partial<IUserSettings>) => Promise<void>;
|
|
15
|
+
toggleColorMode: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Hook for managing user settings state and synchronization.
|
|
19
|
+
* Used by AuthProvider to handle user settings logic.
|
|
20
|
+
*/
|
|
21
|
+
export declare const useUserSettings: ({ authenticatedApi, isAuthenticated, }: UseUserSettingsOptions) => UseUserSettingsResult;
|
|
22
|
+
export interface UserSettingsValues extends IUserSettingsDTO {
|
|
23
|
+
[key: string]: string | boolean | undefined;
|
|
24
|
+
}
|
|
25
|
+
export interface UseUserSettingsPublicResult {
|
|
26
|
+
settings: UserSettingsValues | null;
|
|
27
|
+
isLoading: boolean;
|
|
28
|
+
error: Error | null;
|
|
29
|
+
updateSettings: (values: UserSettingsValues) => Promise<{
|
|
30
|
+
success: boolean;
|
|
31
|
+
message: string;
|
|
32
|
+
} | {
|
|
33
|
+
error: string;
|
|
34
|
+
errorType?: string;
|
|
35
|
+
field?: string;
|
|
36
|
+
errors?: Array<{
|
|
37
|
+
path: string;
|
|
38
|
+
msg: string;
|
|
39
|
+
}>;
|
|
40
|
+
}>;
|
|
41
|
+
refreshSettings: () => Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Public hook for components to manage user settings.
|
|
45
|
+
* Provides a simpler API for fetching and updating settings.
|
|
46
|
+
*/
|
|
47
|
+
export declare const useUserSettingsPublic: () => UseUserSettingsPublicResult;
|
|
48
|
+
//# 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":"AAQA,OAAO,EAGL,aAAa,EACb,gBAAgB,EAGjB,MAAM,iCAAiC,CAAC;AAYzC,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC;YAAE,IAAI,EAAE,CAAC,CAAA;SAAE,CAAC,CAAC;KAC3B,CAAC;IACF,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,YAAY,EAAE,aAAa,GAAG,SAAS,CAAC;IACxC,+BAA+B,EAAE,CAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,KAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,wCAG7B,sBAAsB,KAAG,qBAsF3B,CAAC;AAGF,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAC1D,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,2BAA2B;IAC1C,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,CACnD;QACE,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;KACjB,GACD;QACE,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,CACJ,CAAC;IACF,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAO,2BAoGxC,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useUserSettingsPublic = exports.useUserSettings = void 0;
|
|
4
|
+
const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
|
|
5
|
+
const i18n_lib_1 = require("@digitaldefiance/i18n-lib");
|
|
6
|
+
const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
|
|
7
|
+
const react_1 = require("react");
|
|
8
|
+
const contexts_1 = require("../contexts");
|
|
9
|
+
const defaultUserSettings = {
|
|
10
|
+
darkMode: false,
|
|
11
|
+
currency: new i18n_lib_1.CurrencyCode(i18n_lib_1.DefaultCurrencyCode),
|
|
12
|
+
timezone: new i18n_lib_1.Timezone(i18n_lib_1.DefaultTimezone),
|
|
13
|
+
siteLanguage: i18n_lib_1.DefaultLanguageCode,
|
|
14
|
+
directChallenge: false,
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Hook for managing user settings state and synchronization.
|
|
18
|
+
* Used by AuthProvider to handle user settings logic.
|
|
19
|
+
*/
|
|
20
|
+
const useUserSettings = ({ authenticatedApi, isAuthenticated, }) => {
|
|
21
|
+
const { setColorMode: themeSetPaletteMode, mode: currentThemeMode } = (0, contexts_1.useTheme)();
|
|
22
|
+
const { currentLanguage, changeLanguage } = (0, contexts_1.useI18n)();
|
|
23
|
+
const [userSettings, setUserSettings] = (0, react_1.useState)(undefined);
|
|
24
|
+
const setUserSettingAndUpdateSettings = (0, react_1.useCallback)(async (setting) => {
|
|
25
|
+
if (setting) {
|
|
26
|
+
// Merge settings with defaults and existing settings
|
|
27
|
+
const merged = {
|
|
28
|
+
...defaultUserSettings,
|
|
29
|
+
...(userSettings ? userSettings : {}),
|
|
30
|
+
...setting,
|
|
31
|
+
};
|
|
32
|
+
// TypeScript requires all IUserSettings fields, but during initialization
|
|
33
|
+
// some fields like email may not be set yet. We'll use Partial until
|
|
34
|
+
// all required fields are available.
|
|
35
|
+
setUserSettings(merged);
|
|
36
|
+
if (setting.darkMode !== undefined) {
|
|
37
|
+
themeSetPaletteMode(setting.darkMode ? 'dark' : 'light');
|
|
38
|
+
}
|
|
39
|
+
if (setting.siteLanguage !== undefined &&
|
|
40
|
+
setting.siteLanguage !== currentLanguage) {
|
|
41
|
+
await changeLanguage(setting.siteLanguage);
|
|
42
|
+
}
|
|
43
|
+
// Send to server if authenticated and we have complete settings (including email)
|
|
44
|
+
if (isAuthenticated && merged.email) {
|
|
45
|
+
const dehydratedSettings = (0, suite_core_lib_1.dehydrateUserSettings)(merged);
|
|
46
|
+
await authenticatedApi.post('/user/settings', dehydratedSettings);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
setUserSettings(undefined);
|
|
51
|
+
themeSetPaletteMode('light');
|
|
52
|
+
}
|
|
53
|
+
}, [
|
|
54
|
+
isAuthenticated,
|
|
55
|
+
userSettings,
|
|
56
|
+
currentLanguage,
|
|
57
|
+
changeLanguage,
|
|
58
|
+
themeSetPaletteMode,
|
|
59
|
+
authenticatedApi,
|
|
60
|
+
]);
|
|
61
|
+
const changeLanguageSetting = (0, react_1.useCallback)(async (languageCode) => {
|
|
62
|
+
await setUserSettingAndUpdateSettings({ siteLanguage: languageCode });
|
|
63
|
+
}, [setUserSettingAndUpdateSettings]);
|
|
64
|
+
const toggleColorMode = (0, react_1.useCallback)(async () => {
|
|
65
|
+
// When not authenticated, read from the current theme mode
|
|
66
|
+
// When authenticated, read from userSettings (synced with server)
|
|
67
|
+
const currentDarkMode = isAuthenticated
|
|
68
|
+
? userSettings?.darkMode ?? false
|
|
69
|
+
: currentThemeMode === 'dark';
|
|
70
|
+
await setUserSettingAndUpdateSettings({ darkMode: !currentDarkMode });
|
|
71
|
+
}, [
|
|
72
|
+
isAuthenticated,
|
|
73
|
+
userSettings?.darkMode,
|
|
74
|
+
currentThemeMode,
|
|
75
|
+
setUserSettingAndUpdateSettings,
|
|
76
|
+
]);
|
|
77
|
+
return {
|
|
78
|
+
changeLanguage: changeLanguageSetting,
|
|
79
|
+
currentLanguage,
|
|
80
|
+
userSettings,
|
|
81
|
+
setUserSettingAndUpdateSettings,
|
|
82
|
+
toggleColorMode,
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
exports.useUserSettings = useUserSettings;
|
|
86
|
+
/**
|
|
87
|
+
* Public hook for components to manage user settings.
|
|
88
|
+
* Provides a simpler API for fetching and updating settings.
|
|
89
|
+
*/
|
|
90
|
+
const useUserSettingsPublic = () => {
|
|
91
|
+
const { userData, setUserSetting, userSettings } = (0, contexts_1.useAuth)();
|
|
92
|
+
const [settings, setSettings] = (0, react_1.useState)(null);
|
|
93
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(true);
|
|
94
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
95
|
+
const refreshSettings = (0, react_1.useCallback)(async () => {
|
|
96
|
+
setIsLoading(true);
|
|
97
|
+
setError(null);
|
|
98
|
+
try {
|
|
99
|
+
if (userSettings) {
|
|
100
|
+
const dehydratedSettings = (0, suite_core_lib_1.dehydrateUserSettings)(userSettings);
|
|
101
|
+
setSettings(dehydratedSettings);
|
|
102
|
+
}
|
|
103
|
+
else if (userData) {
|
|
104
|
+
const fallback = {
|
|
105
|
+
email: userData.email || '',
|
|
106
|
+
timezone: userData.timezone || 'UTC',
|
|
107
|
+
siteLanguage: userData.siteLanguage || 'en-US',
|
|
108
|
+
currency: userData.currency || 'USD',
|
|
109
|
+
darkMode: userData.darkMode || false,
|
|
110
|
+
directChallenge: userData.directChallenge || false,
|
|
111
|
+
...(userData.displayName !== undefined ? { displayName: userData.displayName } : {}),
|
|
112
|
+
};
|
|
113
|
+
setSettings(fallback);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
setError(err instanceof Error
|
|
118
|
+
? err
|
|
119
|
+
: new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Settings_RetrieveFailure));
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
setIsLoading(false);
|
|
123
|
+
}
|
|
124
|
+
}, [userSettings, userData]);
|
|
125
|
+
(0, react_1.useEffect)(() => {
|
|
126
|
+
refreshSettings();
|
|
127
|
+
}, [refreshSettings]);
|
|
128
|
+
const updateSettings = (0, react_1.useCallback)(async (values) => {
|
|
129
|
+
setIsLoading(true);
|
|
130
|
+
setError(null);
|
|
131
|
+
try {
|
|
132
|
+
await setUserSetting({
|
|
133
|
+
darkMode: values.darkMode,
|
|
134
|
+
currency: new i18n_lib_1.CurrencyCode(values.currency),
|
|
135
|
+
timezone: new i18n_lib_1.Timezone(values.timezone),
|
|
136
|
+
siteLanguage: values.siteLanguage,
|
|
137
|
+
email: new ecies_lib_1.EmailString(values.email),
|
|
138
|
+
directChallenge: values.directChallenge,
|
|
139
|
+
...(values.displayName !== undefined ? { displayName: values.displayName } : {}),
|
|
140
|
+
});
|
|
141
|
+
setSettings(values);
|
|
142
|
+
return {
|
|
143
|
+
success: true,
|
|
144
|
+
message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Settings_SaveSuccess),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
const axiosError = err;
|
|
149
|
+
const errorMessage = axiosError.response?.data?.message ||
|
|
150
|
+
(0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Settings_UpdateFailed);
|
|
151
|
+
setError(err instanceof Error ? err : new Error(errorMessage));
|
|
152
|
+
return {
|
|
153
|
+
error: errorMessage,
|
|
154
|
+
errorType: axiosError.response?.data?.errorType,
|
|
155
|
+
field: axiosError.response?.data?.field,
|
|
156
|
+
errors: axiosError.response?.data?.errors,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
setIsLoading(false);
|
|
161
|
+
}
|
|
162
|
+
}, [setUserSetting]);
|
|
163
|
+
return {
|
|
164
|
+
settings,
|
|
165
|
+
isLoading,
|
|
166
|
+
error,
|
|
167
|
+
updateSettings,
|
|
168
|
+
refreshSettings,
|
|
169
|
+
};
|
|
170
|
+
};
|
|
171
|
+
exports.useUserSettingsPublic = useUserSettingsPublic;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// Export all components
|
|
2
1
|
export * from './auth';
|
|
3
2
|
export * from './components';
|
|
4
3
|
export * from './contexts';
|
|
@@ -7,3 +6,4 @@ export * from './interfaces';
|
|
|
7
6
|
export * from './services';
|
|
8
7
|
export * from './types';
|
|
9
8
|
export * from './wrappers';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../packages/digitaldefiance-express-suite-react-components/src/index.ts"],"names":[],"mappings":"AACA,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC"}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
// Export all components
|
|
5
|
+
tslib_1.__exportStar(require("./auth"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./components"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./contexts"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./hooks"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./interfaces"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./services"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./types"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./wrappers"), exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IAppConfig.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-express-suite-react-components/src/interfaces/IAppConfig.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB"}
|