@dashadmin/dash-admin 1.3.24 → 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
|
@@ -1 +1,679 @@
|
|
|
1
|
-
var y=Object.defineProperty;var N=(m,t,e)=>t in m?y(m,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):m[t]=e;var p=(m,t,e)=>N(m,typeof t!="symbol"?t+"":t,e);import{createAxiosInstance as E}from"@dashadmin/dash-axios-hook";import{setCookie as _}from"../../utils/cookies";import{getEnv as g}from"../../config/DASHAdminSystemConstants";import{AuthPersistenceService as h,syncLocalStorageToDeviceStore as u,clearDeviceStoreAuth as v}from"@dashadmin/dash-auth";import{DASHAppConstants as T}from"@dashadmin/dash-constants";import{DASHAdminSystemConstants as R}from"@dashadmin/dash-constants";import{dashStorage as r}from"@dashadmin/dash-utils";import{DASH_REDUX_ACTIONS as S,dispatchToRedux as k}from"@dashadmin/dash-admin-state";import{ACTION_UPDATE_AUTH as I}from"@dashadmin/dash-admin-state/src/redux/reducers/Auth";class w{constructor(){p(this,"axiosInstance");p(this,"REDIRECT_STORAGE_KEY","redirectAfterLogin");p(this,"logoutFromStorage",async t=>{console.log("logoutFromStorage",t),h.markAsLoggedOut(),await v();const{DashIPCService:e}=window;e&&e.action("stop-bg-service")});p(this,"getInitialAuthState",()=>{try{const t=h.getAuth(),e=h.getUser(),s=h.getToken(),n=JSON.parse(r.getItem("authenticated")||"false");if(console.log("\u{1F50D} DASHLightApp: Initializing auth state with persisted data:",{hasPersistedAuth:!!t,hasStoredUser:!!e,hasStoredToken:!!s,isAuthenticated:n,storedUser:e?`${e.name||e.email} (${e.id})`:null,persistedAuthStructure:t?Object.keys(t):null}),n&&e&&s&&t){console.log("\u2705 DASHLightApp: Using persisted auth state");const a={authenticated:!0,user:e,auth:t.auth||null};return console.log("\u{1F50D} DASHLightApp: Constructed auth state:",{authenticated:a.authenticated,user:a.user?`${a.user.name||a.user.email} (${a.user.id})`:null,auth:a.auth?"present":null}),a}return s&&!n?(console.log("\u{1F504} DASHLightApp: Token found but not authenticated, will initialize later"),{authenticated:!1,user:null,auth:null}):(console.log("\u2139\uFE0F DASHLightApp: No valid persisted auth found, using default auth state"),{authenticated:!1,user:null,auth:null})}catch(t){return console.error("\u274C DASHLightApp: Error getting initial auth state:",t),{authenticated:!1,user:null,auth:null}}});this.axiosInstance=E()}reinitializeAxios(t){this.axiosInstance=E(t)}sanitizeRedirectUrl(t){if(!t)return"/";const e=/^\/[A-Za-z]:\/|^[A-Za-z]:\/|^file:\/\//i.test(t),s=window.location.protocol==="file:"||g("IS_ELECTRON")==="true"||g("IS_ELECTRON")===!0;if((e||t.includes("index.html"))&&t.includes("#")){const n=t.split("#");if(n.length>1&&n[1]){const a=n[1];return console.log("Detected file/electron path with hash, extracting route:",a),"#"+a}}return e?(console.log("Detected Windows file path in redirect, resetting to #/"),"#/"):t.includes("/resources/app/")||t.includes("/dist/index.html")||t.includes("Program Files")?(console.log("Detected Electron app path in redirect, resetting to #/"),"#/"):s&&t.startsWith("/")&&!t.startsWith("#")?(console.log("Detected Electron environment with standard path, adding hash prefix:",t),"#"+t):t}setPendingRedirect(t){if(!t||t==="/"||t==="#/"||t==="#"){console.log("Skipping pending redirect for root path:",t);return}const e=this.sanitizeRedirectUrl(t);if(e==="/"||e==="#/"||e==="#"){console.log("Skipping pending redirect for sanitized root path:",e);return}console.log("Setting pending redirect:",t,"\u2192",e),r.setItem(this.REDIRECT_STORAGE_KEY,e)}getPendingRedirect(){return r.getItem(this.REDIRECT_STORAGE_KEY)}clearPendingRedirect(){console.log("Clearing pending redirect"),r.removeItem(this.REDIRECT_STORAGE_KEY)}getRoleRedirect(t){const e=t?.roles;if(Array.isArray(e)&&e.length>0){for(const s of e)if(s.redirect)return console.log("Found role redirect:",s.name,"->",s.redirect),s.redirect}return null}determineRedirectUrl(t,e=!0){let s=null;if(t)return console.log("Using backend redirect:",t,"(persist:",e,")"),s=t,e?(this.setPendingRedirect(s),this.getPendingRedirect()):this.sanitizeRedirectUrl(s);const n=this.getPendingRedirect();return n?(console.log("Using localStorage redirect:",n),n):(s=g("APP_DEFAULT_REDIRECT"),e?(this.setPendingRedirect(s),this.getPendingRedirect()):this.sanitizeRedirectUrl(s))}async login(t){if(console.log("=== DASH AUTH SERVICE LOGIN START ==="),console.log("Credentials:",{username:t.username,password:"***",redirect:t.redirect,meta:t.meta}),!(t.username&&t.password))return console.log("\u274C Missing credentials"),Promise.resolve({success:!1,error:"Username and password are required"});try{console.log("Making login request to /login");const e=await this.axiosInstance.post("/login",{email:t.username,password:t.password,redirect:t.redirect,meta:t.meta});if(console.log("Login response status:",e.status),console.log("Login response data:",e.data),e.status>=200&&e.status<=299){console.log("\u2705 Login response successful");const s=e.data.redirectTo;console.log("\u{1F3AF} Backend redirectTo:",s);const n=new Date;if(new Date().setDate(n.getDate()+2),e.data&&e.data.token){console.log("Setting token in storage"),r.setItem("token",e.data.token);const c=e.data?.refresh_token||e.data?.refreshToken;c&&(console.log("Setting refresh token in storage"),r.setItem("refreshToken",c)),e.data?.meta&&(console.log("Setting app"),r.setItem("app",e.data.meta.app)),await u()}else console.warn("\u26A0\uFE0F No token in login response");try{console.log("Getting auth data from:",g("APP_GETAUTH_ENDPOINT"));const c=await this.axiosInstance.get(g("APP_GETAUTH_ENDPOINT"));console.log("Auth response status:",c.status),console.log("Auth response data:",c.data);const i=c.data;let o=s;if(!o){const A=this.getRoleRedirect(i.user),f=i.redirect||i.user?.redirect||A||null;console.log("Auth response redirect:",f,"(role redirect:",A,")"),f?o=f:t.redirect&&t.redirect!=="/login"?o=t.redirect:o=g("APP_DEFAULT_REDIRECT")||"/"}console.log("\u{1F3AF} Final redirect determined:",o),h.saveAuth(i);const l=i.auth?.tenantSettings?.primary_language_code||i.user?.preferences?.locale;l&&(localStorage.setItem("dash-user-locale",l),window.dispatchEvent(new CustomEvent("dash:locale-change",{detail:{locale:l}})),console.log("\u{1F310} DASHAuthService: Dispatched locale change event:",l)),r.setItem("authenticated","true"),r.setItem("user",JSON.stringify(i.user)),r.setItem("roles",i.user?.roles?JSON.stringify(i.user.roles):JSON.stringify(T.system.GUEST_ROLE)),JSON.parse(R.system.ENABLE_TENANT_IMPERSONATION.toString())&&i.user?.tenant_id&&(r.setItem("tenant_id",i.user?.tenant_id),r.setItem("user_id",i.user?.id));const d={authenticated:!0,user:i.user,auth:i.auth,token:e.data.token||r.getItem("token"),roles:i.user?.roles};return console.log("\u{1F504} DASHAuthenticationService: Dispatching to Redux:",d),k(S.updateAuth(I,{user:d.user,authenticated:d.authenticated,auth:d.auth})),await u(),console.log("\u2705 Login completed successfully"),Promise.resolve({success:!0,token:d.token,user:d.user,auth:d.auth,redirectAfterLogin:o})}catch(c){return await u(),console.error("\u274C Error getting auth data:",c),this.logoutFromStorage("login get auth error"),Promise.resolve({success:!1,error:"Failed to get user authentication data"})}}else return await u(),console.log("\u274C Login response status not successful:",e.status),this.logoutFromStorage("login status error logout"),Promise.reject({success:!1,error:`Login failed with status: ${e.status}`})}catch(e){return await u(),console.error("\u274C Login error:",e),console.error("Error details:",{message:e?.message,response:e?.response?.data,status:e?.response?.status}),this.logoutFromStorage("login error logout"),await u(),Promise.reject({success:!1,error:e?.response?.data?.message||e?.message||"Login failed"})}}async initializeFromToken(){const t=r.getItem("token");if(!t)return{success:!1,error:"No token found"};try{console.log("Initializing auth from existing token...");const{data:e}=await this.axiosInstance.get(g("APP_GETAUTH_ENDPOINT")),s=this.getRoleRedirect(e.user),n=e.redirect||e.user?.redirect||s||null;console.log("Backend redirect found during token initialization:",n,"(role redirect:",s,")"),h.saveAuth(e),r.setItem("authenticated","true"),r.setItem("user",JSON.stringify(e.user)),r.setItem("roles",e.user?.roles?JSON.stringify(e.user.roles):JSON.stringify(T.system.GUEST_ROLE)),JSON.parse(R.system.ENABLE_TENANT_IMPERSONATION.toString())&&e.user?.tenant_id&&(r.setItem("tenant_id",e.user?.tenant_id),_("tenant_id",e.user?.tenant_id),r.setItem("user_id",e.user?.id),_("user_id",e.user?.id));const a={authenticated:!0,user:e.user,auth:e.auth,token:t,roles:e.user?.roles};console.log("\u{1F504} DASHAuthenticationService: Dispatching token init to Redux:",a),k(S.updateAuth(I,{user:a.user,authenticated:a.authenticated,auth:a.auth})),console.log("Auth initialized successfully from existing token"),await u();const c=this.determineRedirectUrl(n,!1);return{success:!0,token:t,user:e.user,auth:e.auth,redirectAfterLogin:c}}catch(e){return console.error("Error initializing auth from token:",e),this.logoutFromStorage("initialize from token error"),await u(),{success:!1,error:"Failed to initialize authentication from token"}}}async refreshToken(t){try{console.log("[DASHAuthService] Attempting to refresh token...");const e=await this.axiosInstance.post("/auth/refresh",{refresh_token:t});if(e.status>=200&&e.status<=299){const s=e.data;return s.token&&(r.setItem("token",s.token),console.log("[DASHAuthService] Access token updated")),s.refresh_token&&(r.setItem("refreshToken",s.refresh_token),console.log("[DASHAuthService] Refresh token rotated")),await u(),console.log("[DASHAuthService] Token refresh successful"),{success:!0,token:s.token,refreshToken:s.refresh_token,user:s.user}}else return console.warn("[DASHAuthService] Token refresh returned non-success status:",e.status),{success:!1,error:"Token refresh failed"}}catch(e){return console.error("[DASHAuthService] Token refresh error:",e),e?.response?.status===401&&(console.log("[DASHAuthService] Refresh token is invalid or expired"),this.logoutFromStorage("refresh_token_expired")),{success:!1,error:e?.response?.data?.message||e?.message||"Network error occurred"}}}async checkAuth(){const t=JSON.parse(r.getItem("authenticated")||"false"),e=JSON.parse(r.getItem("user")||"null");return!!(t&&e?.id&&h.getAuth())}async getIdentity(){if(!r.getItem("token"))throw new Error("No token present");try{const{data:e}=await this.axiosInstance.get(g("APP_GETAUTH_ENDPOINT"));return r.setItem("roles",e.user?.roles?JSON.stringify(e.user.roles):JSON.stringify(T.system.GUEST_ROLE)),r.setItem("authenticated","true"),r.setItem("user",JSON.stringify(e.user)),JSON.parse(R.system.ENABLE_TENANT_IMPERSONATION.toString())&&e.user?.tenant_id&&(r.setItem("tenant_id",e.user?.tenant_id),r.setItem("user_id",e.user?.id)),await u(),e}catch(e){throw this.logoutFromStorage("get identity error logout"),e}}async shouldRefreshToken(){return r.getItem("token")?!!r.getItem("refreshToken"):!1}async handleTokenRefresh(){const t=r.getItem("refreshToken");if(!t)return!1;try{const e=await this.refreshToken(t);if(e.success)return r.setItem("token",e.token),e.refreshToken&&r.setItem("refreshToken",e.refreshToken),await u(),!0}catch(e){console.error("Token refresh failed:",e),this.logoutFromStorage("token refresh failed")}return!1}async shouldInitializeFromToken(t){if(t)return!0;const e=r.getItem("token"),s=JSON.parse(r.getItem("authenticated")||"false"),n=r.getItem("user");return!!(e&&(!s||!n))}async initializeApp(t){console.log("Initializing DASH app authentication...");const e=!0;if(await this.shouldInitializeFromToken(t))return console.log("Token found but not fully authenticated, initializing..."),await this.initializeFromToken();{const n=r.getItem("token"),a=JSON.parse(r.getItem("authenticated")||"false"),c=r.getItem("user");if(n&&a&&c)if(console.log("Already authenticated, checking if auth refresh needed"),e)try{console.log("Refreshing auth data for latest tenant/user information...");const i=await this.axiosInstance.get(g("APP_GETAUTH_ENDPOINT"));console.log("Fresh auth response:",i.data);const o=i.data,l=this.getRoleRedirect(o.user),d=o.redirect||o.user?.redirect||l||null;console.log("Backend redirect found during app initialization:",d,"(role redirect:",l,")"),h.saveAuth(o);const A=o.auth?.tenantSettings?.primary_language_code||o.user?.preferences?.locale;A&&(localStorage.setItem("dash-user-locale",A),window.dispatchEvent(new CustomEvent("dash:locale-change",{detail:{locale:A}})),console.log("\u{1F310} DASHAuthService: Dispatched locale change event (app init):",A)),r.setItem("user",JSON.stringify(o.user)),r.setItem("roles",o.user?.roles?JSON.stringify(o.user.roles):JSON.stringify(T.system.GUEST_ROLE)),JSON.parse(R.system.ENABLE_TENANT_IMPERSONATION.toString())&&o.user?.tenant_id&&(r.setItem("tenant_id",o.user?.tenant_id),r.setItem("user_id",o.user?.id));const f={authenticated:!0,user:o.user,auth:o.auth,token:n,roles:o.user?.roles};console.log("\u{1F504} DASHAuthenticationService: Dispatching fresh auth to Redux:",f),k(S.updateAuth(I,{user:f.user,authenticated:f.authenticated,auth:f.auth}));const D=this.determineRedirectUrl(d,!1);return console.log("Auth data refreshed successfully"),await u(),{success:!0,token:n,user:o.user,auth:o.auth,redirectAfterLogin:D}}catch(i){console.error("Error refreshing auth data:",i),console.log("Falling back to existing auth data");const o=JSON.parse(c),l=h.getAuth();console.log("\u{1F504} DASHAuthenticationService: Dispatching existing auth to Redux"),k(S.updateAuth(I,{user:o,authenticated:!0,auth:l?.auth||null}));const d=this.determineRedirectUrl(void 0,!1);return await u(),{success:!0,token:n,user:o,auth:l?.auth||null,redirectAfterLogin:d}}else{console.log("No auth refresh needed, using existing data");const i=JSON.parse(c),o=h.getAuth();console.log("\u{1F504} DASHAuthenticationService: Dispatching existing auth to Redux"),k(S.updateAuth(I,{user:i,authenticated:!0,auth:o?.auth||null}));const l=this.determineRedirectUrl(void 0,!1);return await u(),{success:!0,token:n,user:i,auth:o?.auth||null,redirectAfterLogin:l}}else return console.log("No valid authentication found"),await u(),{success:!1,error:"No valid authentication found"}}}async loginWithReactAdmin(t,e){debugger;return await(e||this.login)(t)}}var j=new w;export{j as default};
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
var __async = (__this, __arguments, generator) => {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
var fulfilled = (value) => {
|
|
7
|
+
try {
|
|
8
|
+
step(generator.next(value));
|
|
9
|
+
} catch (e) {
|
|
10
|
+
reject(e);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var rejected = (value) => {
|
|
14
|
+
try {
|
|
15
|
+
step(generator.throw(value));
|
|
16
|
+
} catch (e) {
|
|
17
|
+
reject(e);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
21
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
import { createAxiosInstance } from "dash-axios-hook";
|
|
25
|
+
import { setCookie } from "../../utils/cookies";
|
|
26
|
+
import { getEnv } from "../../config/DASHAdminSystemConstants";
|
|
27
|
+
import { AuthPersistenceService, syncLocalStorageToDeviceStore, clearDeviceStoreAuth } from "dash-auth";
|
|
28
|
+
import { DASHAppConstants } from "dash-constants";
|
|
29
|
+
import { DASHAdminSystemConstants } from "dash-constants";
|
|
30
|
+
import { dashStorage } from "dash-utils";
|
|
31
|
+
import { DASH_REDUX_ACTIONS, dispatchToRedux } from "dash-admin-state";
|
|
32
|
+
import { ACTION_UPDATE_AUTH } from "dash-admin-state/src/redux/reducers/Auth";
|
|
33
|
+
class DASHAuthenticationService {
|
|
34
|
+
constructor() {
|
|
35
|
+
__publicField(this, "axiosInstance");
|
|
36
|
+
__publicField(this, "REDIRECT_STORAGE_KEY", "redirectAfterLogin");
|
|
37
|
+
__publicField(this, "logoutFromStorage", (reason) => __async(null, null, function* () {
|
|
38
|
+
console.log("logoutFromStorage", reason);
|
|
39
|
+
AuthPersistenceService.markAsLoggedOut();
|
|
40
|
+
yield clearDeviceStoreAuth();
|
|
41
|
+
const { DashIPCService } = window;
|
|
42
|
+
DashIPCService && DashIPCService.action("stop-bg-service");
|
|
43
|
+
}));
|
|
44
|
+
// Function to get initial auth state with persisted values
|
|
45
|
+
__publicField(this, "getInitialAuthState", () => {
|
|
46
|
+
try {
|
|
47
|
+
const persistedAuth = AuthPersistenceService.getAuth();
|
|
48
|
+
const storedUser = AuthPersistenceService.getUser();
|
|
49
|
+
const storedToken = AuthPersistenceService.getToken();
|
|
50
|
+
const isAuthenticated = JSON.parse(dashStorage.getItem("authenticated") || "false");
|
|
51
|
+
console.log("\u{1F50D} DASHLightApp: Initializing auth state with persisted data:", {
|
|
52
|
+
hasPersistedAuth: !!persistedAuth,
|
|
53
|
+
hasStoredUser: !!storedUser,
|
|
54
|
+
hasStoredToken: !!storedToken,
|
|
55
|
+
isAuthenticated,
|
|
56
|
+
storedUser: storedUser ? `${storedUser.name || storedUser.email} (${storedUser.id})` : null,
|
|
57
|
+
persistedAuthStructure: persistedAuth ? Object.keys(persistedAuth) : null
|
|
58
|
+
});
|
|
59
|
+
if (isAuthenticated && storedUser && storedToken && persistedAuth) {
|
|
60
|
+
console.log("\u2705 DASHLightApp: Using persisted auth state");
|
|
61
|
+
const authState = {
|
|
62
|
+
authenticated: true,
|
|
63
|
+
user: storedUser,
|
|
64
|
+
// This should be the actual user object
|
|
65
|
+
auth: persistedAuth.auth || null
|
|
66
|
+
// This should be the actual auth object
|
|
67
|
+
};
|
|
68
|
+
console.log("\u{1F50D} DASHLightApp: Constructed auth state:", {
|
|
69
|
+
authenticated: authState.authenticated,
|
|
70
|
+
user: authState.user ? `${authState.user.name || authState.user.email} (${authState.user.id})` : null,
|
|
71
|
+
auth: authState.auth ? "present" : null
|
|
72
|
+
});
|
|
73
|
+
return authState;
|
|
74
|
+
}
|
|
75
|
+
if (storedToken && !isAuthenticated) {
|
|
76
|
+
console.log("\u{1F504} DASHLightApp: Token found but not authenticated, will initialize later");
|
|
77
|
+
return {
|
|
78
|
+
authenticated: false,
|
|
79
|
+
user: null,
|
|
80
|
+
auth: null
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
console.log("\u2139\uFE0F DASHLightApp: No valid persisted auth found, using default auth state");
|
|
84
|
+
return {
|
|
85
|
+
authenticated: false,
|
|
86
|
+
user: null,
|
|
87
|
+
auth: null
|
|
88
|
+
};
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error("\u274C DASHLightApp: Error getting initial auth state:", error);
|
|
91
|
+
return {
|
|
92
|
+
authenticated: false,
|
|
93
|
+
user: null,
|
|
94
|
+
auth: null
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
this.axiosInstance = createAxiosInstance();
|
|
99
|
+
}
|
|
100
|
+
// Method to recreate axios instance with new options if needed
|
|
101
|
+
reinitializeAxios(options) {
|
|
102
|
+
this.axiosInstance = createAxiosInstance(options);
|
|
103
|
+
}
|
|
104
|
+
// Helper to sanitize redirect URLs for Electron file:// paths
|
|
105
|
+
sanitizeRedirectUrl(url) {
|
|
106
|
+
if (!url) return "/";
|
|
107
|
+
const isWindowsFilePath = /^\/[A-Za-z]:\/|^[A-Za-z]:\/|^file:\/\//i.test(url);
|
|
108
|
+
const isElectron = window.location.protocol === "file:" || getEnv("IS_ELECTRON") === "true" || getEnv("IS_ELECTRON") === true;
|
|
109
|
+
if (isWindowsFilePath || url.includes("index.html")) {
|
|
110
|
+
if (url.includes("#")) {
|
|
111
|
+
const parts = url.split("#");
|
|
112
|
+
if (parts.length > 1 && parts[1]) {
|
|
113
|
+
const route = parts[1];
|
|
114
|
+
console.log("Detected file/electron path with hash, extracting route:", route);
|
|
115
|
+
return "#" + route;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (isWindowsFilePath) {
|
|
120
|
+
console.log("Detected Windows file path in redirect, resetting to #/");
|
|
121
|
+
return "#/";
|
|
122
|
+
}
|
|
123
|
+
if (url.includes("/resources/app/") || url.includes("/dist/index.html") || url.includes("Program Files")) {
|
|
124
|
+
console.log("Detected Electron app path in redirect, resetting to #/");
|
|
125
|
+
return "#/";
|
|
126
|
+
}
|
|
127
|
+
if (isElectron && url.startsWith("/") && !url.startsWith("#")) {
|
|
128
|
+
console.log("Detected Electron environment with standard path, adding hash prefix:", url);
|
|
129
|
+
return "#" + url;
|
|
130
|
+
}
|
|
131
|
+
return url;
|
|
132
|
+
}
|
|
133
|
+
// Method to set pending redirect URL
|
|
134
|
+
setPendingRedirect(url) {
|
|
135
|
+
if (!url || url === "/" || url === "#/" || url === "#") {
|
|
136
|
+
console.log("Skipping pending redirect for root path:", url);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const sanitizedUrl = this.sanitizeRedirectUrl(url);
|
|
140
|
+
if (sanitizedUrl === "/" || sanitizedUrl === "#/" || sanitizedUrl === "#") {
|
|
141
|
+
console.log("Skipping pending redirect for sanitized root path:", sanitizedUrl);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
console.log("Setting pending redirect:", url, "\u2192", sanitizedUrl);
|
|
145
|
+
dashStorage.setItem(this.REDIRECT_STORAGE_KEY, sanitizedUrl);
|
|
146
|
+
}
|
|
147
|
+
// Method to get pending redirect URL
|
|
148
|
+
getPendingRedirect() {
|
|
149
|
+
return dashStorage.getItem(this.REDIRECT_STORAGE_KEY);
|
|
150
|
+
}
|
|
151
|
+
// Method to clear pending redirect URL
|
|
152
|
+
clearPendingRedirect() {
|
|
153
|
+
console.log("Clearing pending redirect");
|
|
154
|
+
dashStorage.removeItem(this.REDIRECT_STORAGE_KEY);
|
|
155
|
+
}
|
|
156
|
+
// Helper to get redirect URL from user's first role with a configured redirect
|
|
157
|
+
getRoleRedirect(user) {
|
|
158
|
+
const roles = user == null ? void 0 : user.roles;
|
|
159
|
+
if (Array.isArray(roles) && roles.length > 0) {
|
|
160
|
+
for (const role of roles) {
|
|
161
|
+
if (role.redirect) {
|
|
162
|
+
console.log("Found role redirect:", role.name, "->", role.redirect);
|
|
163
|
+
return role.redirect;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
// Method to determine final redirect URL (backend takes precedence over localStorage)
|
|
170
|
+
// persistRedirect: if true, saves to storage (use during login). If false, just returns the value (use during app init).
|
|
171
|
+
determineRedirectUrl(backendRedirect, persistRedirect = true) {
|
|
172
|
+
let val = null;
|
|
173
|
+
if (backendRedirect) {
|
|
174
|
+
console.log("Using backend redirect:", backendRedirect, "(persist:", persistRedirect, ")");
|
|
175
|
+
val = backendRedirect;
|
|
176
|
+
if (persistRedirect) {
|
|
177
|
+
this.setPendingRedirect(val);
|
|
178
|
+
return this.getPendingRedirect();
|
|
179
|
+
}
|
|
180
|
+
return this.sanitizeRedirectUrl(val);
|
|
181
|
+
}
|
|
182
|
+
const localStorageRedirect = this.getPendingRedirect();
|
|
183
|
+
if (localStorageRedirect) {
|
|
184
|
+
console.log("Using localStorage redirect:", localStorageRedirect);
|
|
185
|
+
return localStorageRedirect;
|
|
186
|
+
}
|
|
187
|
+
val = getEnv("APP_DEFAULT_REDIRECT");
|
|
188
|
+
if (persistRedirect) {
|
|
189
|
+
this.setPendingRedirect(val);
|
|
190
|
+
return this.getPendingRedirect();
|
|
191
|
+
}
|
|
192
|
+
return this.sanitizeRedirectUrl(val);
|
|
193
|
+
}
|
|
194
|
+
// Update the login method to dispatch to Redux directly
|
|
195
|
+
login(credentials) {
|
|
196
|
+
return __async(this, null, function* () {
|
|
197
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
|
|
198
|
+
console.log("=== DASH AUTH SERVICE LOGIN START ===");
|
|
199
|
+
console.log("Credentials:", { username: credentials.username, password: "***", redirect: credentials.redirect, meta: credentials.meta });
|
|
200
|
+
if (!(credentials.username && credentials.password)) {
|
|
201
|
+
console.log("\u274C Missing credentials");
|
|
202
|
+
return Promise.resolve({
|
|
203
|
+
success: false,
|
|
204
|
+
error: "Username and password are required"
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
console.log("Making login request to /login");
|
|
209
|
+
const loginResponse = yield this.axiosInstance.post("/login", {
|
|
210
|
+
email: credentials.username,
|
|
211
|
+
password: credentials.password,
|
|
212
|
+
redirect: credentials.redirect,
|
|
213
|
+
meta: credentials.meta
|
|
214
|
+
});
|
|
215
|
+
console.log("Login response status:", loginResponse.status);
|
|
216
|
+
console.log("Login response data:", loginResponse.data);
|
|
217
|
+
if (loginResponse.status >= 200 && loginResponse.status <= 299) {
|
|
218
|
+
console.log("\u2705 Login response successful");
|
|
219
|
+
const backendRedirectTo = loginResponse.data.redirectTo;
|
|
220
|
+
console.log("\u{1F3AF} Backend redirectTo:", backendRedirectTo);
|
|
221
|
+
const today = /* @__PURE__ */ new Date();
|
|
222
|
+
const expires = /* @__PURE__ */ new Date();
|
|
223
|
+
expires.setDate(today.getDate() + 2);
|
|
224
|
+
if (loginResponse.data && loginResponse.data.token) {
|
|
225
|
+
console.log("Setting token in storage");
|
|
226
|
+
dashStorage.setItem("token", loginResponse.data.token);
|
|
227
|
+
const refreshToken = ((_a = loginResponse.data) == null ? void 0 : _a.refresh_token) || ((_b = loginResponse.data) == null ? void 0 : _b.refreshToken);
|
|
228
|
+
if (refreshToken) {
|
|
229
|
+
console.log("Setting refresh token in storage");
|
|
230
|
+
dashStorage.setItem("refreshToken", refreshToken);
|
|
231
|
+
}
|
|
232
|
+
if ((_c = loginResponse.data) == null ? void 0 : _c.meta) {
|
|
233
|
+
console.log("Setting app");
|
|
234
|
+
dashStorage.setItem("app", loginResponse.data.meta.app);
|
|
235
|
+
}
|
|
236
|
+
yield syncLocalStorageToDeviceStore();
|
|
237
|
+
} else {
|
|
238
|
+
console.warn("\u26A0\uFE0F No token in login response");
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
console.log("Getting auth data from:", getEnv("APP_GETAUTH_ENDPOINT"));
|
|
242
|
+
const authResponse = yield this.axiosInstance.get(getEnv("APP_GETAUTH_ENDPOINT"));
|
|
243
|
+
console.log("Auth response status:", authResponse.status);
|
|
244
|
+
console.log("Auth response data:", authResponse.data);
|
|
245
|
+
const auth = authResponse.data;
|
|
246
|
+
let finalRedirect = backendRedirectTo;
|
|
247
|
+
if (!finalRedirect) {
|
|
248
|
+
const roleRedirect = this.getRoleRedirect(auth.user);
|
|
249
|
+
const authRedirect = auth.redirect || ((_d = auth.user) == null ? void 0 : _d.redirect) || roleRedirect || null;
|
|
250
|
+
console.log("Auth response redirect:", authRedirect, "(role redirect:", roleRedirect, ")");
|
|
251
|
+
if (authRedirect) {
|
|
252
|
+
finalRedirect = authRedirect;
|
|
253
|
+
} else if (credentials.redirect && credentials.redirect !== "/login") {
|
|
254
|
+
finalRedirect = credentials.redirect;
|
|
255
|
+
} else {
|
|
256
|
+
finalRedirect = getEnv("APP_DEFAULT_REDIRECT") || "/";
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
console.log("\u{1F3AF} Final redirect determined:", finalRedirect);
|
|
260
|
+
AuthPersistenceService.saveAuth(auth);
|
|
261
|
+
const languageCode = ((_f = (_e = auth.auth) == null ? void 0 : _e.tenantSettings) == null ? void 0 : _f.primary_language_code) || ((_h = (_g = auth.user) == null ? void 0 : _g.preferences) == null ? void 0 : _h.locale);
|
|
262
|
+
if (languageCode) {
|
|
263
|
+
localStorage.setItem("dash-user-locale", languageCode);
|
|
264
|
+
window.dispatchEvent(new CustomEvent("dash:locale-change", {
|
|
265
|
+
detail: { locale: languageCode }
|
|
266
|
+
}));
|
|
267
|
+
console.log("\u{1F310} DASHAuthService: Dispatched locale change event:", languageCode);
|
|
268
|
+
}
|
|
269
|
+
dashStorage.setItem("authenticated", "true");
|
|
270
|
+
dashStorage.setItem("user", JSON.stringify(auth.user));
|
|
271
|
+
dashStorage.setItem(
|
|
272
|
+
"roles",
|
|
273
|
+
((_i = auth.user) == null ? void 0 : _i.roles) ? JSON.stringify(auth.user.roles) : JSON.stringify(DASHAppConstants.system.GUEST_ROLE)
|
|
274
|
+
);
|
|
275
|
+
if (JSON.parse(
|
|
276
|
+
DASHAdminSystemConstants.system.ENABLE_TENANT_IMPERSONATION.toString()
|
|
277
|
+
) && ((_j = auth.user) == null ? void 0 : _j.tenant_id)) {
|
|
278
|
+
dashStorage.setItem("tenant_id", (_k = auth.user) == null ? void 0 : _k.tenant_id);
|
|
279
|
+
dashStorage.setItem("user_id", (_l = auth.user) == null ? void 0 : _l.id);
|
|
280
|
+
}
|
|
281
|
+
const resultObject = {
|
|
282
|
+
authenticated: true,
|
|
283
|
+
user: auth.user,
|
|
284
|
+
auth: auth.auth,
|
|
285
|
+
token: loginResponse.data.token || dashStorage.getItem("token"),
|
|
286
|
+
roles: (_m = auth.user) == null ? void 0 : _m.roles
|
|
287
|
+
};
|
|
288
|
+
console.log("\u{1F504} DASHAuthenticationService: Dispatching to Redux:", resultObject);
|
|
289
|
+
dispatchToRedux(
|
|
290
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
291
|
+
user: resultObject.user,
|
|
292
|
+
authenticated: resultObject.authenticated,
|
|
293
|
+
auth: resultObject.auth
|
|
294
|
+
})
|
|
295
|
+
);
|
|
296
|
+
yield syncLocalStorageToDeviceStore();
|
|
297
|
+
console.log("\u2705 Login completed successfully");
|
|
298
|
+
return Promise.resolve({
|
|
299
|
+
success: true,
|
|
300
|
+
token: resultObject.token,
|
|
301
|
+
user: resultObject.user,
|
|
302
|
+
auth: resultObject.auth,
|
|
303
|
+
redirectAfterLogin: finalRedirect
|
|
304
|
+
// ✅ Use the backend redirectTo
|
|
305
|
+
});
|
|
306
|
+
} catch (error) {
|
|
307
|
+
yield syncLocalStorageToDeviceStore();
|
|
308
|
+
console.error("\u274C Error getting auth data:", error);
|
|
309
|
+
this.logoutFromStorage("login get auth error");
|
|
310
|
+
return Promise.resolve({
|
|
311
|
+
success: false,
|
|
312
|
+
error: "Failed to get user authentication data"
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
} else {
|
|
316
|
+
yield syncLocalStorageToDeviceStore();
|
|
317
|
+
console.log("\u274C Login response status not successful:", loginResponse.status);
|
|
318
|
+
this.logoutFromStorage("login status error logout");
|
|
319
|
+
return Promise.reject({
|
|
320
|
+
success: false,
|
|
321
|
+
error: `Login failed with status: ${loginResponse.status}`
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
} catch (error) {
|
|
325
|
+
yield syncLocalStorageToDeviceStore();
|
|
326
|
+
console.error("\u274C Login error:", error);
|
|
327
|
+
console.error("Error details:", {
|
|
328
|
+
message: error == null ? void 0 : error.message,
|
|
329
|
+
response: (_n = error == null ? void 0 : error.response) == null ? void 0 : _n.data,
|
|
330
|
+
status: (_o = error == null ? void 0 : error.response) == null ? void 0 : _o.status
|
|
331
|
+
});
|
|
332
|
+
this.logoutFromStorage("login error logout");
|
|
333
|
+
yield syncLocalStorageToDeviceStore();
|
|
334
|
+
return Promise.reject({
|
|
335
|
+
success: false,
|
|
336
|
+
error: ((_q = (_p = error == null ? void 0 : error.response) == null ? void 0 : _p.data) == null ? void 0 : _q.message) || (error == null ? void 0 : error.message) || "Login failed"
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
// Update the initializeFromToken method to dispatch to Redux directly
|
|
342
|
+
initializeFromToken() {
|
|
343
|
+
return __async(this, null, function* () {
|
|
344
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
345
|
+
const token = dashStorage.getItem("token");
|
|
346
|
+
if (!token) {
|
|
347
|
+
return {
|
|
348
|
+
success: false,
|
|
349
|
+
error: "No token found"
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
try {
|
|
353
|
+
console.log("Initializing auth from existing token...");
|
|
354
|
+
const { data: auth } = yield this.axiosInstance.get(getEnv("APP_GETAUTH_ENDPOINT"));
|
|
355
|
+
const roleRedirect = this.getRoleRedirect(auth.user);
|
|
356
|
+
const backendRedirect = auth.redirect || ((_a = auth.user) == null ? void 0 : _a.redirect) || roleRedirect || null;
|
|
357
|
+
console.log("Backend redirect found during token initialization:", backendRedirect, "(role redirect:", roleRedirect, ")");
|
|
358
|
+
AuthPersistenceService.saveAuth(auth);
|
|
359
|
+
dashStorage.setItem("authenticated", "true");
|
|
360
|
+
dashStorage.setItem("user", JSON.stringify(auth.user));
|
|
361
|
+
dashStorage.setItem(
|
|
362
|
+
"roles",
|
|
363
|
+
((_b = auth.user) == null ? void 0 : _b.roles) ? JSON.stringify(auth.user.roles) : JSON.stringify(DASHAppConstants.system.GUEST_ROLE)
|
|
364
|
+
);
|
|
365
|
+
if (JSON.parse(
|
|
366
|
+
DASHAdminSystemConstants.system.ENABLE_TENANT_IMPERSONATION.toString()
|
|
367
|
+
) && ((_c = auth.user) == null ? void 0 : _c.tenant_id)) {
|
|
368
|
+
dashStorage.setItem("tenant_id", (_d = auth.user) == null ? void 0 : _d.tenant_id);
|
|
369
|
+
setCookie("tenant_id", (_e = auth.user) == null ? void 0 : _e.tenant_id);
|
|
370
|
+
dashStorage.setItem("user_id", (_f = auth.user) == null ? void 0 : _f.id);
|
|
371
|
+
setCookie("user_id", (_g = auth.user) == null ? void 0 : _g.id);
|
|
372
|
+
}
|
|
373
|
+
const resultObject = {
|
|
374
|
+
authenticated: true,
|
|
375
|
+
user: auth.user,
|
|
376
|
+
auth: auth.auth,
|
|
377
|
+
token,
|
|
378
|
+
roles: (_h = auth.user) == null ? void 0 : _h.roles
|
|
379
|
+
};
|
|
380
|
+
console.log("\u{1F504} DASHAuthenticationService: Dispatching token init to Redux:", resultObject);
|
|
381
|
+
dispatchToRedux(
|
|
382
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
383
|
+
user: resultObject.user,
|
|
384
|
+
authenticated: resultObject.authenticated,
|
|
385
|
+
auth: resultObject.auth
|
|
386
|
+
})
|
|
387
|
+
);
|
|
388
|
+
console.log("Auth initialized successfully from existing token");
|
|
389
|
+
yield syncLocalStorageToDeviceStore();
|
|
390
|
+
const redirectAfterLogin = this.determineRedirectUrl(backendRedirect, false);
|
|
391
|
+
return {
|
|
392
|
+
success: true,
|
|
393
|
+
token,
|
|
394
|
+
user: auth.user,
|
|
395
|
+
auth: auth.auth,
|
|
396
|
+
redirectAfterLogin
|
|
397
|
+
};
|
|
398
|
+
} catch (error) {
|
|
399
|
+
console.error("Error initializing auth from token:", error);
|
|
400
|
+
this.logoutFromStorage("initialize from token error");
|
|
401
|
+
yield syncLocalStorageToDeviceStore();
|
|
402
|
+
return {
|
|
403
|
+
success: false,
|
|
404
|
+
error: "Failed to initialize authentication from token"
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
refreshToken(refreshToken) {
|
|
410
|
+
return __async(this, null, function* () {
|
|
411
|
+
var _a, _b, _c;
|
|
412
|
+
try {
|
|
413
|
+
console.log("[DASHAuthService] Attempting to refresh token...");
|
|
414
|
+
const response = yield this.axiosInstance.post("/auth/refresh", {
|
|
415
|
+
refresh_token: refreshToken
|
|
416
|
+
});
|
|
417
|
+
if (response.status >= 200 && response.status <= 299) {
|
|
418
|
+
const data = response.data;
|
|
419
|
+
if (data.token) {
|
|
420
|
+
dashStorage.setItem("token", data.token);
|
|
421
|
+
console.log("[DASHAuthService] Access token updated");
|
|
422
|
+
}
|
|
423
|
+
if (data.refresh_token) {
|
|
424
|
+
dashStorage.setItem("refreshToken", data.refresh_token);
|
|
425
|
+
console.log("[DASHAuthService] Refresh token rotated");
|
|
426
|
+
}
|
|
427
|
+
yield syncLocalStorageToDeviceStore();
|
|
428
|
+
console.log("[DASHAuthService] Token refresh successful");
|
|
429
|
+
return {
|
|
430
|
+
success: true,
|
|
431
|
+
token: data.token,
|
|
432
|
+
refreshToken: data.refresh_token,
|
|
433
|
+
user: data.user
|
|
434
|
+
};
|
|
435
|
+
} else {
|
|
436
|
+
console.warn("[DASHAuthService] Token refresh returned non-success status:", response.status);
|
|
437
|
+
return {
|
|
438
|
+
success: false,
|
|
439
|
+
error: "Token refresh failed"
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
} catch (error) {
|
|
443
|
+
console.error("[DASHAuthService] Token refresh error:", error);
|
|
444
|
+
if (((_a = error == null ? void 0 : error.response) == null ? void 0 : _a.status) === 401) {
|
|
445
|
+
console.log("[DASHAuthService] Refresh token is invalid or expired");
|
|
446
|
+
this.logoutFromStorage("refresh_token_expired");
|
|
447
|
+
}
|
|
448
|
+
return {
|
|
449
|
+
success: false,
|
|
450
|
+
error: ((_c = (_b = error == null ? void 0 : error.response) == null ? void 0 : _b.data) == null ? void 0 : _c.message) || (error == null ? void 0 : error.message) || "Network error occurred"
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
checkAuth() {
|
|
456
|
+
return __async(this, null, function* () {
|
|
457
|
+
const isAuthenticated = JSON.parse(dashStorage.getItem("authenticated") || "false");
|
|
458
|
+
const user = JSON.parse(dashStorage.getItem("user") || "null");
|
|
459
|
+
if (isAuthenticated && (user == null ? void 0 : user.id)) {
|
|
460
|
+
const persistedAuth = AuthPersistenceService.getAuth();
|
|
461
|
+
if (persistedAuth) {
|
|
462
|
+
return true;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
return false;
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
getIdentity() {
|
|
469
|
+
return __async(this, null, function* () {
|
|
470
|
+
var _a, _b, _c, _d;
|
|
471
|
+
const token = dashStorage.getItem("token");
|
|
472
|
+
if (!token) {
|
|
473
|
+
throw new Error("No token present");
|
|
474
|
+
}
|
|
475
|
+
try {
|
|
476
|
+
const { data: auth } = yield this.axiosInstance.get(getEnv("APP_GETAUTH_ENDPOINT"));
|
|
477
|
+
dashStorage.setItem(
|
|
478
|
+
"roles",
|
|
479
|
+
((_a = auth.user) == null ? void 0 : _a.roles) ? JSON.stringify(auth.user.roles) : JSON.stringify(DASHAppConstants.system.GUEST_ROLE)
|
|
480
|
+
);
|
|
481
|
+
dashStorage.setItem("authenticated", "true");
|
|
482
|
+
dashStorage.setItem("user", JSON.stringify(auth.user));
|
|
483
|
+
if (JSON.parse(
|
|
484
|
+
DASHAdminSystemConstants.system.ENABLE_TENANT_IMPERSONATION.toString()
|
|
485
|
+
) && ((_b = auth.user) == null ? void 0 : _b.tenant_id)) {
|
|
486
|
+
dashStorage.setItem("tenant_id", (_c = auth.user) == null ? void 0 : _c.tenant_id);
|
|
487
|
+
dashStorage.setItem("user_id", (_d = auth.user) == null ? void 0 : _d.id);
|
|
488
|
+
}
|
|
489
|
+
yield syncLocalStorageToDeviceStore();
|
|
490
|
+
return auth;
|
|
491
|
+
} catch (error) {
|
|
492
|
+
this.logoutFromStorage("get identity error logout");
|
|
493
|
+
throw error;
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
// Rest of your methods remain the same...
|
|
498
|
+
shouldRefreshToken() {
|
|
499
|
+
return __async(this, null, function* () {
|
|
500
|
+
const token = dashStorage.getItem("token");
|
|
501
|
+
if (!token) return false;
|
|
502
|
+
const refreshToken = dashStorage.getItem("refreshToken");
|
|
503
|
+
return !!refreshToken;
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
handleTokenRefresh() {
|
|
507
|
+
return __async(this, null, function* () {
|
|
508
|
+
const refreshToken = dashStorage.getItem("refreshToken");
|
|
509
|
+
if (!refreshToken) return false;
|
|
510
|
+
try {
|
|
511
|
+
const refreshResponse = yield this.refreshToken(refreshToken);
|
|
512
|
+
if (refreshResponse.success) {
|
|
513
|
+
dashStorage.setItem("token", refreshResponse.token);
|
|
514
|
+
if (refreshResponse.refreshToken) {
|
|
515
|
+
dashStorage.setItem("refreshToken", refreshResponse.refreshToken);
|
|
516
|
+
}
|
|
517
|
+
yield syncLocalStorageToDeviceStore();
|
|
518
|
+
return true;
|
|
519
|
+
}
|
|
520
|
+
} catch (error) {
|
|
521
|
+
console.error("Token refresh failed:", error);
|
|
522
|
+
this.logoutFromStorage("token refresh failed");
|
|
523
|
+
}
|
|
524
|
+
return false;
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
// Method to check if we should initialize from token on app load
|
|
528
|
+
shouldInitializeFromToken(forceGetAuth) {
|
|
529
|
+
return __async(this, null, function* () {
|
|
530
|
+
if (forceGetAuth) {
|
|
531
|
+
return true;
|
|
532
|
+
}
|
|
533
|
+
;
|
|
534
|
+
const token = dashStorage.getItem("token");
|
|
535
|
+
const isAuthenticated = JSON.parse(dashStorage.getItem("authenticated") || "false");
|
|
536
|
+
const user = dashStorage.getItem("user");
|
|
537
|
+
return !!(token && (!isAuthenticated || !user));
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
// Update the initializeApp method to dispatch to Redux directly
|
|
541
|
+
initializeApp(forceGetAuth) {
|
|
542
|
+
return __async(this, null, function* () {
|
|
543
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
544
|
+
console.log("Initializing DASH app authentication...");
|
|
545
|
+
const USES_GET_AUTH = true;
|
|
546
|
+
const shouldInit = yield this.shouldInitializeFromToken(forceGetAuth);
|
|
547
|
+
if (shouldInit) {
|
|
548
|
+
console.log("Token found but not fully authenticated, initializing...");
|
|
549
|
+
return yield this.initializeFromToken();
|
|
550
|
+
} else {
|
|
551
|
+
const token = dashStorage.getItem("token");
|
|
552
|
+
const isAuthenticated = JSON.parse(dashStorage.getItem("authenticated") || "false");
|
|
553
|
+
const user = dashStorage.getItem("user");
|
|
554
|
+
if (token && isAuthenticated && user) {
|
|
555
|
+
console.log("Already authenticated, checking if auth refresh needed");
|
|
556
|
+
if (USES_GET_AUTH) {
|
|
557
|
+
try {
|
|
558
|
+
console.log("Refreshing auth data for latest tenant/user information...");
|
|
559
|
+
const authResponse = yield this.axiosInstance.get(getEnv("APP_GETAUTH_ENDPOINT"));
|
|
560
|
+
console.log("Fresh auth response:", authResponse.data);
|
|
561
|
+
const auth = authResponse.data;
|
|
562
|
+
const roleRedirect = this.getRoleRedirect(auth.user);
|
|
563
|
+
const backendRedirect = auth.redirect || ((_a = auth.user) == null ? void 0 : _a.redirect) || roleRedirect || null;
|
|
564
|
+
console.log("Backend redirect found during app initialization:", backendRedirect, "(role redirect:", roleRedirect, ")");
|
|
565
|
+
AuthPersistenceService.saveAuth(auth);
|
|
566
|
+
const languageCode = ((_c = (_b = auth.auth) == null ? void 0 : _b.tenantSettings) == null ? void 0 : _c.primary_language_code) || ((_e = (_d = auth.user) == null ? void 0 : _d.preferences) == null ? void 0 : _e.locale);
|
|
567
|
+
if (languageCode) {
|
|
568
|
+
localStorage.setItem("dash-user-locale", languageCode);
|
|
569
|
+
window.dispatchEvent(new CustomEvent("dash:locale-change", {
|
|
570
|
+
detail: { locale: languageCode }
|
|
571
|
+
}));
|
|
572
|
+
console.log("\u{1F310} DASHAuthService: Dispatched locale change event (app init):", languageCode);
|
|
573
|
+
}
|
|
574
|
+
dashStorage.setItem("user", JSON.stringify(auth.user));
|
|
575
|
+
dashStorage.setItem(
|
|
576
|
+
"roles",
|
|
577
|
+
((_f = auth.user) == null ? void 0 : _f.roles) ? JSON.stringify(auth.user.roles) : JSON.stringify(DASHAppConstants.system.GUEST_ROLE)
|
|
578
|
+
);
|
|
579
|
+
if (JSON.parse(
|
|
580
|
+
DASHAdminSystemConstants.system.ENABLE_TENANT_IMPERSONATION.toString()
|
|
581
|
+
) && ((_g = auth.user) == null ? void 0 : _g.tenant_id)) {
|
|
582
|
+
dashStorage.setItem("tenant_id", (_h = auth.user) == null ? void 0 : _h.tenant_id);
|
|
583
|
+
dashStorage.setItem("user_id", (_i = auth.user) == null ? void 0 : _i.id);
|
|
584
|
+
}
|
|
585
|
+
const resultObject = {
|
|
586
|
+
authenticated: true,
|
|
587
|
+
user: auth.user,
|
|
588
|
+
auth: auth.auth,
|
|
589
|
+
token,
|
|
590
|
+
roles: (_j = auth.user) == null ? void 0 : _j.roles
|
|
591
|
+
};
|
|
592
|
+
console.log("\u{1F504} DASHAuthenticationService: Dispatching fresh auth to Redux:", resultObject);
|
|
593
|
+
dispatchToRedux(
|
|
594
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
595
|
+
user: resultObject.user,
|
|
596
|
+
authenticated: resultObject.authenticated,
|
|
597
|
+
auth: resultObject.auth
|
|
598
|
+
})
|
|
599
|
+
);
|
|
600
|
+
const redirectAfterLogin = this.determineRedirectUrl(backendRedirect, false);
|
|
601
|
+
console.log("Auth data refreshed successfully");
|
|
602
|
+
yield syncLocalStorageToDeviceStore();
|
|
603
|
+
return {
|
|
604
|
+
success: true,
|
|
605
|
+
token,
|
|
606
|
+
user: auth.user,
|
|
607
|
+
auth: auth.auth,
|
|
608
|
+
redirectAfterLogin
|
|
609
|
+
};
|
|
610
|
+
} catch (error) {
|
|
611
|
+
console.error("Error refreshing auth data:", error);
|
|
612
|
+
console.log("Falling back to existing auth data");
|
|
613
|
+
const existingUser = JSON.parse(user);
|
|
614
|
+
const persistedAuth = AuthPersistenceService.getAuth();
|
|
615
|
+
console.log("\u{1F504} DASHAuthenticationService: Dispatching existing auth to Redux");
|
|
616
|
+
dispatchToRedux(
|
|
617
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
618
|
+
user: existingUser,
|
|
619
|
+
authenticated: true,
|
|
620
|
+
auth: (persistedAuth == null ? void 0 : persistedAuth.auth) || null
|
|
621
|
+
})
|
|
622
|
+
);
|
|
623
|
+
const redirectAfterLogin = this.determineRedirectUrl(void 0, false);
|
|
624
|
+
yield syncLocalStorageToDeviceStore();
|
|
625
|
+
return {
|
|
626
|
+
success: true,
|
|
627
|
+
token,
|
|
628
|
+
user: existingUser,
|
|
629
|
+
auth: (persistedAuth == null ? void 0 : persistedAuth.auth) || null,
|
|
630
|
+
redirectAfterLogin
|
|
631
|
+
};
|
|
632
|
+
}
|
|
633
|
+
} else {
|
|
634
|
+
console.log("No auth refresh needed, using existing data");
|
|
635
|
+
const existingUser = JSON.parse(user);
|
|
636
|
+
const persistedAuth = AuthPersistenceService.getAuth();
|
|
637
|
+
console.log("\u{1F504} DASHAuthenticationService: Dispatching existing auth to Redux");
|
|
638
|
+
dispatchToRedux(
|
|
639
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
640
|
+
user: existingUser,
|
|
641
|
+
authenticated: true,
|
|
642
|
+
auth: (persistedAuth == null ? void 0 : persistedAuth.auth) || null
|
|
643
|
+
})
|
|
644
|
+
);
|
|
645
|
+
const redirectAfterLogin = this.determineRedirectUrl(void 0, false);
|
|
646
|
+
yield syncLocalStorageToDeviceStore();
|
|
647
|
+
return {
|
|
648
|
+
success: true,
|
|
649
|
+
token,
|
|
650
|
+
user: existingUser,
|
|
651
|
+
auth: (persistedAuth == null ? void 0 : persistedAuth.auth) || null,
|
|
652
|
+
redirectAfterLogin
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
} else {
|
|
656
|
+
console.log("No valid authentication found");
|
|
657
|
+
yield syncLocalStorageToDeviceStore();
|
|
658
|
+
return {
|
|
659
|
+
success: false,
|
|
660
|
+
error: "No valid authentication found"
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
// Method to integrate with React Admin
|
|
667
|
+
loginWithReactAdmin(credentials, reactAdminLogin) {
|
|
668
|
+
return __async(this, null, function* () {
|
|
669
|
+
debugger;
|
|
670
|
+
const effectiveLogin = reactAdminLogin || this.login;
|
|
671
|
+
const authResponse = yield effectiveLogin(credentials);
|
|
672
|
+
return authResponse;
|
|
673
|
+
});
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
var DASHAuthenticationService_default = new DASHAuthenticationService();
|
|
677
|
+
export {
|
|
678
|
+
DASHAuthenticationService_default as default
|
|
679
|
+
};
|