@dashadmin/dash-admin 1.3.72 → 1.3.74-srcfree.1
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/dist/components/tenant/TenancyPlan.js +307 -0
- package/dist/systemResources.js +18 -2
- package/package.json +25 -22
- package/src/AppAsyncWrapper.tsx +0 -42
- package/src/AppWrapper.tsx +0 -45
- package/src/DASHAdmin.tsx +0 -502
- package/src/DASHAdmin.tsx.old +0 -456
- package/src/RoutingWrapper.tsx +0 -143
- package/src/classes/DASHStorageClass.tsx +0 -8
- package/src/components/Input/RichTextField.tsx +0 -27
- package/src/components/Redirect.tsx +0 -46
- package/src/components/avatar/Avatar.tsx +0 -71
- package/src/components/avatar/SingleImageUploader.tsx +0 -107
- package/src/components/currency/Format.tsx +0 -79
- package/src/components/custom/Redirect.tsx +0 -23
- package/src/components/error/Error.tsx +0 -168
- package/src/components/geocoding/GeocodingField.tsx +0 -167
- package/src/components/i18n/BridgedLocalesMenuButton.tsx +0 -160
- package/src/components/i18n/LangSwitcher.tsx +0 -204
- package/src/components/loader/GlobalLoader.tsx +0 -49
- package/src/components/logs/LogFile.tsx +0 -88
- package/src/components/logs/LogFileById.tsx +0 -68
- package/src/components/logs/LogViewer.tsx +0 -43
- package/src/components/menu/AppMenu.tsx +0 -22
- package/src/components/menu/CustomMenuItemLink.tsx +0 -61
- package/src/components/menu/DarkToggleMode.tsx +0 -65
- package/src/components/menu/LanguageToggleMode.tsx +0 -120
- package/src/components/misc/CustomImageInput.tsx +0 -62
- package/src/components/misc/DASHGlobalErrorHandler.tsx +0 -194
- package/src/components/misc/DarkModeSwitcher.tsx +0 -112
- package/src/components/misc/HorizontalScroller.tsx +0 -225
- package/src/components/misc/LanguageSwitcher.tsx +0 -199
- package/src/components/misc/MUIHtmlToolTip.tsx +0 -15
- package/src/components/misc/MuiSimpleJsonTable.tsx +0 -279
- package/src/components/misc/MultiLevelTable.tsx +0 -229
- package/src/components/misc/NoResults.tsx +0 -28
- package/src/components/misc/PDFViewer.tsx +0 -85
- package/src/components/navigation/Breadcrumbs.tsx +0 -220
- package/src/components/navigation/BreadcrumbsManager.tsx +0 -310
- package/src/components/navigation/index.tsx +0 -5
- package/src/components/panel/Error.tsx +0 -168
- package/src/components/permission/AvailablePermissionsContext.tsx +0 -173
- package/src/components/permission/PermissionsSelector.tsx +0 -834
- package/src/components/permission/PermissionsSelectorList.tsx +0 -473
- package/src/components/permission/tsx +0 -0
- package/src/components/racustombuttons/CustomRAButton.tsx +0 -87
- package/src/components/racustombuttons/QuickButton.tsx +0 -117
- package/src/components/racustombuttons/QuickEditButton.tsx +0 -115
- package/src/components/racustombuttons/QuickIconButton.tsx +0 -122
- package/src/components/scrollbar/Scrollbar.tsx +0 -31
- package/src/components/selects/MultiSelect.tsx +0 -53
- package/src/components/selects/RASearchableSelect.tsx +0 -282
- package/src/components/selects/RASearchableSelectChips.tsx +0 -308
- package/src/components/selects/SearchableSelect.tsx +0 -139
- package/src/components/serviceAccount/ApiKeyRevealDialog.tsx +0 -129
- package/src/components/serviceAccount/ServiceAccountStatusSwitch.tsx +0 -99
- package/src/components/subscription/BillingCycleSelectInput.tsx +0 -68
- package/src/components/subscription/PlanAddonsSettings.tsx +0 -563
- package/src/components/subscription/PlanAuditLog.tsx +0 -453
- package/src/components/subscription/PlanFeaturesSettings.tsx +0 -243
- package/src/components/subscription/PlanLimitsSettings.tsx +0 -230
- package/src/components/subscription/PlanMetadataSettings.tsx +0 -306
- package/src/components/subscription/PlanPricesSettings.tsx +0 -307
- package/src/components/subscription/index.ts +0 -7
- package/src/components/svgelements/SvgLoading.tsx +0 -229
- package/src/components/svgelements/SvgLogo.tsx +0 -53
- package/src/components/svgelements/SvgLogoMin.tsx +0 -64
- package/src/components/svgelements/SvgShipping.tsx +0 -673
- package/src/components/tenancy/GlobalTenantWrapper.tsx +0 -84
- package/src/components/tenancy/TenantSwitcher.tsx +0 -514
- package/src/components/tenant/AvailablePermissionsContext.tsx +0 -0
- package/src/components/tenant/SettingsSections.tsx +0 -151
- package/src/components/tenant/TenancySettings.tsx +0 -122
- package/src/components/tenant/TenantAttributes.tsx +0 -153
- package/src/components/tenant/TenantAttributesContext.tsx +0 -163
- package/src/components/tenant/TenantSelector.tsx +0 -142
- package/src/components/tenant/TenantSettings.tsx +0 -184
- package/src/components/tenant/TenantSettingsContext.tsx +0 -165
- package/src/components/tenant/TenantTheme.tsx +0 -172
- package/src/components/user/AvatarComponent.tsx +0 -317
- package/src/components/user/TenantAvatarComponent.tsx +0 -99
- package/src/components/user/UserPreferences.tsx +0 -677
- package/src/config/ACTIONS.tsx +0 -26
- package/src/config/ConstantsService.tsx +0 -44
- package/src/config/DASHAdminSystemConstants.tsx +0 -183
- package/src/config/PARSERS.tsx +0 -9
- package/src/contexts/DashQueryClientContext.tsx +0 -113
- package/src/contexts/DashResourceContext.tsx +0 -34
- package/src/contexts/I18nBridgeContext.tsx +0 -156
- package/src/contexts/I18nBridgeSetter.tsx +0 -39
- package/src/contexts/I18nReduxSync.tsx +0 -27
- package/src/contexts/SubscriptionPlanFormatsProvider.tsx +0 -217
- package/src/contexts/SystemRequestsCache.tsx +0 -215
- package/src/contexts/auth/AuthContext.tsx +0 -567
- package/src/contexts/auth/AuthContextLocalStorage.tsx +0 -140
- package/src/contexts/auth/DASHAuthenticationService.tsx +0 -915
- package/src/contexts/auth/WindowContext.tsx +0 -15
- package/src/contexts/auth/index.tsx +0 -3
- package/src/contexts/com/FCMContext.tsx +0 -415
- package/src/contexts/com/LaravelEchoContext.tsx +0 -41
- package/src/contexts/com/LaravelEchoMgr.tsx +0 -155
- package/src/contexts/com/components/DefaultNotificationComponent.tsx +0 -20
- package/src/contexts/com/components/EchoNotificationsCenter.tsx +0 -65
- package/src/contexts/com/components/NotificationAttributesTable.tsx +0 -54
- package/src/contexts/com/components/NotificationRenderer.tsx +0 -42
- package/src/contexts/com/components/NotificationsWidget.tsx +0 -182
- package/src/contexts/com/components/notificationFormats.tsx +0 -50
- package/src/contexts/com/useLaravelEcho.tsx +0 -432
- package/src/contexts/dictionary/DictionaryContext.tsx +0 -94
- package/src/declarations.d.ts +0 -17
- package/src/default-theme/DASHAppProviders.tsx +0 -117
- package/src/default-theme/DashThemeContext.tsx +0 -209
- package/src/default-theme/DashThemeContext.tsx.fast +0 -143
- package/src/default-theme/DashThemeContext.tsx.old +0 -306
- package/src/default-theme/DashThemeHelperProvider.tsx +0 -98
- package/src/default-theme/DomainAppLayout.tsx +0 -166
- package/src/default-theme/DomainHeader.tsx +0 -162
- package/src/default-theme/DomainTheme.tsx +0 -59
- package/src/default-theme/FullLayoutMarkup.tsx +0 -231
- package/src/default-theme/StaticLayout.tsx +0 -47
- package/src/default-theme/index.tsx +0 -11
- package/src/default-theme/menu/AppDashboardGrid.tsx +0 -279
- package/src/default-theme/menu/AppMaterialMenu.tsx +0 -546
- package/src/default-theme/menu/AppMenuComponents/SubmenuPortal.tsx +0 -61
- package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItem.tsx +0 -264
- package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItems.tsx +0 -31
- package/src/default-theme/menu/AppMenuComponents/expanded/CollapsableSidebarMenu.tsx +0 -293
- package/src/default-theme/menu/AppMenuComponents/expanded/SidebarItem.tsx +0 -92
- package/src/default-theme/menu/AppMenuComponents/getItem.tsx +0 -17
- package/src/default-theme/menu/AppMenuComponents/interfaces.tsx +0 -41
- package/src/default-theme/menu/AppMenuComponents/submenuConstants.ts +0 -90
- package/src/default-theme/menu/AppSidebarMaterial.tsx +0 -339
- package/src/default-theme/menu/SidebarActions.tsx +0 -84
- package/src/default-theme/updateDomCssVariables.tsx +0 -176
- package/src/helpers/checkRole.tsx +0 -66
- package/src/helpers/parseAxiosError.tsx +0 -41
- package/src/hooks/audio/useAudio.tsx +0 -39
- package/src/hooks/axios.tsx +0 -165
- package/src/hooks/data/useDashboardStats.tsx +0 -65
- package/src/hooks/data/usePackageByClientsStats.tsx +0 -44
- package/src/hooks/data/usePackageByCommunesStats.tsx +0 -44
- package/src/hooks/data/usePackageStats.tsx +0 -69
- package/src/hooks/data/usePackageWithdrawDetails.tsx +0 -61
- package/src/hooks/data/useStats.tsx +0 -86
- package/src/hooks/isCurrentPath.tsx +0 -22
- package/src/hooks/notifications/WSMessagesManager.tsx +0 -152
- package/src/hooks/notifications/WSPusherManager.tsx +0 -92
- package/src/hooks/useBreadcrumbs.tsx +0 -329
- package/src/hooks/useClickOutside.tsx +0 -57
- package/src/hooks/useFormPersistance.tsx +0 -150
- package/src/hooks/useGlobalErrorMediator.tsx +0 -43
- package/src/hooks/useGlobalLoaderMgr.tsx +0 -21
- package/src/hooks/useHash.tsx +0 -27
- package/src/hooks/useLocalStorage.tsx +0 -196
- package/src/hooks/usePolyglotTranslation.tsx +0 -62
- package/src/hooks/usePrevious.tsx +0 -9
- package/src/hooks/usePrintSelected.tsx +0 -37
- package/src/hooks/useVirtualHash.tsx +0 -33
- package/src/hooks/window/useWindowSize.tsx +0 -36
- package/src/index.tsx +0 -134
- package/src/interfaces/IAppResourceConfig.tsx +0 -20
- package/src/interfaces/Log.tsx +0 -16
- package/src/interfaces/Tenant.tsx +0 -25
- package/src/interfaces/communication/IActions.tsx +0 -5
- package/src/interfaces/communication/INotification.tsx +0 -21
- package/src/interfaces/communication/IPayload.tsx +0 -3
- package/src/interfaces/communication/IRequestAction.tsx +0 -10
- package/src/interfaces/communication/IRequestPayload.tsx +0 -7
- package/src/interfaces/communication/IResponseAction.tsx +0 -7
- package/src/interfaces/misc/IAny.tsx +0 -3
- package/src/interfaces/misc/IFlashMessage.tsx +0 -10
- package/src/interfaces/navigation/IAppMenu.ts +0 -14
- package/src/interfaces/navigation/ICollapsableSidebarMenu.ts +0 -12
- package/src/interfaces/navigation/IMenuItem.ts +0 -16
- package/src/interfaces/notifications/IModel.tsx +0 -6
- package/src/interfaces/notifications/IModelField.tsx +0 -8
- package/src/interfaces/notifications/IUserNotification.tsx +0 -12
- package/src/interfaces/notifications/IUserNotificationData.tsx +0 -13
- package/src/interfaces/notifications/IUserNotificationPayload.tsx +0 -8
- package/src/interfaces/user/IGetAuth.tsx +0 -92
- package/src/interfaces/user/ITenantSettings.tsx +0 -3
- package/src/interfaces/user/IUser.tsx +0 -60
- package/src/interfaces/user/IUserSettings.tsx +0 -43
- package/src/interfaces.tsx +0 -6
- package/src/layout/AppLayout.tsx +0 -112
- package/src/layout/ApplicationLayout.tsx +0 -197
- package/src/layout/MotionWrapper.original.tsx +0 -236
- package/src/layout/MotionWrapper.tsx +0 -236
- package/src/layout/ResourceMenu.tsx +0 -164
- package/src/layout/ResoureLayout.tsx +0 -105
- package/src/layout/TransitionWrapper.tsx +0 -125
- package/src/pages/ChangePassword.tsx +0 -179
- package/src/pages/DASHLanding.tsx +0 -22
- package/src/pages/DASHLightWeightLogin.tsx +0 -611
- package/src/pages/DASHSimpleLogin.tsx +0 -260
- package/src/pages/Login.tsx +0 -111
- package/src/pages/Profile.tsx +0 -357
- package/src/pages/RecoverPassword.tsx +0 -175
- package/src/pages/SingleImageUploader.tsx +0 -55
- package/src/pages/VerifyAccount.tsx +0 -128
- package/src/providers/authProvider.tsx +0 -217
- package/src/providers/dataProvider.tsx +0 -672
- package/src/providers/i18n/en.ts +0 -646
- package/src/providers/i18n/es.ts +0 -652
- package/src/providers/i18n/languages.tsx +0 -8
- package/src/providers/i18n/mergeTranslations.ts +0 -53
- package/src/providers/i18nProvider.tsx +0 -23
- package/src/react-admin-dash/RADashComponent.tsx +0 -240
- package/src/react-admin-dash/Resource.tsx +0 -77
- package/src/resources/Brand/BrandResource.tsx +0 -130
- package/src/resources/DASHResourceLoader.ts +0 -180
- package/src/resources/Log/LogResource.tsx +0 -73
- package/src/resources/Tenant/ImpersonateTenantResource.tsx +0 -113
- package/src/resources/Trash/TrashTemplate.tsx +0 -180
- package/src/resources/User/components/AvatarUploadField.tsx +0 -57
- package/src/resources/User/components/PasswordFields.tsx +0 -73
- package/src/resources/User/getProfileMenu.ts +0 -57
- package/src/resources/User/profileResource.tsx +0 -51
- package/src/resources/User/userLayout.tsx +0 -62
- package/src/resources/User/userResource.tsx +0 -111
- package/src/resources/User/userSchema.tsx +0 -213
- package/src/resources/User/usersFilters.tsx +0 -21
- package/src/resources.tsx +0 -280
- package/src/schemas/log.tsx +0 -45
- package/src/schemas/notification.tsx +0 -42
- package/src/schemas/permissions.tsx +0 -44
- package/src/schemas/roles.tsx +0 -48
- package/src/schemas/rolesDataGrid.tsx +0 -48
- package/src/schemas/subscription/components/SubscriptionActions.tsx +0 -153
- package/src/schemas/subscription/components/SubscriptionPaymentHistory.tsx +0 -127
- package/src/schemas/subscription/components/SubscriptionPlanFeatures.tsx +0 -162
- package/src/schemas/subscription/components/SubscriptionPlanPreview.tsx +0 -141
- package/src/schemas/subscription/components/SubscriptionPlanStats.tsx +0 -318
- package/src/schemas/subscription/components/SubscriptionStatusIndicator.tsx +0 -72
- package/src/schemas/subscription/subscriptionPlanSchema.tsx +0 -185
- package/src/schemas/subscription/subscriptionSchema.tsx +0 -152
- package/src/schemas/subscriptionPlan.ts +0 -422
- package/src/schemas/tenant.tsx +0 -129
- package/src/schemas/tenantUser.tsx +0 -96
- package/src/schemas/tenant_superadmin.tsx +0 -119
- package/src/schemas/user.tsx +0 -26
- package/src/systemResources.old.tsx +0 -928
- package/src/systemResources.tsx +0 -1369
- package/src/templates/ResourceTemplate.tsx +0 -240
- package/src/templates/ResourceTemplate.tsx.memoized_experiment +0 -350
- package/src/templates/ResourceTemplate.tsx.original +0 -396
- package/src/templates/ResourceTemplateCreate.tsx +0 -182
- package/src/templates/ResourceTemplateEdit.tsx +0 -176
- package/src/templates/ResourceTemplateFull.tsx +0 -581
- package/src/templates/ResourceTemplateList.tsx +0 -340
- package/src/templates/ResourceTemplateOld.tsx.bkup +0 -567
- package/src/templates/ResourceTemplateShow.tsx +0 -88
- package/src/templates/TrashTemplate.tsx +0 -179
- package/src/tenantResources.tsx +0 -223
- package/src/test_portal_bubbles.tsx +0 -40
- package/src/theme/AppHeader.tsx +0 -52
- package/src/theme/AppLayoutSetting.tsx +0 -33
- package/src/theme/AppLogo.tsx +0 -13
- package/src/theme/AppSidebar.tsx +0 -12
- package/src/theme/AppSidebarContent.tsx +0 -105
- package/src/theme/AppSidebarLogo.tsx +0 -48
- package/src/theme/components/PageTitle.tsx +0 -37
- package/src/utils/cache/CacheInvalidatorContext.tsx +0 -125
- package/src/utils/cache/CacheInvalidatorListenerComponent.tsx +0 -10
- package/src/utils/cache/useCacheInvalidatorListener.tsx +0 -27
- package/src/utils/convertFileToBase64.tsx +0 -9
- package/src/utils/convertToFile.tsx +0 -14
- package/src/utils/cookies.tsx +0 -33
- package/src/utils/dashDefaultQueryClient.tsx +0 -34
- package/src/utils/dataUrlToBlob.tsx +0 -30
- package/src/utils/deepReplace.tsx +0 -19
- package/src/utils/getProfileMenu.tsx +0 -41
- package/src/utils/getTenantSettings.tsx +0 -9
- package/src/utils/getType.tsx +0 -8
- package/src/utils/getUserSettings.tsx +0 -8
- package/src/utils/hasCode.tsx +0 -14
- package/src/utils/index.ts +0 -19
- package/src/utils/injectTenantStyles.ts +0 -28
- package/src/utils/isComponent.tsx +0 -45
- package/src/utils/navEvents.tsx +0 -91
- package/src/utils/prototypes.tsx +0 -5
- package/src/utils/regexp.tsx +0 -4
- package/src/utils/resolveObjectPath.tsx +0 -4
- package/src/utils/setNativeValue.tsx +0 -24
- package/src/utils/slugify.tsx +0 -11
- package/src/utils/validators/emailValidator.tsx +0 -6
- package/src/utils/validators/requiredValidator.tsx +0 -5
- package/src/utils/validators/rutValidator.tsx +0 -31
- package/src/utils/validators.tsx +0 -96
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
import { useAxios } from "dash-axios-hook";
|
|
2
|
-
import { createContext, useContext, useState, useRef, useEffect } from "react";
|
|
3
|
-
import { idbSet, idbGet } from "./SystemRequestsCache";
|
|
4
|
-
|
|
5
|
-
// Debug flag for logging
|
|
6
|
-
const DEBUG_SUBSCRIPTION_PLAN_FORMATS = true;
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* SubscriptionPlanFormatsContext
|
|
10
|
-
*
|
|
11
|
-
* Context specifically designed for subscription plan management that fetches
|
|
12
|
-
* both limit formats and addon formats from the backend API.
|
|
13
|
-
*/
|
|
14
|
-
interface SubscriptionPlanFormatsContextValue {
|
|
15
|
-
formats: any; // Limit formats (for backward compatibility)
|
|
16
|
-
addonFormats: any; // Add-on formats
|
|
17
|
-
loading: boolean;
|
|
18
|
-
fetchFormats: () => Promise<void>;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const SubscriptionPlanFormatsContext = createContext<SubscriptionPlanFormatsContextValue>({
|
|
22
|
-
formats: null,
|
|
23
|
-
addonFormats: null,
|
|
24
|
-
loading: false,
|
|
25
|
-
fetchFormats: async () => {},
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
interface SubscriptionPlanFormatsProviderProps {
|
|
29
|
-
cacheSeconds?: number;
|
|
30
|
-
children: React.ReactNode;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* SubscriptionPlanFormatsProvider
|
|
35
|
-
*
|
|
36
|
-
* Provider that fetches both limit formats and addon formats for subscription plans.
|
|
37
|
-
* Uses IndexedDB for caching to persist data across sessions.
|
|
38
|
-
*
|
|
39
|
-
* Usage:
|
|
40
|
-
* <SubscriptionPlanFormatsProvider cacheSeconds={300}>
|
|
41
|
-
* ...children...
|
|
42
|
-
* </SubscriptionPlanFormatsProvider>
|
|
43
|
-
*/
|
|
44
|
-
export const SubscriptionPlanFormatsProvider: React.FC<SubscriptionPlanFormatsProviderProps> = ({
|
|
45
|
-
cacheSeconds = 300,
|
|
46
|
-
children
|
|
47
|
-
}) => {
|
|
48
|
-
const axios = useAxios();
|
|
49
|
-
const CACHE_KEY_LIMITS = "subscription_plan_limit_formats_cache";
|
|
50
|
-
const CACHE_KEY_ADDONS = "subscription_plan_addon_formats_cache";
|
|
51
|
-
|
|
52
|
-
const GLOBALS = useRef({
|
|
53
|
-
fetchPromise: null as Promise<any> | null,
|
|
54
|
-
formats: null as any,
|
|
55
|
-
addonFormats: null as any,
|
|
56
|
-
lastFetchTime: 0
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
const [formats, setFormats] = useState<any>(GLOBALS.current.formats);
|
|
60
|
-
const [addonFormats, setAddonFormats] = useState<any>(GLOBALS.current.addonFormats);
|
|
61
|
-
const [loading, setLoading] = useState<boolean>(!GLOBALS.current.formats && !GLOBALS.current.fetchPromise);
|
|
62
|
-
|
|
63
|
-
const fetchFormats = async () => {
|
|
64
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
65
|
-
console.log(`[SubscriptionPlanFormats] fetchFormats called`);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (GLOBALS.current.fetchPromise) {
|
|
69
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
70
|
-
console.log(`[SubscriptionPlanFormats] fetchPromise already in progress`);
|
|
71
|
-
}
|
|
72
|
-
return GLOBALS.current.fetchPromise;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const now = Date.now();
|
|
76
|
-
|
|
77
|
-
// Check if we have cached data and it's still valid
|
|
78
|
-
if (GLOBALS.current.formats && GLOBALS.current.addonFormats &&
|
|
79
|
-
now - GLOBALS.current.lastFetchTime < cacheSeconds * 1000) {
|
|
80
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
81
|
-
console.log(`[SubscriptionPlanFormats] Using cached data (age: ${(now - GLOBALS.current.lastFetchTime) / 1000}s)`);
|
|
82
|
-
}
|
|
83
|
-
if (!formats) setFormats(GLOBALS.current.formats);
|
|
84
|
-
if (!addonFormats) setAddonFormats(GLOBALS.current.addonFormats);
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
setLoading(true);
|
|
89
|
-
|
|
90
|
-
GLOBALS.current.fetchPromise = (async () => {
|
|
91
|
-
try {
|
|
92
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
93
|
-
console.log(`[SubscriptionPlanFormats] FETCHING limit formats and addon formats`);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Fetch both endpoints in parallel
|
|
97
|
-
const [limitsResponse, addonsResponse] = await Promise.all([
|
|
98
|
-
axios.get('system/subscription-plan/limitFormats'),
|
|
99
|
-
axios.get('system/subscription-plan/addonFormats')
|
|
100
|
-
]);
|
|
101
|
-
|
|
102
|
-
GLOBALS.current.formats = limitsResponse.data;
|
|
103
|
-
GLOBALS.current.addonFormats = addonsResponse.data;
|
|
104
|
-
GLOBALS.current.lastFetchTime = Date.now();
|
|
105
|
-
|
|
106
|
-
setFormats(limitsResponse.data);
|
|
107
|
-
setAddonFormats(addonsResponse.data);
|
|
108
|
-
|
|
109
|
-
// Persist to IndexedDB
|
|
110
|
-
try {
|
|
111
|
-
await idbSet(`${CACHE_KEY_LIMITS}_formats`, limitsResponse.data);
|
|
112
|
-
await idbSet(`${CACHE_KEY_ADDONS}_formats`, addonsResponse.data);
|
|
113
|
-
await idbSet(`subscription_plan_formats_lastFetchTime`, GLOBALS.current.lastFetchTime);
|
|
114
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
115
|
-
console.log(`[SubscriptionPlanFormats] Saved to IndexedDB`);
|
|
116
|
-
}
|
|
117
|
-
} catch (error) {
|
|
118
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
119
|
-
console.error(`[SubscriptionPlanFormats] Error writing to IndexedDB:`, error);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
} catch (error) {
|
|
123
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
124
|
-
console.error(`[SubscriptionPlanFormats] Error fetching formats:`, error);
|
|
125
|
-
}
|
|
126
|
-
} finally {
|
|
127
|
-
setLoading(false);
|
|
128
|
-
GLOBALS.current.fetchPromise = null;
|
|
129
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
130
|
-
console.log(`[SubscriptionPlanFormats] fetchPromise cleared`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
})();
|
|
134
|
-
|
|
135
|
-
return GLOBALS.current.fetchPromise;
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
useEffect(() => {
|
|
139
|
-
const loadCachedFormats = async () => {
|
|
140
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
141
|
-
console.log(`[SubscriptionPlanFormats] loadCachedFormats`);
|
|
142
|
-
}
|
|
143
|
-
try {
|
|
144
|
-
// Try to load from IndexedDB first
|
|
145
|
-
if (!GLOBALS.current.formats) {
|
|
146
|
-
const cachedFormats = await idbGet(`${CACHE_KEY_LIMITS}_formats`);
|
|
147
|
-
if (cachedFormats) {
|
|
148
|
-
GLOBALS.current.formats = cachedFormats;
|
|
149
|
-
setFormats(cachedFormats);
|
|
150
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
151
|
-
console.log(`[SubscriptionPlanFormats] Loaded limit formats from IndexedDB`);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (!GLOBALS.current.addonFormats) {
|
|
156
|
-
const cachedAddonFormats = await idbGet(`${CACHE_KEY_ADDONS}_formats`);
|
|
157
|
-
if (cachedAddonFormats) {
|
|
158
|
-
GLOBALS.current.addonFormats = cachedAddonFormats;
|
|
159
|
-
setAddonFormats(cachedAddonFormats);
|
|
160
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
161
|
-
console.log(`[SubscriptionPlanFormats] Loaded addon formats from IndexedDB`);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Load lastFetchTime
|
|
167
|
-
const cachedTime = await idbGet(`subscription_plan_formats_lastFetchTime`);
|
|
168
|
-
if (cachedTime) {
|
|
169
|
-
GLOBALS.current.lastFetchTime = cachedTime;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// If we have both cached, check if still valid
|
|
173
|
-
if (GLOBALS.current.formats && GLOBALS.current.addonFormats) {
|
|
174
|
-
const now = Date.now();
|
|
175
|
-
if (now - GLOBALS.current.lastFetchTime < cacheSeconds * 1000) {
|
|
176
|
-
setLoading(false);
|
|
177
|
-
return; // Cache is still valid
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Fetch fresh data
|
|
182
|
-
await fetchFormats();
|
|
183
|
-
} catch (error) {
|
|
184
|
-
if (DEBUG_SUBSCRIPTION_PLAN_FORMATS) {
|
|
185
|
-
console.error(`[SubscriptionPlanFormats] Error loading cached formats:`, error);
|
|
186
|
-
}
|
|
187
|
-
await fetchFormats();
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
loadCachedFormats();
|
|
191
|
-
// eslint-disable-next-line
|
|
192
|
-
}, [cacheSeconds]);
|
|
193
|
-
|
|
194
|
-
useEffect(() => {
|
|
195
|
-
if (formats && addonFormats) setLoading(false);
|
|
196
|
-
}, [formats, addonFormats]);
|
|
197
|
-
|
|
198
|
-
return (
|
|
199
|
-
<SubscriptionPlanFormatsContext.Provider value={{
|
|
200
|
-
formats: (formats || GLOBALS.current.formats) ?? null,
|
|
201
|
-
addonFormats: (addonFormats || GLOBALS.current.addonFormats) ?? null,
|
|
202
|
-
fetchFormats,
|
|
203
|
-
loading
|
|
204
|
-
}}>
|
|
205
|
-
{children}
|
|
206
|
-
</SubscriptionPlanFormatsContext.Provider>
|
|
207
|
-
);
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Hook to access the subscription plan formats context
|
|
212
|
-
*/
|
|
213
|
-
export function useSubscriptionPlanFormats() {
|
|
214
|
-
return useContext(SubscriptionPlanFormatsContext);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
export default SubscriptionPlanFormatsProvider;
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { useAxios } from "dash-axios-hook";
|
|
2
|
-
import { createContext, useContext, useState, useRef, useEffect } from "react";
|
|
3
|
-
|
|
4
|
-
// --- IndexedDB Utility ---
|
|
5
|
-
const DB_NAME = "SystemRequestsCacheDB";
|
|
6
|
-
const STORE_NAME = "kvstore";
|
|
7
|
-
const DB_VERSION = 1;
|
|
8
|
-
|
|
9
|
-
function openDB(): Promise<IDBDatabase> {
|
|
10
|
-
return new Promise((resolve, reject) => {
|
|
11
|
-
const req = indexedDB.open(DB_NAME, DB_VERSION);
|
|
12
|
-
req.onupgradeneeded = () => {
|
|
13
|
-
req.result.createObjectStore(STORE_NAME);
|
|
14
|
-
};
|
|
15
|
-
req.onsuccess = () => resolve(req.result);
|
|
16
|
-
req.onerror = () => reject(req.error);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export async function idbSet(key: string, value: any) {
|
|
21
|
-
const db = await openDB();
|
|
22
|
-
return new Promise<void>((resolve, reject) => {
|
|
23
|
-
const tx = db.transaction(STORE_NAME, "readwrite");
|
|
24
|
-
tx.objectStore(STORE_NAME).put(value, key);
|
|
25
|
-
tx.oncomplete = () => resolve();
|
|
26
|
-
tx.onerror = () => reject(tx.error);
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export async function idbGet(key: string) {
|
|
31
|
-
const db = await openDB();
|
|
32
|
-
return new Promise<any>((resolve, reject) => {
|
|
33
|
-
const tx = db.transaction(STORE_NAME, "readonly");
|
|
34
|
-
const req = tx.objectStore(STORE_NAME).get(key);
|
|
35
|
-
req.onsuccess = () => resolve(req.result);
|
|
36
|
-
req.onerror = () => reject(req.error);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Debug flag for logging
|
|
41
|
-
const DEBUG_SYSTEM_REQUESTS_CACHE = true;
|
|
42
|
-
|
|
43
|
-
// --- Context for generic system requests cache ---
|
|
44
|
-
interface SystemRequestsCacheContextValue {
|
|
45
|
-
formats: any;
|
|
46
|
-
fetchFormats: () => Promise<void>;
|
|
47
|
-
loading: boolean;
|
|
48
|
-
}
|
|
49
|
-
const SystemRequestsCacheContext = createContext<SystemRequestsCacheContextValue>({
|
|
50
|
-
formats: null,
|
|
51
|
-
fetchFormats: async () => {},
|
|
52
|
-
loading: false,
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
interface SystemRequestsCacheProviderProps {
|
|
56
|
-
cacheKey: string;
|
|
57
|
-
apiUrl: string;
|
|
58
|
-
cacheSeconds?: number;
|
|
59
|
-
children: React.ReactNode;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* SystemRequestsCacheProvider
|
|
64
|
-
*
|
|
65
|
-
* Usage:
|
|
66
|
-
* <SystemRequestsCacheProvider
|
|
67
|
-
* cacheKey="system_available_permissions_cache"
|
|
68
|
-
* apiUrl="system/permission/availablePermissions"
|
|
69
|
-
* cacheSeconds={10}
|
|
70
|
-
* >
|
|
71
|
-
* ...children...
|
|
72
|
-
* </SystemRequestsCacheProvider>
|
|
73
|
-
*/
|
|
74
|
-
export const SystemRequestsCacheProvider: React.FC<SystemRequestsCacheProviderProps> = ({
|
|
75
|
-
cacheKey,
|
|
76
|
-
apiUrl,
|
|
77
|
-
cacheSeconds = 10,
|
|
78
|
-
children
|
|
79
|
-
}) => {
|
|
80
|
-
const axios = useAxios();
|
|
81
|
-
const GLOBALS = useRef({
|
|
82
|
-
fetchPromise: null as Promise<any> | null,
|
|
83
|
-
formats: null as any,
|
|
84
|
-
lastFetchTime: 0
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
const [formats, setFormats] = useState<any>(GLOBALS.current.formats);
|
|
88
|
-
const [loading, setLoading] = useState<boolean>(!GLOBALS.current.formats && !GLOBALS.current.fetchPromise);
|
|
89
|
-
|
|
90
|
-
const fetchFormats = async () => {
|
|
91
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
92
|
-
console.log(`[SystemRequestsCache] fetchFormats called for key=${cacheKey}, url=${apiUrl}`);
|
|
93
|
-
}
|
|
94
|
-
if (GLOBALS.current.fetchPromise) {
|
|
95
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
96
|
-
console.log(`[SystemRequestsCache] fetchPromise already in progress for key=${cacheKey}`);
|
|
97
|
-
}
|
|
98
|
-
return GLOBALS.current.fetchPromise;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const now = Date.now();
|
|
102
|
-
if (!GLOBALS.current.lastFetchTime) {
|
|
103
|
-
try {
|
|
104
|
-
GLOBALS.current.lastFetchTime = (await idbGet(cacheKey)) || 0;
|
|
105
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
106
|
-
console.log(`[SystemRequestsCache] Loaded lastFetchTime from IndexedDB: ${GLOBALS.current.lastFetchTime}`);
|
|
107
|
-
}
|
|
108
|
-
} catch (error) {
|
|
109
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
110
|
-
console.error(`[SystemRequestsCache] Error reading lastFetchTime from IndexedDB:`, error);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (GLOBALS.current.formats && now - GLOBALS.current.lastFetchTime < cacheSeconds * 1000) {
|
|
116
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
117
|
-
console.log(`[SystemRequestsCache] Using cached formats for key=${cacheKey} (age: ${(now - GLOBALS.current.lastFetchTime) / 1000}s)`);
|
|
118
|
-
}
|
|
119
|
-
if (!formats) setFormats(GLOBALS.current.formats);
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
setLoading(true);
|
|
124
|
-
|
|
125
|
-
GLOBALS.current.fetchPromise = (async () => {
|
|
126
|
-
try {
|
|
127
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
128
|
-
console.log(`[SystemRequestsCache] FETCHING ${apiUrl} for key=${cacheKey}`);
|
|
129
|
-
}
|
|
130
|
-
const { data } = await axios.get(apiUrl);
|
|
131
|
-
|
|
132
|
-
GLOBALS.current.formats = data;
|
|
133
|
-
GLOBALS.current.lastFetchTime = Date.now();
|
|
134
|
-
|
|
135
|
-
setFormats(data);
|
|
136
|
-
|
|
137
|
-
try {
|
|
138
|
-
await idbSet(cacheKey, GLOBALS.current.lastFetchTime);
|
|
139
|
-
await idbSet(`${cacheKey}_formats`, data);
|
|
140
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
141
|
-
console.log(`[SystemRequestsCache] Saved formats and lastFetchTime to IndexedDB for key=${cacheKey}`);
|
|
142
|
-
}
|
|
143
|
-
} catch (error) {
|
|
144
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
145
|
-
console.error(`[SystemRequestsCache] Error writing to IndexedDB:`, error);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
} catch (error) {
|
|
149
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
150
|
-
console.error(`[SystemRequestsCache] Error fetching settings formats:`, error);
|
|
151
|
-
}
|
|
152
|
-
} finally {
|
|
153
|
-
setLoading(false);
|
|
154
|
-
GLOBALS.current.fetchPromise = null;
|
|
155
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
156
|
-
console.log(`[SystemRequestsCache] fetchPromise cleared for key=${cacheKey}`);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
})();
|
|
160
|
-
|
|
161
|
-
return GLOBALS.current.fetchPromise;
|
|
162
|
-
};
|
|
163
|
-
|
|
164
|
-
useEffect(() => {
|
|
165
|
-
const loadCachedFormats = async () => {
|
|
166
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
167
|
-
console.log(`[SystemRequestsCache] loadCachedFormats for key=${cacheKey}`);
|
|
168
|
-
}
|
|
169
|
-
try {
|
|
170
|
-
if (!GLOBALS.current.formats) {
|
|
171
|
-
const cachedFormats = await idbGet(`${cacheKey}_formats`);
|
|
172
|
-
if (cachedFormats) {
|
|
173
|
-
GLOBALS.current.formats = cachedFormats;
|
|
174
|
-
setFormats(cachedFormats);
|
|
175
|
-
setLoading(false);
|
|
176
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
177
|
-
console.log(`[SystemRequestsCache] Loaded formats from IndexedDB for key=${cacheKey}`);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
if (!GLOBALS.current.formats) setLoading(true);
|
|
182
|
-
await fetchFormats();
|
|
183
|
-
} catch (error) {
|
|
184
|
-
if (DEBUG_SYSTEM_REQUESTS_CACHE) {
|
|
185
|
-
console.error(`[SystemRequestsCache] Error loading cached formats:`, error);
|
|
186
|
-
}
|
|
187
|
-
setLoading(true);
|
|
188
|
-
await fetchFormats();
|
|
189
|
-
}
|
|
190
|
-
};
|
|
191
|
-
loadCachedFormats();
|
|
192
|
-
// eslint-disable-next-line
|
|
193
|
-
}, [cacheKey, apiUrl, cacheSeconds]);
|
|
194
|
-
|
|
195
|
-
useEffect(() => {
|
|
196
|
-
if (formats) setLoading(false);
|
|
197
|
-
}, [formats]);
|
|
198
|
-
|
|
199
|
-
return (
|
|
200
|
-
<SystemRequestsCacheContext.Provider value={{
|
|
201
|
-
formats: (formats || GLOBALS.current.formats) ?? null,
|
|
202
|
-
fetchFormats,
|
|
203
|
-
loading
|
|
204
|
-
}}>
|
|
205
|
-
{children}
|
|
206
|
-
</SystemRequestsCacheContext.Provider>
|
|
207
|
-
);
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
// Hook is now parameterless, just reads from context
|
|
211
|
-
export function useSystemRequestsCache() {
|
|
212
|
-
return useContext(SystemRequestsCacheContext);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
export default SystemRequestsCacheProvider;
|