@digitaldefiance/express-suite-react-components 2.1.35 → 2.1.37

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 (47) hide show
  1. package/README.md +10 -0
  2. package/package.json +3 -3
  3. package/src/auth/Private.js +11 -0
  4. package/src/auth/PrivateRoute.js +16 -0
  5. package/src/auth/UnAuthRoute.js +16 -0
  6. package/src/auth/index.js +6 -0
  7. package/src/components/ApiAccess.js +67 -0
  8. package/src/components/BackupCodeLoginForm.js +101 -0
  9. package/src/components/BackupCodesForm.js +107 -0
  10. package/src/components/ChangePasswordForm.js +65 -0
  11. package/src/components/ConfirmationDialog.js +9 -0
  12. package/src/components/CurrencyCodeSelector.js +30 -0
  13. package/src/components/CurrencyInput.js +28 -0
  14. package/src/components/DashboardPage.js +9 -0
  15. package/src/components/DropdownMenu.js +43 -0
  16. package/src/components/ExpirationSecondsSelector.js +31 -0
  17. package/src/components/Flag.js +29 -0
  18. package/src/components/ForgotPasswordForm.js +53 -0
  19. package/src/components/LoginForm.js +81 -0
  20. package/src/components/LogoutPage.js +15 -0
  21. package/src/components/RegisterForm.js +103 -0
  22. package/src/components/ResetPasswordForm.js +67 -0
  23. package/src/components/SideMenu.js +10 -0
  24. package/src/components/SideMenuListItem.js +38 -0
  25. package/src/components/TopMenu.js +14 -0
  26. package/src/components/TranslatedTitle.js +11 -0
  27. package/src/components/UserLanguageSelector.js +22 -0
  28. package/src/components/VerifyEmailPage.js +60 -0
  29. package/src/components/index.js +26 -0
  30. package/src/contexts/I18nProvider.js +46 -0
  31. package/src/contexts/ThemeProvider.js +33 -0
  32. package/src/contexts/index.js +5 -0
  33. package/src/enumerations/IncludeOnMenu.js +9 -0
  34. package/src/enumerations/index.js +4 -0
  35. package/src/hooks/index.js +5 -0
  36. package/src/hooks/useExpiringValue.js +53 -0
  37. package/src/hooks/useLocalStorage.js +15 -0
  38. package/src/index.js +12 -0
  39. package/src/interfaces/AppConfig.js +2 -0
  40. package/src/interfaces/IMenuOption.js +2 -0
  41. package/src/interfaces/index.js +5 -0
  42. package/src/services/api.js +14 -0
  43. package/src/services/authenticatedApi.js +18 -0
  44. package/src/services/index.js +5 -0
  45. package/src/types/expirationSeconds.js +17 -0
  46. package/src/types/index.js +5 -0
  47. package/src/types/translation.js +9 -0
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThemeToggleButton = exports.AppThemeProvider = exports.useTheme = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const icons_material_1 = require("@mui/icons-material");
6
+ const material_1 = require("@mui/material");
7
+ const react_1 = require("react");
8
+ const ThemeContext = (0, react_1.createContext)(undefined);
9
+ const useTheme = () => {
10
+ const context = (0, react_1.useContext)(ThemeContext);
11
+ if (!context) {
12
+ throw new Error('useTheme must be used within an AppThemeProvider');
13
+ }
14
+ return context;
15
+ };
16
+ exports.useTheme = useTheme;
17
+ const AppThemeProvider = ({ children, customTheme }) => {
18
+ const [mode, setMode] = (0, react_1.useState)('light');
19
+ const colorMode = (0, react_1.useMemo)(() => ({
20
+ toggleColorMode: () => {
21
+ setMode((prevMode) => (prevMode === 'light' ? 'dark' : 'light'));
22
+ },
23
+ mode,
24
+ }), [mode]);
25
+ const theme = (0, react_1.useMemo)(() => (customTheme ? customTheme(mode) : (0, material_1.createTheme)({ palette: { mode } })), [mode, customTheme]);
26
+ return ((0, jsx_runtime_1.jsx)(ThemeContext.Provider, { value: colorMode, children: (0, jsx_runtime_1.jsx)(material_1.ThemeProvider, { theme: theme, children: children }) }));
27
+ };
28
+ exports.AppThemeProvider = AppThemeProvider;
29
+ const ThemeToggleButton = () => {
30
+ const { mode, toggleColorMode } = (0, exports.useTheme)();
31
+ return ((0, jsx_runtime_1.jsx)(material_1.IconButton, { onClick: toggleColorMode, color: "inherit", children: mode === 'dark' ? (0, jsx_runtime_1.jsx)(icons_material_1.Brightness7, {}) : (0, jsx_runtime_1.jsx)(icons_material_1.Brightness4, {}) }));
32
+ };
33
+ exports.ThemeToggleButton = ThemeToggleButton;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./I18nProvider"), exports);
5
+ tslib_1.__exportStar(require("./ThemeProvider"), exports);
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IncludeOnMenu = void 0;
4
+ var IncludeOnMenu;
5
+ (function (IncludeOnMenu) {
6
+ IncludeOnMenu[IncludeOnMenu["SideMenu"] = 0] = "SideMenu";
7
+ IncludeOnMenu[IncludeOnMenu["TopMenu"] = 1] = "TopMenu";
8
+ IncludeOnMenu[IncludeOnMenu["UserMenu"] = 2] = "UserMenu";
9
+ })(IncludeOnMenu || (exports.IncludeOnMenu = IncludeOnMenu = {}));
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./IncludeOnMenu"), exports);
@@ -0,0 +1,5 @@
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);
@@ -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,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
+ }
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("./enumerations"), exports);
9
+ tslib_1.__exportStar(require("./hooks"), exports);
10
+ tslib_1.__exportStar(require("./interfaces"), exports);
11
+ tslib_1.__exportStar(require("./services"), exports);
12
+ tslib_1.__exportStar(require("./types"), exports);
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./AppConfig"), exports);
5
+ tslib_1.__exportStar(require("./IMenuOption"), exports);
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createApiClient = createApiClient;
4
+ const tslib_1 = require("tslib");
5
+ const axios_1 = tslib_1.__importDefault(require("axios"));
6
+ function createApiClient(baseURL) {
7
+ const api = axios_1.default.create({ baseURL });
8
+ api.interceptors.request.use((config) => {
9
+ const languageCode = localStorage.getItem('languageCode') ?? 'en-US';
10
+ config.headers['Accept-Language'] = languageCode;
11
+ return config;
12
+ });
13
+ return api;
14
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAuthenticatedApiClient = createAuthenticatedApiClient;
4
+ const tslib_1 = require("tslib");
5
+ const axios_1 = tslib_1.__importDefault(require("axios"));
6
+ function createAuthenticatedApiClient(baseURL, tokenKey = 'authToken') {
7
+ const api = axios_1.default.create({ baseURL });
8
+ api.interceptors.request.use((config) => {
9
+ const token = localStorage.getItem(tokenKey);
10
+ if (token) {
11
+ config.headers['Authorization'] = `Bearer ${token}`;
12
+ }
13
+ const languageCode = localStorage.getItem('languageCode') ?? 'en-US';
14
+ config.headers['Accept-Language'] = languageCode;
15
+ return config;
16
+ });
17
+ return api;
18
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./api"), exports);
5
+ tslib_1.__exportStar(require("./authenticatedApi"), exports);
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExpirationSecondsOptionValues = void 0;
4
+ exports.createExpirationSecondsOptionNames = createExpirationSecondsOptionNames;
5
+ exports.ExpirationSecondsOptionValues = [0, 10, 30, 45, 60, 120, 300, 600];
6
+ function createExpirationSecondsOptionNames(secondsLabel, minuteLabel, minutesLabel) {
7
+ return [
8
+ `0 ${secondsLabel}`,
9
+ `10 ${secondsLabel}`,
10
+ `30 ${secondsLabel}`,
11
+ `45 ${secondsLabel}`,
12
+ `1 ${minuteLabel}`,
13
+ `2 ${minutesLabel}`,
14
+ `5 ${minutesLabel}`,
15
+ `10 ${minutesLabel}`,
16
+ ];
17
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./expirationSeconds"), exports);
5
+ tslib_1.__exportStar(require("./translation"), exports);
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTranslatedText = getTranslatedText;
4
+ /**
5
+ * Helper to get translated text or fallback to provided string
6
+ */
7
+ function getTranslatedText(t, key, fallback, variables) {
8
+ return t ? t(key, variables) : fallback;
9
+ }