@dashadmin/dash-admin 1.3.25 → 1.3.26
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/AppAsyncWrapper.js +30 -1
- package/dist/AppWrapper.js +35 -1
- package/dist/DASHAdmin.js +312 -1
- package/dist/RoutingWrapper.js +76 -1
- package/dist/classes/DASHStorageClass.js +15 -1
- package/dist/components/Input/RichTextField.js +26 -1
- package/dist/components/Redirect.js +56 -1
- package/dist/components/avatar/Avatar.js +72 -1
- package/dist/components/avatar/SingleImageUploader.js +46 -1
- package/dist/components/currency/Format.js +71 -1
- package/dist/components/custom/Redirect.js +20 -1
- package/dist/components/error/Error.js +161 -1
- package/dist/components/geocoding/GeocodingField.js +133 -1
- package/dist/components/i18n/BridgedLocalesMenuButton.js +126 -1
- package/dist/components/i18n/LangSwitcher.js +196 -1
- package/dist/components/loader/GlobalLoader.js +71 -1
- package/dist/components/logs/LogFile.js +99 -1
- package/dist/components/logs/LogFileById.js +75 -1
- package/dist/components/logs/LogViewer.js +33 -1
- package/dist/components/menu/AppMenu.js +11 -1
- package/dist/components/menu/CustomMenuItemLink.js +77 -1
- package/dist/components/menu/DarkToggleMode.js +47 -1
- package/dist/components/menu/LanguageToggleMode.js +99 -1
- package/dist/components/misc/CustomImageInput.js +54 -1
- package/dist/components/misc/DASHGlobalErrorHandler.js +159 -1
- package/dist/components/misc/DarkModeSwitcher.js +40 -1
- package/dist/components/misc/LanguageSwitcher.js +193 -1
- package/dist/components/misc/MUIHtmlToolTip.js +50 -1
- package/dist/components/misc/MuiSimpleJsonTable.js +178 -1
- package/dist/components/misc/MultiLevelTable.js +124 -1
- package/dist/components/misc/NoResults.js +17 -1
- package/dist/components/misc/PDFViewer.js +86 -1
- package/dist/components/navigation/Breadcrumbs.js +178 -1
- package/dist/components/navigation/BreadcrumbsManager.js +194 -1
- package/dist/components/navigation/index.js +8 -1
- package/dist/components/panel/Error.js +161 -1
- package/dist/components/permission/AvailablePermissionsContext.js +157 -1
- package/dist/components/permission/PermissionsSelector.js +719 -1
- package/dist/components/permission/PermissionsSelectorList.js +400 -1
- package/dist/components/racustombuttons/CustomRAButton.js +94 -1
- package/dist/components/racustombuttons/QuickButton.js +109 -1
- package/dist/components/racustombuttons/QuickEditButton.js +114 -1
- package/dist/components/racustombuttons/QuickIconButton.js +119 -1
- package/dist/components/scrollbar/Scrollbar.js +52 -1
- package/dist/components/selects/MultiSelect.js +42 -1
- package/dist/components/selects/RASearchableSelect.js +207 -1
- package/dist/components/selects/RASearchableSelectChips.js +225 -1
- package/dist/components/selects/SearchableSelect.js +128 -1
- package/dist/components/subscription/BillingCycleSelectInput.js +50 -1
- package/dist/components/subscription/PlanAddonsSettings.js +396 -1
- package/dist/components/subscription/PlanAuditLog.js +345 -1
- package/dist/components/subscription/PlanFeaturesSettings.js +151 -1
- package/dist/components/subscription/PlanLimitsSettings.js +168 -1
- package/dist/components/subscription/PlanMetadataSettings.js +219 -1
- package/dist/components/subscription/PlanPricesSettings.js +222 -1
- package/dist/components/subscription/index.js +12 -1
- package/dist/components/svgelements/SvgLoading.js +330 -1
- package/dist/components/svgelements/SvgLogo.js +70 -1
- package/dist/components/svgelements/SvgLogoMin.js +76 -1
- package/dist/components/svgelements/SvgShipping.js +1001 -1
- package/dist/components/tenant/TenantAttributes.js +107 -1
- package/dist/components/tenant/TenantAttributesContext.js +150 -1
- package/dist/components/tenant/TenantSelector.js +160 -1
- package/dist/components/tenant/TenantSettings.js +107 -1
- package/dist/components/tenant/TenantSettingsContext.js +152 -1
- package/dist/components/tenant/TenantTheme.js +112 -1
- package/dist/components/user/AvatarComponent.js +270 -1
- package/dist/components/user/TenantAvatarComponent.js +83 -1
- package/dist/components/user/UserPreferences.js +422 -1
- package/dist/config/ACTIONS.js +25 -1
- package/dist/config/ConstantsService.js +25 -1
- package/dist/config/DASHAdminSystemConstants.js +137 -1
- package/dist/config/PARSERS.js +9 -1
- package/dist/contexts/DashQueryClientContext.js +78 -1
- package/dist/contexts/DashResourceContext.js +21 -1
- package/dist/contexts/I18nBridgeContext.js +123 -1
- package/dist/contexts/I18nBridgeSetter.js +29 -1
- package/dist/contexts/I18nReduxSync.js +16 -1
- package/dist/contexts/SubscriptionPlanFormatsProvider.js +175 -1
- package/dist/contexts/SystemRequestsCache.js +194 -1
- package/dist/contexts/auth/AuthContext.js +396 -1
- package/dist/contexts/auth/AuthContextLocalStorage.js +118 -1
- package/dist/contexts/auth/DASHAuthenticationService.js +679 -1
- package/dist/contexts/auth/WindowContext.js +10 -1
- package/dist/contexts/auth/index.js +2 -1
- package/dist/contexts/com/FCMContext.js +378 -1
- package/dist/contexts/com/LaravelEchoContext.js +45 -1
- package/dist/contexts/com/LaravelEchoMgr.js +121 -1
- package/dist/contexts/com/components/DefaultNotificationComponent.js +31 -1
- package/dist/contexts/com/components/NotificationAttributesTable.js +28 -1
- package/dist/contexts/com/components/NotificationRenderer.js +36 -1
- package/dist/contexts/com/components/NotificationsWidget.js +142 -1
- package/dist/contexts/com/components/notificationFormats.js +15 -1
- package/dist/contexts/com/useLaravelEcho.js +340 -1
- package/dist/contexts/dictionary/DictionaryContext.js +43 -1
- package/dist/default-theme/DASHAppProviders.js +86 -1
- package/dist/default-theme/DashThemeContext.js +146 -1
- package/dist/default-theme/DashThemeHelperProvider.js +54 -1
- package/dist/default-theme/DomainAppLayout.js +126 -1
- package/dist/default-theme/DomainHeader.js +114 -1
- package/dist/default-theme/DomainTheme.js +60 -1
- package/dist/default-theme/FullLayoutMarkup.js +55 -1
- package/dist/default-theme/StaticLayout.js +36 -1
- package/dist/default-theme/index.js +19 -1
- package/dist/default-theme/menu/AppMaterialMenu.js +364 -1
- package/dist/default-theme/menu/AppMenuComponents/SubmenuPortal.js +33 -1
- package/dist/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItem.js +239 -1
- package/dist/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItems.js +22 -1
- package/dist/default-theme/menu/AppMenuComponents/expanded/CollapsableSidebarMenu.js +209 -1
- package/dist/default-theme/menu/AppMenuComponents/expanded/SidebarItem.js +71 -1
- package/dist/default-theme/menu/AppMenuComponents/getItem.js +7 -1
- package/dist/default-theme/menu/AppMenuComponents/submenuConstants.js +78 -1
- package/dist/default-theme/menu/AppSidebarMaterial.js +232 -1
- package/dist/default-theme/menu/SidebarActions.js +75 -1
- package/dist/default-theme/updateDomCssVariables.js +134 -1
- package/dist/helpers/checkRole.js +14 -1
- package/dist/helpers/parseAxiosError.js +28 -2
- package/dist/hooks/audio/useAudio.js +24 -1
- package/dist/hooks/axios.js +52 -1
- package/dist/hooks/data/useDashboardStats.js +88 -1
- package/dist/hooks/data/usePackageByClientsStats.js +51 -1
- package/dist/hooks/data/usePackageByCommunesStats.js +51 -1
- package/dist/hooks/data/usePackageStats.js +88 -1
- package/dist/hooks/data/usePackageWithdrawDetails.js +69 -1
- package/dist/hooks/data/useStats.js +94 -1
- package/dist/hooks/isCurrentPath.js +18 -1
- package/dist/hooks/notifications/WSMessagesManager.js +128 -1
- package/dist/hooks/notifications/WSPusherManager.js +70 -1
- package/dist/hooks/useBreadcrumbs.js +208 -1
- package/dist/hooks/useClickOutside.js +18 -1
- package/dist/hooks/useFormPersistance.js +129 -1
- package/dist/hooks/useGlobalErrorMediator.js +37 -1
- package/dist/hooks/useGlobalLoaderMgr.js +20 -1
- package/dist/hooks/useHash.js +24 -1
- package/dist/hooks/useLocalStorage.js +68 -1
- package/dist/hooks/usePolyglotTranslation.js +57 -1
- package/dist/hooks/usePrevious.js +12 -1
- package/dist/hooks/usePrintSelected.js +30 -1
- package/dist/hooks/useVirtualHash.js +28 -1
- package/dist/hooks/window/useWindowSize.js +23 -1
- package/dist/index.js +120 -97
- package/dist/interfaces.js +6 -1
- package/dist/layout/AppLayout.js +36 -1
- package/dist/layout/ApplicationLayout.js +110 -1
- package/dist/layout/MotionWrapper.js +182 -1
- package/dist/layout/MotionWrapper.original.js +182 -1
- package/dist/layout/ResourceMenu.js +87 -1
- package/dist/layout/ResoureLayout.js +47 -1
- package/dist/layout/TransitionWrapper.js +83 -2
- package/dist/pages/ChangePassword.js +198 -1
- package/dist/pages/DASHLanding.js +9 -1
- package/dist/pages/DASHLightWeightLogin.js +495 -1
- package/dist/pages/DASHSimpleLogin.js +231 -1
- package/dist/pages/Login.js +113 -1
- package/dist/pages/Profile.js +347 -1
- package/dist/pages/RecoverPassword.js +175 -1
- package/dist/pages/SingleImageUploader.js +40 -1
- package/dist/pages/VerifyAccount.js +129 -1
- package/dist/providers/authProvider.js +186 -1
- package/dist/providers/dataProvider.js +468 -1
- package/dist/providers/i18n/en.js +514 -1
- package/dist/providers/i18n/es.js +520 -1
- package/dist/providers/i18n/languages.js +8 -1
- package/dist/providers/i18nProvider.js +23 -1
- package/dist/react-admin-dash/RADashComponent.js +210 -1
- package/dist/react-admin-dash/Resource.js +62 -1
- package/dist/resources/Brand/BrandResource.js +106 -1
- package/dist/resources/DASHResourceLoader.js +104 -1
- package/dist/resources/Log/LogResource.js +59 -1
- package/dist/resources/Tenant/ImpersonateTenantResource.js +113 -1
- package/dist/resources/Trash/TrashTemplate.js +195 -1
- package/dist/resources.js +259 -1
- package/dist/schemas/log.js +45 -1
- package/dist/schemas/notification.js +39 -1
- package/dist/schemas/permissions.js +44 -1
- package/dist/schemas/roles.js +48 -1
- package/dist/schemas/rolesDataGrid.js +48 -1
- package/dist/schemas/subscription/components/SubscriptionActions.js +172 -1
- package/dist/schemas/subscription/components/SubscriptionPaymentHistory.js +101 -1
- package/dist/schemas/subscription/components/SubscriptionPlanFeatures.js +115 -1
- package/dist/schemas/subscription/components/SubscriptionPlanPreview.js +92 -1
- package/dist/schemas/subscription/components/SubscriptionPlanStats.js +181 -1
- package/dist/schemas/subscription/components/SubscriptionStatusIndicator.js +70 -1
- package/dist/schemas/subscription/subscriptionPlanSchema.js +184 -1
- package/dist/schemas/subscription/subscriptionSchema.js +147 -1
- package/dist/schemas/subscriptionPlan.js +397 -1
- package/dist/schemas/tenant.js +122 -1
- package/dist/schemas/tenantUser.js +94 -1
- package/dist/schemas/tenant_superadmin.js +118 -1
- package/dist/schemas/user.js +26 -1
- package/dist/systemResources.js +1039 -1
- package/dist/systemResources.old.js +668 -1
- package/dist/templates/ResourceTemplate.js +196 -1
- package/dist/templates/ResourceTemplateCreate.js +144 -1
- package/dist/templates/ResourceTemplateEdit.js +147 -1
- package/dist/templates/ResourceTemplateFull.js +518 -1
- package/dist/templates/ResourceTemplateList.js +295 -1
- package/dist/templates/ResourceTemplateShow.js +45 -1
- package/dist/templates/TrashTemplate.js +175 -1
- package/dist/tenantResources.js +206 -1
- package/dist/test_portal_bubbles.js +37 -1
- package/dist/theme/AppHeader.js +60 -1
- package/dist/theme/AppLayoutSetting.js +34 -1
- package/dist/theme/AppLogo.js +7 -1
- package/dist/theme/AppSidebar.js +30 -1
- package/dist/theme/AppSidebarContent.js +84 -1
- package/dist/theme/AppSidebarLogo.js +42 -1
- package/dist/theme/components/PageTitle.js +61 -1
- package/dist/utils/cache/CacheInvalidatorContext.js +100 -1
- package/dist/utils/cache/CacheInvalidatorListenerComponent.js +10 -1
- package/dist/utils/cache/useCacheInvalidatorListener.js +17 -1
- package/dist/utils/convertFileToBase64.js +10 -1
- package/dist/utils/convertToFile.js +12 -1
- package/dist/utils/cookies.js +45 -1
- package/dist/utils/dashDefaultQueryClient.js +15 -1
- package/dist/utils/dataUrlToBlob.js +23 -1
- package/dist/utils/deepReplace.js +17 -1
- package/dist/utils/getProfileMenu.js +31 -1
- package/dist/utils/getTenantSettings.js +9 -1
- package/dist/utils/getType.js +10 -1
- package/dist/utils/getUserSettings.js +9 -1
- package/dist/utils/hasCode.js +14 -1
- package/dist/utils/index.js +19 -1
- package/dist/utils/injectTenantStyles.js +19 -1
- package/dist/utils/isComponent.js +23 -1
- package/dist/utils/navEvents.js +75 -1
- package/dist/utils/prototypes.js +5 -1
- package/dist/utils/regexp.js +7 -1
- package/dist/utils/resolveObjectPath.js +5 -1
- package/dist/utils/setNativeValue.js +17 -1
- package/dist/utils/slugify.js +7 -1
- package/dist/utils/validators/emailValidator.js +8 -1
- package/dist/utils/validators/requiredValidator.js +7 -1
- package/dist/utils/validators/rutValidator.js +25 -1
- package/dist/utils/validators.js +57 -1
- package/package.json +153 -69
- package/src/AppAsyncWrapper.tsx +42 -0
- package/src/AppWrapper.tsx +45 -0
- package/src/DASHAdmin.tsx +501 -0
- package/src/RoutingWrapper.tsx +139 -0
- package/src/classes/DASHStorageClass.tsx +8 -0
- package/src/components/Input/RichTextField.tsx +27 -0
- package/src/components/Redirect.tsx +46 -0
- package/src/components/avatar/Avatar.tsx +67 -0
- package/src/components/avatar/SingleImageUploader.tsx +53 -0
- package/src/components/currency/Format.tsx +77 -0
- package/src/components/custom/Redirect.tsx +23 -0
- package/src/components/error/Error.tsx +168 -0
- package/src/components/geocoding/GeocodingField.tsx +167 -0
- package/src/components/i18n/BridgedLocalesMenuButton.tsx +159 -0
- package/src/components/i18n/LangSwitcher.tsx +204 -0
- package/src/components/loader/GlobalLoader.tsx +56 -0
- package/src/components/logs/LogFile.tsx +88 -0
- package/src/components/logs/LogFileById.tsx +68 -0
- package/src/components/logs/LogViewer.tsx +43 -0
- package/src/components/menu/AppMenu.tsx +22 -0
- package/src/components/menu/CustomMenuItemLink.tsx +61 -0
- package/src/components/menu/DarkToggleMode.tsx +65 -0
- package/src/components/menu/LanguageToggleMode.tsx +120 -0
- package/src/components/misc/CustomImageInput.tsx +62 -0
- package/src/components/misc/DASHGlobalErrorHandler.tsx +194 -0
- package/src/components/misc/DarkModeSwitcher.tsx +112 -0
- package/src/components/misc/LanguageSwitcher.tsx +199 -0
- package/src/components/misc/MUIHtmlToolTip.tsx +15 -0
- package/src/components/misc/MuiSimpleJsonTable.tsx +279 -0
- package/src/components/misc/MultiLevelTable.tsx +229 -0
- package/src/components/misc/NoResults.tsx +25 -0
- package/src/components/misc/PDFViewer.tsx +85 -0
- package/src/components/navigation/Breadcrumbs.tsx +220 -0
- package/src/components/navigation/BreadcrumbsManager.tsx +310 -0
- package/src/components/navigation/index.tsx +5 -0
- package/src/components/panel/Error.tsx +168 -0
- package/src/components/permission/AvailablePermissionsContext.tsx +173 -0
- package/src/components/permission/PermissionsSelector.tsx +819 -0
- package/src/components/permission/PermissionsSelectorList.tsx +468 -0
- package/src/components/permission/tsx +0 -0
- package/src/components/racustombuttons/CustomRAButton.tsx +87 -0
- package/src/components/racustombuttons/QuickButton.tsx +117 -0
- package/src/components/racustombuttons/QuickEditButton.tsx +115 -0
- package/src/components/racustombuttons/QuickIconButton.tsx +122 -0
- package/src/components/scrollbar/Scrollbar.tsx +31 -0
- package/src/components/selects/MultiSelect.tsx +53 -0
- package/src/components/selects/RASearchableSelect.tsx +279 -0
- package/src/components/selects/RASearchableSelectChips.tsx +304 -0
- package/src/components/selects/SearchableSelect.tsx +135 -0
- package/src/components/subscription/BillingCycleSelectInput.tsx +68 -0
- package/src/components/subscription/PlanAddonsSettings.tsx +522 -0
- package/src/components/subscription/PlanAuditLog.tsx +439 -0
- package/src/components/subscription/PlanFeaturesSettings.tsx +223 -0
- package/src/components/subscription/PlanLimitsSettings.tsx +230 -0
- package/src/components/subscription/PlanMetadataSettings.tsx +284 -0
- package/src/components/subscription/PlanPricesSettings.tsx +295 -0
- package/src/components/subscription/index.ts +7 -0
- package/src/components/svgelements/SvgLoading.tsx +229 -0
- package/src/components/svgelements/SvgLogo.tsx +53 -0
- package/src/components/svgelements/SvgLogoMin.tsx +64 -0
- package/src/components/svgelements/SvgShipping.tsx +673 -0
- package/src/components/tenant/AvailablePermissionsContext.tsx +0 -0
- package/src/components/tenant/TenantAttributes.tsx +153 -0
- package/src/components/tenant/TenantAttributesContext.tsx +163 -0
- package/src/components/tenant/TenantSelector.tsx +139 -0
- package/src/components/tenant/TenantSettings.tsx +172 -0
- package/src/components/tenant/TenantSettingsContext.tsx +165 -0
- package/src/components/tenant/TenantTheme.tsx +172 -0
- package/src/components/user/AvatarComponent.tsx +301 -0
- package/src/components/user/TenantAvatarComponent.tsx +99 -0
- package/src/components/user/UserPreferences.tsx +642 -0
- package/src/config/ACTIONS.tsx +26 -0
- package/src/config/ConstantsService.tsx +44 -0
- package/src/config/DASHAdminSystemConstants.tsx +182 -0
- package/src/config/PARSERS.tsx +9 -0
- package/src/contexts/DashQueryClientContext.tsx +113 -0
- package/src/contexts/DashResourceContext.tsx +34 -0
- package/src/contexts/I18nBridgeContext.tsx +156 -0
- package/src/contexts/I18nBridgeSetter.tsx +39 -0
- package/src/contexts/I18nReduxSync.tsx +27 -0
- package/src/contexts/SubscriptionPlanFormatsProvider.tsx +217 -0
- package/src/contexts/SystemRequestsCache.tsx +215 -0
- package/src/contexts/auth/AuthContext.tsx +553 -0
- package/src/contexts/auth/AuthContextLocalStorage.tsx +140 -0
- package/src/contexts/auth/DASHAuthenticationService.tsx +917 -0
- package/src/contexts/auth/WindowContext.tsx +15 -0
- package/src/contexts/auth/index.tsx +3 -0
- package/src/contexts/com/FCMContext.tsx +415 -0
- package/src/contexts/com/LaravelEchoContext.tsx +41 -0
- package/src/contexts/com/LaravelEchoMgr.tsx +155 -0
- package/src/contexts/com/components/DefaultNotificationComponent.tsx +20 -0
- package/src/contexts/com/components/NotificationAttributesTable.tsx +54 -0
- package/src/contexts/com/components/NotificationRenderer.tsx +42 -0
- package/src/contexts/com/components/NotificationsWidget.tsx +182 -0
- package/src/contexts/com/components/notificationFormats.tsx +50 -0
- package/src/contexts/com/useLaravelEcho.tsx +432 -0
- package/src/contexts/dictionary/DictionaryContext.tsx +94 -0
- package/src/default-theme/DASHAppProviders.tsx +117 -0
- package/src/default-theme/DashThemeContext.tsx +218 -0
- package/src/default-theme/DashThemeHelperProvider.tsx +98 -0
- package/src/default-theme/DomainAppLayout.tsx +166 -0
- package/src/default-theme/DomainHeader.tsx +162 -0
- package/src/default-theme/DomainTheme.tsx +59 -0
- package/src/default-theme/FullLayoutMarkup.tsx +250 -0
- package/src/default-theme/StaticLayout.tsx +47 -0
- package/src/default-theme/index.tsx +11 -0
- package/src/default-theme/menu/AppMaterialMenu.tsx +545 -0
- package/src/default-theme/menu/AppMenuComponents/SubmenuPortal.tsx +56 -0
- package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItem.tsx +254 -0
- package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItems.tsx +31 -0
- package/src/default-theme/menu/AppMenuComponents/expanded/CollapsableSidebarMenu.tsx +276 -0
- package/src/default-theme/menu/AppMenuComponents/expanded/SidebarItem.tsx +91 -0
- package/src/default-theme/menu/AppMenuComponents/getItem.tsx +17 -0
- package/src/default-theme/menu/AppMenuComponents/interfaces.tsx +41 -0
- package/src/default-theme/menu/AppMenuComponents/submenuConstants.ts +85 -0
- package/src/default-theme/menu/AppSidebarMaterial.tsx +339 -0
- package/src/default-theme/menu/SidebarActions.tsx +84 -0
- package/src/default-theme/updateDomCssVariables.tsx +176 -0
- package/src/helpers/checkRole.tsx +66 -0
- package/src/helpers/parseAxiosError.tsx +41 -0
- package/src/hooks/audio/useAudio.tsx +39 -0
- package/src/hooks/axios.tsx +62 -0
- package/src/hooks/data/useDashboardStats.tsx +65 -0
- package/src/hooks/data/usePackageByClientsStats.tsx +44 -0
- package/src/hooks/data/usePackageByCommunesStats.tsx +44 -0
- package/src/hooks/data/usePackageStats.tsx +69 -0
- package/src/hooks/data/usePackageWithdrawDetails.tsx +61 -0
- package/src/hooks/data/useStats.tsx +86 -0
- package/src/hooks/isCurrentPath.tsx +22 -0
- package/src/hooks/notifications/WSMessagesManager.tsx +152 -0
- package/src/hooks/notifications/WSPusherManager.tsx +92 -0
- package/src/hooks/useBreadcrumbs.tsx +329 -0
- package/src/hooks/useClickOutside.tsx +17 -0
- package/src/hooks/useFormPersistance.tsx +150 -0
- package/src/hooks/useGlobalErrorMediator.tsx +43 -0
- package/src/hooks/useGlobalLoaderMgr.tsx +21 -0
- package/src/hooks/useHash.tsx +27 -0
- package/src/hooks/useLocalStorage.tsx +196 -0
- package/src/hooks/usePolyglotTranslation.tsx +62 -0
- package/src/hooks/usePrevious.tsx +9 -0
- package/src/hooks/usePrintSelected.tsx +37 -0
- package/src/hooks/useVirtualHash.tsx +33 -0
- package/src/hooks/window/useWindowSize.tsx +36 -0
- package/src/index.tsx +110 -0
- package/src/interfaces/IAppResourceConfig.tsx +20 -0
- package/src/interfaces/Log.tsx +16 -0
- package/src/interfaces/Tenant.tsx +25 -0
- package/src/interfaces/communication/IActions.tsx +5 -0
- package/src/interfaces/communication/INotification.tsx +21 -0
- package/src/interfaces/communication/IPayload.tsx +3 -0
- package/src/interfaces/communication/IRequestAction.tsx +10 -0
- package/src/interfaces/communication/IRequestPayload.tsx +7 -0
- package/src/interfaces/communication/IResponseAction.tsx +7 -0
- package/src/interfaces/misc/IAny.tsx +3 -0
- package/src/interfaces/misc/IFlashMessage.tsx +10 -0
- package/src/interfaces/navigation/IAppMenu.ts +14 -0
- package/src/interfaces/navigation/ICollapsableSidebarMenu.ts +12 -0
- package/src/interfaces/navigation/IMenuItem.ts +16 -0
- package/src/interfaces/notifications/IModel.tsx +6 -0
- package/src/interfaces/notifications/IModelField.tsx +8 -0
- package/src/interfaces/notifications/IUserNotification.tsx +12 -0
- package/src/interfaces/notifications/IUserNotificationData.tsx +13 -0
- package/src/interfaces/notifications/IUserNotificationPayload.tsx +8 -0
- package/src/interfaces/user/IGetAuth.tsx +92 -0
- package/src/interfaces/user/ITenantSettings.tsx +3 -0
- package/src/interfaces/user/IUser.tsx +60 -0
- package/src/interfaces/user/IUserSettings.tsx +43 -0
- package/src/interfaces.tsx +6 -0
- package/src/layout/AppLayout.tsx +112 -0
- package/src/layout/ApplicationLayout.tsx +197 -0
- package/src/layout/MotionWrapper.original.tsx +236 -0
- package/src/layout/MotionWrapper.tsx +236 -0
- package/src/layout/ResourceMenu.tsx +164 -0
- package/src/layout/ResoureLayout.tsx +105 -0
- package/src/layout/TransitionWrapper.tsx +125 -0
- package/src/pages/ChangePassword.tsx +179 -0
- package/src/pages/DASHLanding.tsx +22 -0
- package/src/pages/DASHLightWeightLogin.tsx +610 -0
- package/src/pages/DASHSimpleLogin.tsx +260 -0
- package/src/pages/Login.tsx +111 -0
- package/src/pages/Profile.tsx +394 -0
- package/src/pages/RecoverPassword.tsx +166 -0
- package/src/pages/SingleImageUploader.tsx +55 -0
- package/src/pages/VerifyAccount.tsx +128 -0
- package/src/providers/authProvider.tsx +210 -0
- package/src/providers/dataProvider.tsx +672 -0
- package/src/providers/i18n/en.ts +533 -0
- package/src/providers/i18n/es.ts +539 -0
- package/src/providers/i18n/languages.tsx +5 -0
- package/src/providers/i18nProvider.tsx +23 -0
- package/src/react-admin-dash/RADashComponent.tsx +240 -0
- package/src/react-admin-dash/Resource.tsx +77 -0
- package/src/resources/Brand/BrandResource.tsx +130 -0
- package/src/resources/DASHResourceLoader.ts +180 -0
- package/src/resources/Log/LogResource.tsx +73 -0
- package/src/resources/Tenant/ImpersonateTenantResource.tsx +113 -0
- package/src/resources/Trash/TrashTemplate.tsx +180 -0
- package/src/resources.tsx +280 -0
- package/src/schemas/log.tsx +45 -0
- package/src/schemas/notification.tsx +42 -0
- package/src/schemas/permissions.tsx +44 -0
- package/src/schemas/roles.tsx +48 -0
- package/src/schemas/rolesDataGrid.tsx +48 -0
- package/src/schemas/subscription/components/SubscriptionActions.tsx +153 -0
- package/src/schemas/subscription/components/SubscriptionPaymentHistory.tsx +120 -0
- package/src/schemas/subscription/components/SubscriptionPlanFeatures.tsx +155 -0
- package/src/schemas/subscription/components/SubscriptionPlanPreview.tsx +128 -0
- package/src/schemas/subscription/components/SubscriptionPlanStats.tsx +268 -0
- package/src/schemas/subscription/components/SubscriptionStatusIndicator.tsx +72 -0
- package/src/schemas/subscription/subscriptionPlanSchema.tsx +185 -0
- package/src/schemas/subscription/subscriptionSchema.tsx +152 -0
- package/src/schemas/subscriptionPlan.ts +422 -0
- package/src/schemas/tenant.tsx +129 -0
- package/src/schemas/tenantUser.tsx +96 -0
- package/src/schemas/tenant_superadmin.tsx +119 -0
- package/src/schemas/user.tsx +26 -0
- package/src/systemResources.old.tsx +928 -0
- package/src/systemResources.tsx +1135 -0
- package/src/templates/ResourceTemplate.tsx +240 -0
- package/src/templates/ResourceTemplateCreate.tsx +167 -0
- package/src/templates/ResourceTemplateEdit.tsx +176 -0
- package/src/templates/ResourceTemplateFull.tsx +581 -0
- package/src/templates/ResourceTemplateList.tsx +340 -0
- package/src/templates/ResourceTemplateShow.tsx +88 -0
- package/src/templates/TrashTemplate.tsx +179 -0
- package/src/tenantResources.tsx +223 -0
- package/src/test_portal_bubbles.tsx +40 -0
- package/src/theme/AppHeader.tsx +52 -0
- package/src/theme/AppLayoutSetting.tsx +33 -0
- package/src/theme/AppLogo.tsx +13 -0
- package/src/theme/AppSidebar.tsx +12 -0
- package/src/theme/AppSidebarContent.tsx +105 -0
- package/src/theme/AppSidebarLogo.tsx +48 -0
- package/src/theme/components/PageTitle.tsx +37 -0
- package/src/utils/cache/CacheInvalidatorContext.tsx +125 -0
- package/src/utils/cache/CacheInvalidatorListenerComponent.tsx +10 -0
- package/src/utils/cache/useCacheInvalidatorListener.tsx +27 -0
- package/src/utils/convertFileToBase64.tsx +9 -0
- package/src/utils/convertToFile.tsx +14 -0
- package/src/utils/cookies.tsx +33 -0
- package/src/utils/dashDefaultQueryClient.tsx +34 -0
- package/src/utils/dataUrlToBlob.tsx +30 -0
- package/src/utils/deepReplace.tsx +19 -0
- package/src/utils/getProfileMenu.tsx +41 -0
- package/src/utils/getTenantSettings.tsx +9 -0
- package/src/utils/getType.tsx +8 -0
- package/src/utils/getUserSettings.tsx +8 -0
- package/src/utils/hasCode.tsx +14 -0
- package/src/utils/index.ts +19 -0
- package/src/utils/injectTenantStyles.ts +28 -0
- package/src/utils/isComponent.tsx +45 -0
- package/src/utils/navEvents.tsx +91 -0
- package/src/utils/prototypes.tsx +5 -0
- package/src/utils/regexp.tsx +4 -0
- package/src/utils/resolveObjectPath.tsx +4 -0
- package/src/utils/setNativeValue.tsx +24 -0
- package/src/utils/slugify.tsx +11 -0
- package/src/utils/validators/emailValidator.tsx +6 -0
- package/src/utils/validators/requiredValidator.tsx +5 -0
- package/src/utils/validators/rutValidator.tsx +31 -0
- package/src/utils/validators.tsx +96 -0
- package/dist/ChangePassword-DmWAQAX_.js +0 -152
- package/dist/Login-t41HMhVT.js +0 -101
- package/dist/Profile-By-gdPUd.js +0 -294
- package/dist/RecoverPassword-DzPdbkg2.js +0 -149
- package/dist/VerifyAccount-Bofaxe5w.js +0 -99
- package/dist/index-gfebuoyf.js +0 -21614
- /package/dist/{components/permission/tsx → declarations.d.js} +0 -0
- /package/{dist → src}/DASHAdmin.tsx.old +0 -0
- /package/{dist → src}/declarations.d.ts +0 -0
- /package/{dist → src}/default-theme/DashThemeContext.tsx.fast +0 -0
- /package/{dist → src}/default-theme/DashThemeContext.tsx.old +0 -0
- /package/{dist → src}/templates/ResourceTemplate.tsx.memoized_experiment +0 -0
- /package/{dist → src}/templates/ResourceTemplate.tsx.original +0 -0
- /package/{dist → src}/templates/ResourceTemplateOld.tsx.bkup +0 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import { useState, useEffect, useContext, useCallback, useRef } from 'react';
|
|
2
|
+
import { difference } from 'lodash';
|
|
3
|
+
import usePrevious from '@rooks/use-previous';
|
|
4
|
+
import { Channel } from 'laravel-echo/src/channel';
|
|
5
|
+
import Echo, { EchoOptions } from 'laravel-echo';
|
|
6
|
+
import Pusher from 'pusher-js';
|
|
7
|
+
|
|
8
|
+
import { ConstantsContext } from '../../config/ConstantsService';
|
|
9
|
+
import { getEnv } from 'dash-constants/src/DASHAdminSystemConstants';
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
import { IDASHAppState } from 'dash-admin-state';
|
|
14
|
+
import { IDashAutoAdminResourceConfig } from 'dash-auto-admin';
|
|
15
|
+
import { useSelector } from 'react-redux';
|
|
16
|
+
|
|
17
|
+
import { dashStorage } from 'dash-utils';
|
|
18
|
+
// Make Pusher available globally
|
|
19
|
+
(window as any).Pusher = Pusher;
|
|
20
|
+
|
|
21
|
+
// Singleton manager for Echo clients
|
|
22
|
+
class EchoClientManager {
|
|
23
|
+
private static instance: EchoClientManager;
|
|
24
|
+
public clients: Map<string, Echo<"pusher">>;
|
|
25
|
+
|
|
26
|
+
private constructor() {
|
|
27
|
+
this.clients = new Map();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public static getInstance(): EchoClientManager {
|
|
31
|
+
if (!EchoClientManager.instance) {
|
|
32
|
+
EchoClientManager.instance = new EchoClientManager();
|
|
33
|
+
}
|
|
34
|
+
return EchoClientManager.instance;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public setClient(hash: string, client: Echo<"pusher">): void {
|
|
38
|
+
this.clients.set(hash, client);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public getClient(hash: string): Echo<"pusher"> | undefined {
|
|
42
|
+
return this.clients.get(hash);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public removeClient(hash: string): boolean {
|
|
46
|
+
return this.clients.delete(hash);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public hasClient(hash: string): boolean {
|
|
50
|
+
return this.clients.has(hash);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const echoManager = EchoClientManager.getInstance();
|
|
55
|
+
|
|
56
|
+
const useLaravelEcho = ({
|
|
57
|
+
type,
|
|
58
|
+
channel,
|
|
59
|
+
events,
|
|
60
|
+
userId,
|
|
61
|
+
socketId,
|
|
62
|
+
pingInterval = 30000, // Default ping interval: 30 seconds
|
|
63
|
+
debug = true,
|
|
64
|
+
enabled = false
|
|
65
|
+
}: {
|
|
66
|
+
type: 'public' | 'private';
|
|
67
|
+
channel: string;
|
|
68
|
+
events?: { [key: string]: (e: any) => any };
|
|
69
|
+
userId?: number;
|
|
70
|
+
socketId?: string;
|
|
71
|
+
pingInterval?: number;
|
|
72
|
+
debug?: boolean,
|
|
73
|
+
enabled?:boolean
|
|
74
|
+
}) => {
|
|
75
|
+
const [echoChannel, setEchoChannel] = useState<Channel | null>(null);
|
|
76
|
+
const [laravelEchoClient, setLaravelEchoClient] = useState<Echo<"pusher"> | null>(null);
|
|
77
|
+
const [lastEvent, setLastEvent] = useState<{ event: string, data: any ,channel?:string}>(null);
|
|
78
|
+
const [isConnected, setIsConnected] = useState(false);
|
|
79
|
+
const prevChannel = usePrevious(channel);
|
|
80
|
+
const constants = useContext(ConstantsContext);
|
|
81
|
+
const pingTimerRef = useRef<number | null>(null);
|
|
82
|
+
|
|
83
|
+
const auth: any = useSelector(
|
|
84
|
+
(state: IDASHAppState<any, any, IDashAutoAdminResourceConfig>) =>
|
|
85
|
+
state.auth
|
|
86
|
+
);
|
|
87
|
+
const [currentUserId, setCurrentUserId] = useState(null);
|
|
88
|
+
|
|
89
|
+
console.log('🔍 useLaravelEcho: Hook called with params:', {
|
|
90
|
+
type,
|
|
91
|
+
channel,
|
|
92
|
+
userId,
|
|
93
|
+
enabled,
|
|
94
|
+
hasAuth: !!auth?.user,
|
|
95
|
+
authUserId: auth?.user?.id,
|
|
96
|
+
authenticated: auth?.authenticated
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
|
|
101
|
+
if (auth.user?.id && typeof auth.user.id === 'number' && auth.user.id !== userId) {
|
|
102
|
+
setCurrentUserId(auth.user.id);
|
|
103
|
+
}
|
|
104
|
+
if (auth?.authenticated === false) {
|
|
105
|
+
setCurrentUserId(null);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
}, [auth])
|
|
109
|
+
|
|
110
|
+
const isProd = getEnv('APP_ENV') === 'production';
|
|
111
|
+
//const isProd = false;
|
|
112
|
+
const log = (message: string, data?: any) => {
|
|
113
|
+
if (debug) {
|
|
114
|
+
console.log(`%c📡 ${message}`, 'color: #2196F3; font-weight: bold; font-size: 12px;', data || '');
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const logError = (message: string, error?: any) => {
|
|
119
|
+
if (debug) {
|
|
120
|
+
console.error(`%c📡 ${message}`, 'color: #f44336; font-weight: bold; font-size: 12px;', error || '');
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const pingConnection = useCallback(() => {
|
|
125
|
+
if (laravelEchoClient && laravelEchoClient.connector && laravelEchoClient.connector.pusher) {
|
|
126
|
+
try {
|
|
127
|
+
log('Sending custom ping event...');
|
|
128
|
+
laravelEchoClient.connector.pusher.send_event('client-ping', {
|
|
129
|
+
timestamp: new Date().toISOString()
|
|
130
|
+
});
|
|
131
|
+
} catch (error) {
|
|
132
|
+
logError('Error pinging WebSocket connection:', error);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}, [laravelEchoClient, debug]);
|
|
136
|
+
|
|
137
|
+
// Hash for the client, it has to be like that, because public channel is open parallel to private which requires userid
|
|
138
|
+
// For now this implementation is constrained to 2 clients, one for public and one for private only.
|
|
139
|
+
const getClientId = useCallback(() => {
|
|
140
|
+
//return `${type}-${userId || 'public'}`;
|
|
141
|
+
return `${type}-${channel || 'global'}-${userId || 'public'}`;
|
|
142
|
+
}, [type, userId, channel]);
|
|
143
|
+
|
|
144
|
+
const cleanup = useCallback(() => {
|
|
145
|
+
if (pingTimerRef.current) {
|
|
146
|
+
window.clearInterval(pingTimerRef.current);
|
|
147
|
+
pingTimerRef.current = null;
|
|
148
|
+
}
|
|
149
|
+
//if (laravelEchoClient) {
|
|
150
|
+
log('Disconnecting Laravel Echo client...', getClientId());
|
|
151
|
+
//echoManager.getClient(getClientId()).disconnect();
|
|
152
|
+
laravelEchoClient && laravelEchoClient.disconnect();
|
|
153
|
+
//echoManager.getClient(getClientId()).disconnect();
|
|
154
|
+
log('Setting Laravel Echo client to null...');
|
|
155
|
+
setLaravelEchoClient(null);
|
|
156
|
+
log('Setting Echo channel to null...');
|
|
157
|
+
setEchoChannel(null);
|
|
158
|
+
log('Clearing current events...');
|
|
159
|
+
setLastEvent(null);
|
|
160
|
+
log('Setting connection status to false...');
|
|
161
|
+
setIsConnected(false);
|
|
162
|
+
log('Removing client from Echo manager...');
|
|
163
|
+
//echoManager.removeClient(getClientId())
|
|
164
|
+
//}
|
|
165
|
+
}, [laravelEchoClient]);
|
|
166
|
+
|
|
167
|
+
useEffect(() => {
|
|
168
|
+
|
|
169
|
+
if(!enabled) {
|
|
170
|
+
console.log('🔍 useLaravelEcho: Hook disabled, skipping WebSocket setup');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (!(JSON.parse(getEnv('APP_SOCKETS_ENABLED')))) {
|
|
175
|
+
console.log('🔍 useLaravelEcho: WebSockets disabled by APP_SOCKETS_ENABLED env var');
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/*
|
|
180
|
+
if (!userId) {
|
|
181
|
+
return
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (type === 'private' && !userId) {
|
|
185
|
+
console.log('[WebSocket] Skipping private channel - no userId specified');
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
*/
|
|
189
|
+
|
|
190
|
+
const clientId = getClientId();
|
|
191
|
+
|
|
192
|
+
console.log('🔍 useLaravelEcho: Setting up WebSocket connection...', {
|
|
193
|
+
clientId,
|
|
194
|
+
type,
|
|
195
|
+
channel,
|
|
196
|
+
userId,
|
|
197
|
+
enabled
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// For private channels, we need a userId for authentication
|
|
201
|
+
if (type === 'private' && !userId) {
|
|
202
|
+
console.log('🔍 useLaravelEcho: Skipping private channel setup - no userId provided');
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (type === 'public' || (type === 'private' && userId)) {
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
if (echoManager.clients.has(clientId)) {
|
|
210
|
+
const existingClient = echoManager.getClient(clientId);
|
|
211
|
+
|
|
212
|
+
console.log('🔍 useLaravelEcho: Using existing Echo client:', clientId);
|
|
213
|
+
setLaravelEchoClient(existingClient);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const token = userId ? dashStorage.getItem('token') : null;
|
|
218
|
+
|
|
219
|
+
const authConfig = token ? {
|
|
220
|
+
headers: {
|
|
221
|
+
Authorization: `Bearer ${token}`,
|
|
222
|
+
Accept: 'application/json',
|
|
223
|
+
'X-Requested-With': 'XMLHttpRequest',
|
|
224
|
+
}
|
|
225
|
+
} : undefined;
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
const socketHostEnv = getEnv('APP_SOCKETS_HOST');
|
|
230
|
+
const socketScheme = getEnv('APP_SOCKETS_SCHEME')?.toLowerCase();
|
|
231
|
+
const isSSL = socketScheme === 'https';
|
|
232
|
+
|
|
233
|
+
// Use host from env or fallback to window.location.hostname
|
|
234
|
+
const wsHost = socketHostEnv || window.location.hostname;
|
|
235
|
+
|
|
236
|
+
const portEnv = getEnv('APP_SOCKETS_PORT');
|
|
237
|
+
const completeConfig = {
|
|
238
|
+
broadcaster: 'pusher',
|
|
239
|
+
key: getEnv('APP_SOCKETS_KEY') || 'dash',
|
|
240
|
+
wsHost,
|
|
241
|
+
...(portEnv && portEnv !== '' ? { wsPort: portEnv } : {}),
|
|
242
|
+
secure: isSSL,
|
|
243
|
+
forceTLS: isSSL,
|
|
244
|
+
encrypted: isSSL,
|
|
245
|
+
useTLS: isSSL,
|
|
246
|
+
disableStats: !isSSL,
|
|
247
|
+
enabledTransports: isSSL ? ['wss', 'ws'] : ['ws'],
|
|
248
|
+
disableCluster: true,
|
|
249
|
+
cluster: 'mt1',
|
|
250
|
+
logToConsole: debug,
|
|
251
|
+
activityTimeout: 120000,
|
|
252
|
+
pongTimeout: 30000,
|
|
253
|
+
};
|
|
254
|
+
console.log('🔍 useLaravelEcho: WebSocket config:', completeConfig);
|
|
255
|
+
|
|
256
|
+
if (authConfig) {
|
|
257
|
+
const baseUrl = getEnv('APP_BACKEND_URL') || window.location.origin;
|
|
258
|
+
const authPath = getEnv('APP_SOCKETS_AUTH_ENDPOINT') || '/api/ws/auth';
|
|
259
|
+
const formattedBaseUrl = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
|
|
260
|
+
const formattedAuthPath = authPath.startsWith('/') ? authPath.substring(1) : authPath;
|
|
261
|
+
const authEndpoint = `${formattedBaseUrl}${formattedAuthPath}`;
|
|
262
|
+
|
|
263
|
+
console.log('🔍 useLaravelEcho: Using auth endpoint:', authEndpoint);
|
|
264
|
+
completeConfig['authEndpoint'] = authEndpoint;
|
|
265
|
+
completeConfig['auth'] = authConfig;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
console.log('🔍 useLaravelEcho: Initializing Echo client with config:', completeConfig);
|
|
269
|
+
const echo = new Echo(completeConfig as EchoOptions<"pusher">);
|
|
270
|
+
if (echo.connector && echo.connector.pusher) {
|
|
271
|
+
echo.connector.pusher.bind_global((eventName, data) => {
|
|
272
|
+
log(`Global event received: ${eventName}`, data);
|
|
273
|
+
setLastEvent({ event: eventName, data });
|
|
274
|
+
/*if (typeof events[eventName] === 'function') {
|
|
275
|
+
events[eventName](data);
|
|
276
|
+
}*/
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
echo.connector.pusher.connection.bind('connected', () => {
|
|
280
|
+
log('Connected to Pusher!');
|
|
281
|
+
setIsConnected(true);
|
|
282
|
+
dashStorage.setItem('socketConnectionState', 'true');
|
|
283
|
+
|
|
284
|
+
if (pingTimerRef.current) {
|
|
285
|
+
window.clearInterval(pingTimerRef.current);
|
|
286
|
+
}
|
|
287
|
+
pingTimerRef.current = window.setInterval(pingConnection, pingInterval);
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
echo.connector.pusher.connection.bind('disconnected', () => {
|
|
291
|
+
log('Disconnected from Pusher');
|
|
292
|
+
setIsConnected(false);
|
|
293
|
+
|
|
294
|
+
if (pingTimerRef.current) {
|
|
295
|
+
window.clearInterval(pingTimerRef.current);
|
|
296
|
+
pingTimerRef.current = null;
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
echo.connector.pusher.connection.bind('error', (err: any) => {
|
|
301
|
+
logError('Pusher connection error:', err);
|
|
302
|
+
setIsConnected(false);
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
log('Setting Echo client', clientId);
|
|
307
|
+
echoManager.setClient(clientId, echo);
|
|
308
|
+
setLaravelEchoClient(echo);
|
|
309
|
+
} catch (error) {
|
|
310
|
+
|
|
311
|
+
logError('Error initializing Echo client:', error);
|
|
312
|
+
cleanup();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return () => {
|
|
316
|
+
if (debug) {
|
|
317
|
+
console.log("%c📡 Socket listener unmounted!", "color: #ff6b6b; font-weight: bold;");
|
|
318
|
+
cleanup();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
}, [userId, enabled, channel]);
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
useEffect(() => {
|
|
328
|
+
if (!laravelEchoClient || !channel) return;
|
|
329
|
+
if (type === 'private' && !userId) return;
|
|
330
|
+
|
|
331
|
+
log(`Attempting to subscribe to ${type} channel: ${channel}`);
|
|
332
|
+
|
|
333
|
+
const isSubscribed = laravelEchoClient.connector.channels[channel.includes('.') ? `private-${channel}` : channel] !== undefined;
|
|
334
|
+
if (isSubscribed) {
|
|
335
|
+
log(`Skipping, already suscribed`);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
if (echoChannel && prevChannel && channel !== prevChannel) {
|
|
340
|
+
log(`Leaving previous channel: ${prevChannel}`);
|
|
341
|
+
laravelEchoClient.leaveChannel(prevChannel);
|
|
342
|
+
setEchoChannel(null);
|
|
343
|
+
//setCurrentEvents([]);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (!echoChannel || channel !== prevChannel) {
|
|
347
|
+
try {
|
|
348
|
+
let newChannel;
|
|
349
|
+
|
|
350
|
+
if (type === 'private') {
|
|
351
|
+
log(`Subscribing to private channel: ${channel}`);
|
|
352
|
+
newChannel = laravelEchoClient.private(channel.replace('{userId}', userId.toString()));
|
|
353
|
+
} else {
|
|
354
|
+
log(`Subscribing to public channel: ${channel}`);
|
|
355
|
+
newChannel = laravelEchoClient.channel(channel);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
setEchoChannel(newChannel);
|
|
359
|
+
log('Channel subscription successful:', newChannel);
|
|
360
|
+
} catch (error) {
|
|
361
|
+
logError(`Error subscribing to ${type} channel ${channel}:`, error);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return () => {
|
|
366
|
+
if (laravelEchoClient && channel) {
|
|
367
|
+
laravelEchoClient.leaveChannel(channel);
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
}, [laravelEchoClient, channel, type, userId, prevChannel, debug]);
|
|
371
|
+
|
|
372
|
+
useEffect(() => {
|
|
373
|
+
if (!laravelEchoClient || !isConnected) return;
|
|
374
|
+
|
|
375
|
+
const handleVisibilityChange = () => {
|
|
376
|
+
if (document.visibilityState === 'visible') {
|
|
377
|
+
if (laravelEchoClient.connector &&
|
|
378
|
+
laravelEchoClient.connector.pusher &&
|
|
379
|
+
laravelEchoClient.connector.pusher.connection.state !== 'connected') {
|
|
380
|
+
log('Tab is visible again, reconnecting...');
|
|
381
|
+
laravelEchoClient.connector.pusher.connect();
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
const handleOnline = () => {
|
|
387
|
+
log('Browser is online, reconnecting...');
|
|
388
|
+
if (laravelEchoClient.connector && laravelEchoClient.connector.pusher) {
|
|
389
|
+
laravelEchoClient.connector.pusher.connect();
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
document.addEventListener('visibilitychange', handleVisibilityChange);
|
|
394
|
+
window.addEventListener('online', handleOnline);
|
|
395
|
+
|
|
396
|
+
return () => {
|
|
397
|
+
document.removeEventListener('visibilitychange', handleVisibilityChange);
|
|
398
|
+
window.removeEventListener('online', handleOnline);
|
|
399
|
+
};
|
|
400
|
+
}, [laravelEchoClient, isConnected, debug]);
|
|
401
|
+
|
|
402
|
+
const addListener = useCallback((eventName: string, callback: (data: any) => void) => {
|
|
403
|
+
|
|
404
|
+
if (!echoChannel) return;
|
|
405
|
+
console.log(`Adding listener for event: ${eventName}`);
|
|
406
|
+
//const formattedEventName = eventName.startsWith('.') ? eventName : `.${eventName}`;
|
|
407
|
+
const formattedEventName = eventName;
|
|
408
|
+
echoChannel.listen(formattedEventName, callback);
|
|
409
|
+
//setCurrentEvents(prev => [...prev, eventName]);
|
|
410
|
+
}, [echoChannel]);
|
|
411
|
+
|
|
412
|
+
const removeListener = useCallback((eventName: string) => {
|
|
413
|
+
|
|
414
|
+
if (!echoChannel) return;
|
|
415
|
+
console.log(`Adding listener for event: ${eventName}`);
|
|
416
|
+
//const formattedEventName = eventName.startsWith('.') ? eventName : `.${eventName}`;
|
|
417
|
+
const formattedEventName = eventName;
|
|
418
|
+
echoChannel.stopListening(formattedEventName);
|
|
419
|
+
//setCurrentEvents(prev => prev.filter(e => e !== eventName));
|
|
420
|
+
}, [echoChannel]);
|
|
421
|
+
|
|
422
|
+
return {
|
|
423
|
+
echoChannel,
|
|
424
|
+
isConnected,
|
|
425
|
+
lastEvent,
|
|
426
|
+
ping: pingConnection,
|
|
427
|
+
addListener,
|
|
428
|
+
removeListener
|
|
429
|
+
};
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
export default useLaravelEcho;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
|
|
2
|
+
import React, { FC } from 'react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Defines the interface for the DictionaryContext, which provides access to a dictionary of key-value pairs and a set of replacements to be applied to strings.
|
|
6
|
+
*
|
|
7
|
+
* @interface IDictionaryContext
|
|
8
|
+
* @property {{[key: string]: any}} dictionary - An object containing the dictionary of key-value pairs.
|
|
9
|
+
* @property {{[key: string]: any}} replacements - An object containing the replacements to be applied to strings.
|
|
10
|
+
* @property {function(string, boolean?): string} get - A function that retrieves the value for a given key from the dictionary, optionally applying the replacements.
|
|
11
|
+
*/
|
|
12
|
+
export interface IDictionaryContext {
|
|
13
|
+
dictionary: { [key: string]: any };
|
|
14
|
+
replacements: { [key: string]: any };
|
|
15
|
+
get: (key: string, replace?:boolean) => string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Recursively replaces all occurrences of keys in the provided `dictionary` object with their corresponding values in the given `string`.
|
|
20
|
+
*
|
|
21
|
+
* @param string - The input string to perform the replacements on.
|
|
22
|
+
* @param dictionary - An object containing key-value pairs to use for the replacements.
|
|
23
|
+
* @returns The input string with all replacements made.
|
|
24
|
+
*/
|
|
25
|
+
function replaceDictValues(string: string, dictionary: { [key: string]: string }): string {
|
|
26
|
+
for (const [key, value] of Object.entries(dictionary)) {
|
|
27
|
+
if (typeof value === 'object' && value !== null) {
|
|
28
|
+
string = replaceDictValues(string, value);
|
|
29
|
+
} else {
|
|
30
|
+
string = Array.isArray(string) ? string.join(', ').replace(key, value) : typeof string === 'string' ? string.replace(key, value) : string;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Provides a context for accessing a dictionary of key-value pairs and a set of replacements to be applied to strings.
|
|
40
|
+
*
|
|
41
|
+
* The `DictionaryContext` exposes an interface with the following properties:
|
|
42
|
+
* - `dictionary`: An object containing the dictionary of key-value pairs.
|
|
43
|
+
* - `replacements`: An object containing the replacements to be applied to strings.
|
|
44
|
+
* - `get`: A function that retrieves the value for a given key from the dictionary, optionally applying the replacements.
|
|
45
|
+
*/
|
|
46
|
+
export const DictionaryContext = React.createContext<IDictionaryContext>({
|
|
47
|
+
dictionary: null,
|
|
48
|
+
replacements: null,
|
|
49
|
+
get: (key: string/* , replace?:boolean*/) => {
|
|
50
|
+
return key; /*return constants.dict[key] ? constants.dict[key] : key*/
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Provides a `DictionaryContext.Provider` component that wraps child components and provides access to a dictionary of key-value pairs and a set of replacements to be applied to strings.
|
|
56
|
+
*
|
|
57
|
+
* The `DictionaryProvider` component accepts the following props:
|
|
58
|
+
* - `dictionary`: An object containing the dictionary of key-value pairs.
|
|
59
|
+
* - `replacements`: An object containing the replacements to be applied to strings.
|
|
60
|
+
* - `children`: The React nodes to be wrapped by the `DictionaryContext.Provider`.
|
|
61
|
+
*
|
|
62
|
+
* The `DictionaryContext.Provider` exposes the following values:
|
|
63
|
+
* - `dictionary`: The dictionary of key-value pairs.
|
|
64
|
+
* - `replacements`: The replacements to be applied to strings.
|
|
65
|
+
* - `get`: A function that retrieves the value for a given key from the dictionary, optionally applying the replacements.
|
|
66
|
+
*
|
|
67
|
+
* @returns The DictionaryProvider component
|
|
68
|
+
*/
|
|
69
|
+
const DictionaryProvider: FC<{
|
|
70
|
+
dictionary: { [key: string]: any };
|
|
71
|
+
replacements: { [key: string]: any };
|
|
72
|
+
children: React.ReactNode;
|
|
73
|
+
}> = ({ dictionary, replacements, children }) => {
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
<DictionaryContext.Provider
|
|
77
|
+
value={{
|
|
78
|
+
dictionary,
|
|
79
|
+
replacements,
|
|
80
|
+
get: (key: string, replace?:boolean) => {
|
|
81
|
+
let str = key;
|
|
82
|
+
if (replace && replacements) {
|
|
83
|
+
str = replaceDictValues(str, replacements);
|
|
84
|
+
}
|
|
85
|
+
return dictionary[str] ? dictionary[str] : str;
|
|
86
|
+
},
|
|
87
|
+
}}
|
|
88
|
+
>
|
|
89
|
+
{children}
|
|
90
|
+
</DictionaryContext.Provider>
|
|
91
|
+
);
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export { DictionaryContext as default, DictionaryProvider };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { ToastContainer } from 'react-toastify';
|
|
3
|
+
import { DialogServiceProvider } from 'dash-dialog';
|
|
4
|
+
import DASHModal from 'dash-modal';
|
|
5
|
+
import { LaravelEchoProvider } from '../contexts/com/LaravelEchoContext';
|
|
6
|
+
import {DASHAppConstants} from 'dash-constants';
|
|
7
|
+
import { CacheInvalidatorContextProvider } from '../utils/cache/CacheInvalidatorContext';
|
|
8
|
+
// Direct imports to avoid circular barrel imports
|
|
9
|
+
import CacheInvalidatorListenerComponent from '../utils/cache/CacheInvalidatorListenerComponent';
|
|
10
|
+
import DASHGlobalErrorHandler from '../components/misc/DASHGlobalErrorHandler';
|
|
11
|
+
import DashQueryClientContext from '../contexts/DashQueryClientContext';
|
|
12
|
+
import { FCMProvider } from '../contexts/com/FCMContext';
|
|
13
|
+
import Redirect from '../components/custom/Redirect';
|
|
14
|
+
import WSMessagesManager from '../hooks/notifications/WSMessagesManager';
|
|
15
|
+
import { Theme } from '@mui/material';
|
|
16
|
+
import { LocalizationProvider, LocalizationProviderProps } from '@mui/x-date-pickers';
|
|
17
|
+
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
|
|
18
|
+
import { AuthContextProvider } from '../contexts/auth';
|
|
19
|
+
import { Provider } from 'react-redux';
|
|
20
|
+
import { IDASHAppState } from 'dash-admin-state';
|
|
21
|
+
import { Store } from 'redux';
|
|
22
|
+
import { DashThemeProvider } from './DashThemeContext';
|
|
23
|
+
import { ComponentRegistryProvider, IDashAutoAdminCustomFieldComponent } from 'dash-auto-admin';
|
|
24
|
+
import { QueryClient } from '@tanstack/react-query';
|
|
25
|
+
import { Persister } from '@tanstack/react-query-persist-client';
|
|
26
|
+
import { I18nBridgeProvider, useI18nBridge } from '../contexts/I18nBridgeContext';
|
|
27
|
+
|
|
28
|
+
export interface IDomainAppProviders<U, A, R> extends React.PropsWithChildren {
|
|
29
|
+
wsMessagesManager?: typeof WSMessagesManager
|
|
30
|
+
theme?: Partial<Theme> | ((outerTheme: Partial<Theme>) => Partial<Theme>)
|
|
31
|
+
dateAdapter?: LocalizationProviderProps<any>["dateAdapter"]
|
|
32
|
+
store?: Store<IDASHAppState<U, A, R>>
|
|
33
|
+
extendedThemeOptions?: any
|
|
34
|
+
dashAutoAdminComponents?: Record<string, React.FC<IDashAutoAdminCustomFieldComponent>>
|
|
35
|
+
queryClient?: any
|
|
36
|
+
/** Optional persister for localStorage query caching */
|
|
37
|
+
queryPersister?: Persister
|
|
38
|
+
CustomEchoProvider?: React.ComponentType<any>
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* BridgedDASHModal
|
|
43
|
+
*
|
|
44
|
+
* A wrapper for DASHModal that uses the I18nBridgeContext to provide
|
|
45
|
+
* translations when rendered outside of the React Admin context.
|
|
46
|
+
*/
|
|
47
|
+
const BridgedDASHModal = (props: any) => {
|
|
48
|
+
const { i18nProvider, locale } = useI18nBridge();
|
|
49
|
+
|
|
50
|
+
const translate = React.useCallback((key: string, options?: any) => {
|
|
51
|
+
if (!i18nProvider) return key;
|
|
52
|
+
try {
|
|
53
|
+
return i18nProvider.translate(key, options);
|
|
54
|
+
} catch (e) {
|
|
55
|
+
return key;
|
|
56
|
+
}
|
|
57
|
+
}, [i18nProvider, locale]);
|
|
58
|
+
|
|
59
|
+
const confirmText = props.confirmText === undefined ? translate('dash.action.continue') : props.confirmText;
|
|
60
|
+
const cancelText = props.cancelText === undefined ? translate('dash.action.cancel') : props.cancelText;
|
|
61
|
+
|
|
62
|
+
return <DASHModal {...props} confirmText={confirmText} cancelText={cancelText} />;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const DomainAppProviders = <U, A, R>({
|
|
66
|
+
wsMessagesManager,
|
|
67
|
+
dateAdapter,
|
|
68
|
+
store,
|
|
69
|
+
children,
|
|
70
|
+
extendedThemeOptions,
|
|
71
|
+
dashAutoAdminComponents,
|
|
72
|
+
queryClient,
|
|
73
|
+
|
|
74
|
+
queryPersister,
|
|
75
|
+
CustomEchoProvider
|
|
76
|
+
}: IDomainAppProviders<U, A, R>): React.JSX.Element => {
|
|
77
|
+
|
|
78
|
+
const content = (
|
|
79
|
+
<I18nBridgeProvider>
|
|
80
|
+
<DashThemeProvider extendedOptions={extendedThemeOptions}>
|
|
81
|
+
<LocalizationProvider dateAdapter={dateAdapter || AdapterDayjs}>
|
|
82
|
+
<AuthContextProvider>
|
|
83
|
+
<DashQueryClientContext queryClient={queryClient} persister={queryPersister}>
|
|
84
|
+
<ComponentRegistryProvider customComponents={dashAutoAdminComponents || {}}>
|
|
85
|
+
<DialogServiceProvider
|
|
86
|
+
component={BridgedDASHModal}
|
|
87
|
+
componentProps={{ sound: DASHAppConstants.system.UI_SOUNDS }}
|
|
88
|
+
|
|
89
|
+
><FCMProvider>
|
|
90
|
+
{/* Use CustomEchoProvider if provided, otherwise default to LaravelEchoProvider */}
|
|
91
|
+
{(() => {
|
|
92
|
+
const EchoProvider = CustomEchoProvider || LaravelEchoProvider;
|
|
93
|
+
return (
|
|
94
|
+
<EchoProvider manager={wsMessagesManager || WSMessagesManager}>
|
|
95
|
+
<CacheInvalidatorContextProvider>
|
|
96
|
+
<CacheInvalidatorListenerComponent />
|
|
97
|
+
<ToastContainer style={{ width: '520px' }} />
|
|
98
|
+
<DASHGlobalErrorHandler />
|
|
99
|
+
{children}
|
|
100
|
+
</CacheInvalidatorContextProvider>
|
|
101
|
+
</EchoProvider>
|
|
102
|
+
);
|
|
103
|
+
})()}
|
|
104
|
+
</FCMProvider>
|
|
105
|
+
</DialogServiceProvider>
|
|
106
|
+
</ComponentRegistryProvider>
|
|
107
|
+
</DashQueryClientContext>
|
|
108
|
+
</AuthContextProvider>
|
|
109
|
+
</LocalizationProvider>
|
|
110
|
+
</DashThemeProvider>
|
|
111
|
+
</I18nBridgeProvider>
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
return store ? <Provider store={store}>{content}</Provider> : content;
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
export default DomainAppProviders;
|