@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
|
@@ -0,0 +1,917 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight authentication service for public app
|
|
3
|
+
* This service handles authentication without react-admin dependencies
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { createAxiosInstance } from 'dash-axios-hook';
|
|
7
|
+
import { getCookie, setCookie } from '../../utils/cookies';
|
|
8
|
+
import { getEnv } from '../../config/DASHAdminSystemConstants';
|
|
9
|
+
import { AuthPersistenceService, syncLocalStorageToDeviceStore, clearDeviceStoreAuth } from 'dash-auth';
|
|
10
|
+
import { setAuthEvent } from './AuthContext';
|
|
11
|
+
import {DASHAppConstants} from 'dash-constants';
|
|
12
|
+
|
|
13
|
+
import {DASHAdminSystemConstants} from 'dash-constants'
|
|
14
|
+
|
|
15
|
+
import { dashStorage } from 'dash-utils';
|
|
16
|
+
|
|
17
|
+
import { DASH_REDUX_ACTIONS, dispatchToRedux } from 'dash-admin-state';
|
|
18
|
+
import { ACTION_UPDATE_AUTH } from 'dash-admin-state/src/redux/reducers/Auth';
|
|
19
|
+
export interface DASHAuthenticationServiceLoginCredentials {
|
|
20
|
+
username: string;
|
|
21
|
+
password: string;
|
|
22
|
+
redirect?: string;
|
|
23
|
+
meta?: any;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface DASHAuthenticationServiceAuthResponse {
|
|
27
|
+
success: boolean;
|
|
28
|
+
token?: string;
|
|
29
|
+
user?: any;
|
|
30
|
+
auth?: any;
|
|
31
|
+
refreshToken?: string;
|
|
32
|
+
error?: string;
|
|
33
|
+
redirectAfterLogin?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/*
|
|
37
|
+
@TechDebt: refresh token strategy not implemented neither in backend or frontend.
|
|
38
|
+
*/
|
|
39
|
+
class DASHAuthenticationService {
|
|
40
|
+
private axiosInstance: any;
|
|
41
|
+
private readonly REDIRECT_STORAGE_KEY = 'redirectAfterLogin';
|
|
42
|
+
|
|
43
|
+
constructor() {
|
|
44
|
+
// Initialize axios instance in constructor
|
|
45
|
+
this.axiosInstance = createAxiosInstance();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Method to recreate axios instance with new options if needed
|
|
49
|
+
reinitializeAxios(options?: any) {
|
|
50
|
+
this.axiosInstance = createAxiosInstance(options);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Helper to sanitize redirect URLs for Electron file:// paths
|
|
54
|
+
private sanitizeRedirectUrl(url: string): string {
|
|
55
|
+
if (!url) return '/';
|
|
56
|
+
|
|
57
|
+
// Check if this looks like a Windows file path (common in Electron)
|
|
58
|
+
// e.g., "/C:/Program Files/..." or "C:/..." or file:// URLs
|
|
59
|
+
const isWindowsFilePath = /^\/[A-Za-z]:\/|^[A-Za-z]:\/|^file:\/\//i.test(url);
|
|
60
|
+
|
|
61
|
+
// Check if we are in an Electron/HashRouter environment
|
|
62
|
+
const isElectron = window.location.protocol === 'file:' ||
|
|
63
|
+
getEnv('IS_ELECTRON') === 'true' ||
|
|
64
|
+
getEnv('IS_ELECTRON') === true;
|
|
65
|
+
|
|
66
|
+
// Fix for Electron: If it is a file:// URL (or Windows path) AND contains a hash,
|
|
67
|
+
// implies we want to preserve the internal route (e.g. file:///.../index.html#/dashboard)
|
|
68
|
+
if (isWindowsFilePath || url.includes('index.html')) {
|
|
69
|
+
if (url.includes('#')) {
|
|
70
|
+
const parts = url.split('#');
|
|
71
|
+
if (parts.length > 1 && parts[1]) {
|
|
72
|
+
const route = parts[1];
|
|
73
|
+
console.log('Detected file/electron path with hash, extracting route:', route);
|
|
74
|
+
return '#' + route;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (isWindowsFilePath) {
|
|
80
|
+
console.log('Detected Windows file path in redirect, resetting to #/');
|
|
81
|
+
return '#/';
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Check for common Electron file patterns
|
|
85
|
+
if (url.includes('/resources/app/') || url.includes('/dist/index.html') || url.includes('Program Files')) {
|
|
86
|
+
console.log('Detected Electron app path in redirect, resetting to #/');
|
|
87
|
+
return '#/';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// If we are in Electron and the URL is a standard path (e.g. /selfservice/qr) without a hash,
|
|
91
|
+
// force the hash prefix so HashRouter handles it correctly.
|
|
92
|
+
if (isElectron && url.startsWith('/') && !url.startsWith('#')) {
|
|
93
|
+
console.log('Detected Electron environment with standard path, adding hash prefix:', url);
|
|
94
|
+
return '#' + url;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return url;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Method to set pending redirect URL
|
|
101
|
+
setPendingRedirect(url: string): void {
|
|
102
|
+
// Guard: Skip if redirect is root path (causes infinite redirect loops)
|
|
103
|
+
if (!url || url === '/' || url === '#/' || url === '#') {
|
|
104
|
+
console.log('Skipping pending redirect for root path:', url);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
const sanitizedUrl = this.sanitizeRedirectUrl(url);
|
|
108
|
+
// Double-check sanitized URL isn't root either
|
|
109
|
+
if (sanitizedUrl === '/' || sanitizedUrl === '#/' || sanitizedUrl === '#') {
|
|
110
|
+
console.log('Skipping pending redirect for sanitized root path:', sanitizedUrl);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
console.log('Setting pending redirect:', url, 'â', sanitizedUrl);
|
|
114
|
+
dashStorage.setItem(this.REDIRECT_STORAGE_KEY, sanitizedUrl);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Method to get pending redirect URL
|
|
118
|
+
getPendingRedirect(): string | null {
|
|
119
|
+
return dashStorage.getItem(this.REDIRECT_STORAGE_KEY);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Method to clear pending redirect URL
|
|
123
|
+
|
|
124
|
+
clearPendingRedirect(): void {
|
|
125
|
+
console.log('Clearing pending redirect');
|
|
126
|
+
dashStorage.removeItem(this.REDIRECT_STORAGE_KEY);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Helper to get redirect URL from user's first role with a configured redirect
|
|
130
|
+
private getRoleRedirect(user: any): string | null {
|
|
131
|
+
const roles = user?.roles;
|
|
132
|
+
if (Array.isArray(roles) && roles.length > 0) {
|
|
133
|
+
// Return the first role's redirect if defined
|
|
134
|
+
for (const role of roles) {
|
|
135
|
+
if (role.redirect) {
|
|
136
|
+
console.log('Found role redirect:', role.name, '->', role.redirect);
|
|
137
|
+
return role.redirect;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Method to determine final redirect URL (backend takes precedence over localStorage)
|
|
145
|
+
// persistRedirect: if true, saves to storage (use during login). If false, just returns the value (use during app init).
|
|
146
|
+
private determineRedirectUrl(backendRedirect?: string, persistRedirect: boolean = true): string | null {
|
|
147
|
+
|
|
148
|
+
let val = null;
|
|
149
|
+
// Backend redirect takes precedence
|
|
150
|
+
if (backendRedirect) {
|
|
151
|
+
console.log('Using backend redirect:', backendRedirect, '(persist:', persistRedirect, ')');
|
|
152
|
+
val = backendRedirect;
|
|
153
|
+
if (persistRedirect) {
|
|
154
|
+
this.setPendingRedirect(val);
|
|
155
|
+
return this.getPendingRedirect();
|
|
156
|
+
}
|
|
157
|
+
return this.sanitizeRedirectUrl(val);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Fall back to localStorage redirect
|
|
161
|
+
const localStorageRedirect = this.getPendingRedirect();
|
|
162
|
+
if (localStorageRedirect) {
|
|
163
|
+
console.log('Using localStorage redirect:', localStorageRedirect);
|
|
164
|
+
return localStorageRedirect;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
val = getEnv("APP_DEFAULT_REDIRECT");
|
|
168
|
+
if (persistRedirect) {
|
|
169
|
+
this.setPendingRedirect(val);
|
|
170
|
+
return this.getPendingRedirect();
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return this.sanitizeRedirectUrl(val);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Update the login method to dispatch to Redux directly
|
|
177
|
+
async login(credentials: DASHAuthenticationServiceLoginCredentials): Promise<DASHAuthenticationServiceAuthResponse> {
|
|
178
|
+
console.log("=== DASH AUTH SERVICE LOGIN START ===");
|
|
179
|
+
console.log("Credentials:", { username: credentials.username, password: "***", redirect: credentials.redirect, meta: credentials.meta });
|
|
180
|
+
|
|
181
|
+
if (!(credentials.username && credentials.password)) {
|
|
182
|
+
console.log("â Missing credentials");
|
|
183
|
+
return Promise.resolve({
|
|
184
|
+
success: false,
|
|
185
|
+
error: 'Username and password are required'
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
try {
|
|
190
|
+
console.log("Making login request to /login");
|
|
191
|
+
|
|
192
|
+
const loginResponse = await this.axiosInstance.post('/login', {
|
|
193
|
+
email: credentials.username,
|
|
194
|
+
password: credentials.password,
|
|
195
|
+
redirect: credentials.redirect,
|
|
196
|
+
meta: credentials.meta
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
console.log("Login response status:", loginResponse.status);
|
|
200
|
+
console.log("Login response data:", loginResponse.data);
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
if (loginResponse.status >= 200 && loginResponse.status <= 299) {
|
|
205
|
+
console.log("â
Login response successful");
|
|
206
|
+
|
|
207
|
+
// â
Extract redirectTo from backend response FIRST
|
|
208
|
+
const backendRedirectTo = loginResponse.data.redirectTo;
|
|
209
|
+
|
|
210
|
+
console.log("đ¯ Backend redirectTo:", backendRedirectTo);
|
|
211
|
+
|
|
212
|
+
const today = new Date();
|
|
213
|
+
const expires = new Date();
|
|
214
|
+
expires.setDate(today.getDate() + 2);
|
|
215
|
+
|
|
216
|
+
// Check if we have token data
|
|
217
|
+
if (loginResponse.data && loginResponse.data.token) {
|
|
218
|
+
|
|
219
|
+
console.log("Setting token in storage");
|
|
220
|
+
//setCookie('token', loginResponse.data.token, { expires });
|
|
221
|
+
dashStorage.setItem('token', loginResponse.data.token);
|
|
222
|
+
|
|
223
|
+
// Handle refresh token (backend uses snake_case: refresh_token)
|
|
224
|
+
const refreshToken = loginResponse.data?.refresh_token || loginResponse.data?.refreshToken;
|
|
225
|
+
if (refreshToken) {
|
|
226
|
+
console.log("Setting refresh token in storage");
|
|
227
|
+
dashStorage.setItem('refreshToken', refreshToken);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (loginResponse.data?.meta) {
|
|
231
|
+
console.log("Setting app");
|
|
232
|
+
dashStorage.setItem('app', loginResponse.data.meta.app);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
await syncLocalStorageToDeviceStore();
|
|
236
|
+
|
|
237
|
+
} else {
|
|
238
|
+
console.warn("â ī¸ No token in login response");
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
try {
|
|
242
|
+
console.log("Getting auth data from:", getEnv('APP_GETAUTH_ENDPOINT'));
|
|
243
|
+
|
|
244
|
+
// Get complete auth data
|
|
245
|
+
const authResponse = await this.axiosInstance.get(getEnv('APP_GETAUTH_ENDPOINT'));
|
|
246
|
+
console.log("Auth response status:", authResponse.status);
|
|
247
|
+
console.log("Auth response data:", authResponse.data);
|
|
248
|
+
|
|
249
|
+
const auth = authResponse.data;
|
|
250
|
+
|
|
251
|
+
// â
Use backend redirectTo as the primary redirect
|
|
252
|
+
let finalRedirect = backendRedirectTo;
|
|
253
|
+
|
|
254
|
+
// Only fall back to other redirects if backend didn't provide one
|
|
255
|
+
if (!finalRedirect) {
|
|
256
|
+
// Check auth response redirect, then check role redirects
|
|
257
|
+
const roleRedirect = this.getRoleRedirect(auth.user);
|
|
258
|
+
const authRedirect = auth.redirect || auth.user?.redirect || roleRedirect || null;
|
|
259
|
+
console.log("Auth response redirect:", authRedirect, "(role redirect:", roleRedirect, ")");
|
|
260
|
+
|
|
261
|
+
if (authRedirect) {
|
|
262
|
+
finalRedirect = authRedirect;
|
|
263
|
+
} else if (credentials.redirect && credentials.redirect !== '/login') {
|
|
264
|
+
finalRedirect = credentials.redirect;
|
|
265
|
+
} else {
|
|
266
|
+
finalRedirect = getEnv("APP_DEFAULT_REDIRECT") || '/';
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
console.log("đ¯ Final redirect determined:", finalRedirect);
|
|
271
|
+
|
|
272
|
+
// Use AuthPersistenceService to save auth data
|
|
273
|
+
AuthPersistenceService.saveAuth(auth);
|
|
274
|
+
|
|
275
|
+
// Sync dash-user-locale with tenant's primary language or user preference
|
|
276
|
+
const languageCode = auth.auth?.tenantSettings?.primary_language_code || auth.user?.preferences?.locale;
|
|
277
|
+
if (languageCode) {
|
|
278
|
+
localStorage.setItem('dash-user-locale', languageCode);
|
|
279
|
+
// Dispatch event to trigger I18nBridgeContext locale change
|
|
280
|
+
window.dispatchEvent(new CustomEvent('dash:locale-change', {
|
|
281
|
+
detail: { locale: languageCode }
|
|
282
|
+
}));
|
|
283
|
+
console.log('đ DASHAuthService: Dispatched locale change event:', languageCode);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Set basic localStorage for react-admin compatibility
|
|
287
|
+
dashStorage.setItem('authenticated', 'true');
|
|
288
|
+
dashStorage.setItem('user', JSON.stringify(auth.user));
|
|
289
|
+
dashStorage.setItem(
|
|
290
|
+
'roles',
|
|
291
|
+
auth.user?.roles
|
|
292
|
+
? JSON.stringify(auth.user.roles)
|
|
293
|
+
: JSON.stringify(DASHAppConstants.system.GUEST_ROLE),
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
// Handle tenant impersonation if enabled
|
|
297
|
+
if (
|
|
298
|
+
JSON.parse(
|
|
299
|
+
DASHAdminSystemConstants.system.ENABLE_TENANT_IMPERSONATION.toString(),
|
|
300
|
+
) &&
|
|
301
|
+
auth.user?.tenant_id
|
|
302
|
+
) {
|
|
303
|
+
|
|
304
|
+
dashStorage.setItem('tenant_id', auth.user?.tenant_id);
|
|
305
|
+
//setCookie('tenant_id', auth.user?.tenant_id);
|
|
306
|
+
dashStorage.setItem('user_id', auth.user?.id);
|
|
307
|
+
//setCookie('user_id', auth.user?.id);
|
|
308
|
+
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const resultObject = {
|
|
312
|
+
authenticated: true,
|
|
313
|
+
user: auth.user,
|
|
314
|
+
auth: auth.auth,
|
|
315
|
+
token: loginResponse.data.token || dashStorage.getItem('token'),
|
|
316
|
+
roles: auth.user?.roles
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Dispatch directly to Redux instead of using setAuthEvent
|
|
320
|
+
console.log('đ DASHAuthenticationService: Dispatching to Redux:', resultObject);
|
|
321
|
+
dispatchToRedux(
|
|
322
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
323
|
+
user: resultObject.user,
|
|
324
|
+
authenticated: resultObject.authenticated,
|
|
325
|
+
auth: resultObject.auth,
|
|
326
|
+
})
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
await syncLocalStorageToDeviceStore();
|
|
330
|
+
console.log("â
Login completed successfully");
|
|
331
|
+
return Promise.resolve({
|
|
332
|
+
success: true,
|
|
333
|
+
token: resultObject.token,
|
|
334
|
+
user: resultObject.user,
|
|
335
|
+
auth: resultObject.auth,
|
|
336
|
+
redirectAfterLogin: finalRedirect, // â
Use the backend redirectTo
|
|
337
|
+
});
|
|
338
|
+
} catch (error) {
|
|
339
|
+
await syncLocalStorageToDeviceStore();
|
|
340
|
+
console.error('â Error getting auth data:', error);
|
|
341
|
+
this.logoutFromStorage("login get auth error");
|
|
342
|
+
return Promise.resolve({
|
|
343
|
+
success: false,
|
|
344
|
+
error: 'Failed to get user authentication data'
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
} else {
|
|
348
|
+
await syncLocalStorageToDeviceStore();
|
|
349
|
+
console.log("â Login response status not successful:", loginResponse.status);
|
|
350
|
+
this.logoutFromStorage("login status error logout");
|
|
351
|
+
return Promise.reject({
|
|
352
|
+
success: false,
|
|
353
|
+
error: `Login failed with status: ${loginResponse.status}`
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
} catch (error: any) {
|
|
357
|
+
await syncLocalStorageToDeviceStore();
|
|
358
|
+
console.error('â Login error:', error);
|
|
359
|
+
console.error('Error details:', {
|
|
360
|
+
message: error?.message,
|
|
361
|
+
response: error?.response?.data,
|
|
362
|
+
status: error?.response?.status
|
|
363
|
+
});
|
|
364
|
+
this.logoutFromStorage("login error logout");
|
|
365
|
+
await syncLocalStorageToDeviceStore();
|
|
366
|
+
return Promise.reject({
|
|
367
|
+
success: false,
|
|
368
|
+
error: error?.response?.data?.message || error?.message || 'Login failed'
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Update the initializeFromToken method to dispatch to Redux directly
|
|
376
|
+
async initializeFromToken(): Promise<DASHAuthenticationServiceAuthResponse> {
|
|
377
|
+
const token = dashStorage.getItem('token');
|
|
378
|
+
|
|
379
|
+
if (!token) {
|
|
380
|
+
return {
|
|
381
|
+
success: false,
|
|
382
|
+
error: 'No token found'
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
try {
|
|
387
|
+
console.log('Initializing auth from existing token...');
|
|
388
|
+
|
|
389
|
+
// Get complete auth data using existing token
|
|
390
|
+
const { data: auth } = await this.axiosInstance.get(getEnv('APP_GETAUTH_ENDPOINT'));
|
|
391
|
+
|
|
392
|
+
// Extract redirect from backend auth response, including role redirects
|
|
393
|
+
const roleRedirect = this.getRoleRedirect(auth.user);
|
|
394
|
+
const backendRedirect = auth.redirect || auth.user?.redirect || roleRedirect || null;
|
|
395
|
+
console.log("Backend redirect found during token initialization:", backendRedirect, "(role redirect:", roleRedirect, ")");
|
|
396
|
+
|
|
397
|
+
// Use AuthPersistenceService to save auth data
|
|
398
|
+
AuthPersistenceService.saveAuth(auth);
|
|
399
|
+
|
|
400
|
+
// Set basic localStorage for react-admin compatibility
|
|
401
|
+
dashStorage.setItem('authenticated', 'true');
|
|
402
|
+
dashStorage.setItem('user', JSON.stringify(auth.user));
|
|
403
|
+
dashStorage.setItem(
|
|
404
|
+
'roles',
|
|
405
|
+
auth.user?.roles
|
|
406
|
+
? JSON.stringify(auth.user.roles)
|
|
407
|
+
: JSON.stringify(DASHAppConstants.system.GUEST_ROLE),
|
|
408
|
+
);
|
|
409
|
+
|
|
410
|
+
// Handle tenant impersonation if enabled
|
|
411
|
+
if (
|
|
412
|
+
JSON.parse(
|
|
413
|
+
DASHAdminSystemConstants.system.ENABLE_TENANT_IMPERSONATION.toString(),
|
|
414
|
+
) &&
|
|
415
|
+
auth.user?.tenant_id
|
|
416
|
+
) {
|
|
417
|
+
|
|
418
|
+
dashStorage.setItem('tenant_id', auth.user?.tenant_id);
|
|
419
|
+
setCookie('tenant_id', auth.user?.tenant_id);
|
|
420
|
+
dashStorage.setItem('user_id', auth.user?.id);
|
|
421
|
+
setCookie('user_id', auth.user?.id);
|
|
422
|
+
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
const resultObject = {
|
|
426
|
+
authenticated: true,
|
|
427
|
+
user: auth.user,
|
|
428
|
+
auth: auth.auth,
|
|
429
|
+
token: token,
|
|
430
|
+
roles: auth.user?.roles
|
|
431
|
+
};
|
|
432
|
+
|
|
433
|
+
// Dispatch directly to Redux instead of using setAuthEvent
|
|
434
|
+
console.log('đ DASHAuthenticationService: Dispatching token init to Redux:', resultObject);
|
|
435
|
+
dispatchToRedux(
|
|
436
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
437
|
+
user: resultObject.user,
|
|
438
|
+
authenticated: resultObject.authenticated,
|
|
439
|
+
auth: resultObject.auth,
|
|
440
|
+
})
|
|
441
|
+
);
|
|
442
|
+
|
|
443
|
+
console.log('Auth initialized successfully from existing token');
|
|
444
|
+
await syncLocalStorageToDeviceStore();
|
|
445
|
+
// Determine final redirect URL - don't persist during token init (only during actual login)
|
|
446
|
+
const redirectAfterLogin = this.determineRedirectUrl(backendRedirect, false);
|
|
447
|
+
|
|
448
|
+
return {
|
|
449
|
+
success: true,
|
|
450
|
+
token: token,
|
|
451
|
+
user: auth.user,
|
|
452
|
+
auth: auth.auth,
|
|
453
|
+
redirectAfterLogin: redirectAfterLogin
|
|
454
|
+
};
|
|
455
|
+
} catch (error) {
|
|
456
|
+
console.error('Error initializing auth from token:', error);
|
|
457
|
+
this.logoutFromStorage("initialize from token error");
|
|
458
|
+
await syncLocalStorageToDeviceStore();
|
|
459
|
+
return {
|
|
460
|
+
success: false,
|
|
461
|
+
error: 'Failed to initialize authentication from token'
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
async refreshToken(refreshToken: string): Promise<DASHAuthenticationServiceAuthResponse> {
|
|
467
|
+
try {
|
|
468
|
+
console.log('[DASHAuthService] Attempting to refresh token...');
|
|
469
|
+
|
|
470
|
+
const response = await this.axiosInstance.post('/auth/refresh', {
|
|
471
|
+
refresh_token: refreshToken
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
if (response.status >= 200 && response.status <= 299) {
|
|
475
|
+
const data = response.data;
|
|
476
|
+
|
|
477
|
+
// Update stored auth data using the same pattern as login
|
|
478
|
+
if (data.token) {
|
|
479
|
+
dashStorage.setItem('token', data.token);
|
|
480
|
+
console.log('[DASHAuthService] Access token updated');
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if (data.refresh_token) {
|
|
484
|
+
dashStorage.setItem('refreshToken', data.refresh_token);
|
|
485
|
+
console.log('[DASHAuthService] Refresh token rotated');
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
await syncLocalStorageToDeviceStore();
|
|
489
|
+
|
|
490
|
+
console.log('[DASHAuthService] Token refresh successful');
|
|
491
|
+
|
|
492
|
+
return {
|
|
493
|
+
success: true,
|
|
494
|
+
token: data.token,
|
|
495
|
+
refreshToken: data.refresh_token,
|
|
496
|
+
user: data.user
|
|
497
|
+
};
|
|
498
|
+
} else {
|
|
499
|
+
console.warn('[DASHAuthService] Token refresh returned non-success status:', response.status);
|
|
500
|
+
return {
|
|
501
|
+
success: false,
|
|
502
|
+
error: 'Token refresh failed'
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
} catch (error: any) {
|
|
506
|
+
console.error('[DASHAuthService] Token refresh error:', error);
|
|
507
|
+
|
|
508
|
+
// Check if it's a 401 error (refresh token expired/invalid)
|
|
509
|
+
if (error?.response?.status === 401) {
|
|
510
|
+
console.log('[DASHAuthService] Refresh token is invalid or expired');
|
|
511
|
+
// Clear auth state since refresh token is no longer valid
|
|
512
|
+
this.logoutFromStorage('refresh_token_expired');
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
return {
|
|
516
|
+
success: false,
|
|
517
|
+
error: error?.response?.data?.message || error?.message || 'Network error occurred'
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
private logoutFromStorage = async (reason: string) => {
|
|
523
|
+
console.log("logoutFromStorage", reason);
|
|
524
|
+
|
|
525
|
+
// Clear pending redirect on logout
|
|
526
|
+
//this.clearPendingRedirect();
|
|
527
|
+
// Store current path as pending redirect
|
|
528
|
+
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
// Use the centralized persistence service instead of manual cleanup
|
|
532
|
+
AuthPersistenceService.markAsLoggedOut();
|
|
533
|
+
|
|
534
|
+
// Clear auth data from device store (Electron/Capacitor)
|
|
535
|
+
// This is crucial - it removes token/user from electron-store so they
|
|
536
|
+
// don't get restored on next app launch
|
|
537
|
+
await clearDeviceStoreAuth();
|
|
538
|
+
|
|
539
|
+
// Keep only the IPC service cleanup
|
|
540
|
+
const { DashIPCService } = window as any;
|
|
541
|
+
DashIPCService && DashIPCService.action('stop-bg-service');
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
async checkAuth(): Promise<boolean> {
|
|
545
|
+
// First check localStorage for basic auth state
|
|
546
|
+
const isAuthenticated = JSON.parse(dashStorage.getItem('authenticated') || 'false');
|
|
547
|
+
const user = JSON.parse(dashStorage.getItem('user') || 'null');
|
|
548
|
+
|
|
549
|
+
if (isAuthenticated && user?.id) {
|
|
550
|
+
// Also check if we have valid persisted auth data
|
|
551
|
+
const persistedAuth = AuthPersistenceService.getAuth();
|
|
552
|
+
if (persistedAuth) {
|
|
553
|
+
return true;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
return false;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
async getIdentity(): Promise<any> {
|
|
561
|
+
const token = dashStorage.getItem('token');
|
|
562
|
+
if (!token) {
|
|
563
|
+
throw new Error('No token present');
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
try {
|
|
567
|
+
const { data: auth } = await this.axiosInstance.get(getEnv('APP_GETAUTH_ENDPOINT'));
|
|
568
|
+
|
|
569
|
+
dashStorage.setItem(
|
|
570
|
+
'roles',
|
|
571
|
+
auth.user?.roles
|
|
572
|
+
? JSON.stringify(auth.user.roles)
|
|
573
|
+
: JSON.stringify(DASHAppConstants.system.GUEST_ROLE),
|
|
574
|
+
);
|
|
575
|
+
dashStorage.setItem('authenticated', 'true');
|
|
576
|
+
dashStorage.setItem('user', JSON.stringify(auth.user));
|
|
577
|
+
|
|
578
|
+
// Handle tenant impersonation if enabled
|
|
579
|
+
if (
|
|
580
|
+
JSON.parse(
|
|
581
|
+
DASHAdminSystemConstants.system.ENABLE_TENANT_IMPERSONATION.toString(),
|
|
582
|
+
) &&
|
|
583
|
+
auth.user?.tenant_id
|
|
584
|
+
) {
|
|
585
|
+
|
|
586
|
+
dashStorage.setItem('tenant_id', auth.user?.tenant_id);
|
|
587
|
+
//setCookie('tenant_id', auth.user?.tenant_id);
|
|
588
|
+
dashStorage.setItem('user_id', auth.user?.id);
|
|
589
|
+
//setCookie('user_id', auth.user?.id);
|
|
590
|
+
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
await syncLocalStorageToDeviceStore();
|
|
594
|
+
|
|
595
|
+
return auth;
|
|
596
|
+
} catch (error) {
|
|
597
|
+
this.logoutFromStorage("get identity error logout");
|
|
598
|
+
throw error;
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
// Rest of your methods remain the same...
|
|
603
|
+
async shouldRefreshToken(): Promise<boolean> {
|
|
604
|
+
const token = dashStorage.getItem('token');
|
|
605
|
+
if (!token) return false;
|
|
606
|
+
|
|
607
|
+
const refreshToken = dashStorage.getItem('refreshToken');
|
|
608
|
+
return !!refreshToken;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
async handleTokenRefresh(): Promise<boolean> {
|
|
612
|
+
const refreshToken = dashStorage.getItem('refreshToken');
|
|
613
|
+
if (!refreshToken) return false;
|
|
614
|
+
|
|
615
|
+
try {
|
|
616
|
+
const refreshResponse = await this.refreshToken(refreshToken);
|
|
617
|
+
if (refreshResponse.success) {
|
|
618
|
+
|
|
619
|
+
// Update localStorage with new token
|
|
620
|
+
dashStorage.setItem('token', refreshResponse.token!);
|
|
621
|
+
if (refreshResponse.refreshToken) {
|
|
622
|
+
dashStorage.setItem('refreshToken', refreshResponse.refreshToken);
|
|
623
|
+
}
|
|
624
|
+
await syncLocalStorageToDeviceStore();
|
|
625
|
+
return true;
|
|
626
|
+
}
|
|
627
|
+
} catch (error) {
|
|
628
|
+
console.error('Token refresh failed:', error);
|
|
629
|
+
this.logoutFromStorage("token refresh failed");
|
|
630
|
+
}
|
|
631
|
+
return false;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
// Method to check if we should initialize from token on app load
|
|
635
|
+
async shouldInitializeFromToken(forceGetAuth?: boolean): Promise<boolean> {
|
|
636
|
+
|
|
637
|
+
if (forceGetAuth) { return true };
|
|
638
|
+
|
|
639
|
+
const token = dashStorage.getItem('token');
|
|
640
|
+
const isAuthenticated = JSON.parse(dashStorage.getItem('authenticated') || 'false');
|
|
641
|
+
const user = dashStorage.getItem('user');
|
|
642
|
+
|
|
643
|
+
// If we have a token but are not fully authenticated, we should initialize
|
|
644
|
+
return !!(token && (!isAuthenticated || !user));
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// Update the initializeApp method to dispatch to Redux directly
|
|
648
|
+
async initializeApp(forceGetAuth?: boolean): Promise<DASHAuthenticationServiceAuthResponse> {
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
console.log('Initializing DASH app authentication...');
|
|
652
|
+
const USES_GET_AUTH = true; // TODO: add the get auth to the env and retrieve it through getEnv. nevertheless all apps uses getAuth.
|
|
653
|
+
|
|
654
|
+
const shouldInit = await this.shouldInitializeFromToken(forceGetAuth);
|
|
655
|
+
|
|
656
|
+
if (shouldInit) {
|
|
657
|
+
console.log('Token found but not fully authenticated, initializing...');
|
|
658
|
+
return await this.initializeFromToken();
|
|
659
|
+
} else {
|
|
660
|
+
const token = dashStorage.getItem('token');
|
|
661
|
+
const isAuthenticated = JSON.parse(dashStorage.getItem('authenticated') || 'false');
|
|
662
|
+
const user = dashStorage.getItem('user');
|
|
663
|
+
|
|
664
|
+
if (token && isAuthenticated && user) {
|
|
665
|
+
console.log('Already authenticated, checking if auth refresh needed');
|
|
666
|
+
|
|
667
|
+
// If shouldGetAuth is true, refresh auth data to get latest tenant/user info
|
|
668
|
+
if (USES_GET_AUTH) {
|
|
669
|
+
try {
|
|
670
|
+
console.log('Refreshing auth data for latest tenant/user information...');
|
|
671
|
+
|
|
672
|
+
// Get fresh auth data
|
|
673
|
+
const authResponse = await this.axiosInstance.get(getEnv('APP_GETAUTH_ENDPOINT'));
|
|
674
|
+
console.log("Fresh auth response:", authResponse.data);
|
|
675
|
+
|
|
676
|
+
const auth = authResponse.data;
|
|
677
|
+
|
|
678
|
+
// Extract redirect from backend auth response, including role redirects
|
|
679
|
+
const roleRedirect = this.getRoleRedirect(auth.user);
|
|
680
|
+
const backendRedirect = auth.redirect || auth.user?.redirect || roleRedirect || null;
|
|
681
|
+
console.log("Backend redirect found during app initialization:", backendRedirect, "(role redirect:", roleRedirect, ")");
|
|
682
|
+
|
|
683
|
+
// Update stored auth data
|
|
684
|
+
AuthPersistenceService.saveAuth(auth);
|
|
685
|
+
|
|
686
|
+
// Sync dash-user-locale with fresh tenant/user preference
|
|
687
|
+
const languageCode = auth.auth?.tenantSettings?.primary_language_code || auth.user?.preferences?.locale;
|
|
688
|
+
if (languageCode) {
|
|
689
|
+
localStorage.setItem('dash-user-locale', languageCode);
|
|
690
|
+
// Dispatch event to trigger I18nBridgeContext locale change
|
|
691
|
+
window.dispatchEvent(new CustomEvent('dash:locale-change', {
|
|
692
|
+
detail: { locale: languageCode }
|
|
693
|
+
}));
|
|
694
|
+
console.log('đ DASHAuthService: Dispatched locale change event (app init):', languageCode);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
// Update localStorage with fresh data
|
|
698
|
+
dashStorage.setItem('user', JSON.stringify(auth.user));
|
|
699
|
+
dashStorage.setItem(
|
|
700
|
+
'roles',
|
|
701
|
+
auth.user?.roles
|
|
702
|
+
? JSON.stringify(auth.user.roles)
|
|
703
|
+
: JSON.stringify(DASHAppConstants.system.GUEST_ROLE),
|
|
704
|
+
);
|
|
705
|
+
|
|
706
|
+
// Handle tenant impersonation with fresh data
|
|
707
|
+
if (
|
|
708
|
+
JSON.parse(
|
|
709
|
+
DASHAdminSystemConstants.system.ENABLE_TENANT_IMPERSONATION.toString(),
|
|
710
|
+
) &&
|
|
711
|
+
auth.user?.tenant_id
|
|
712
|
+
) {
|
|
713
|
+
// Update tenant information even if it exists (in case it changed)
|
|
714
|
+
dashStorage.setItem('tenant_id', auth.user?.tenant_id);
|
|
715
|
+
//setCookie('tenant_id', auth.user?.tenant_id);
|
|
716
|
+
dashStorage.setItem('user_id', auth.user?.id);
|
|
717
|
+
//setCookie('user_id', auth.user?.id);
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
const resultObject = {
|
|
721
|
+
authenticated: true,
|
|
722
|
+
user: auth.user,
|
|
723
|
+
auth: auth.auth,
|
|
724
|
+
token: token,
|
|
725
|
+
roles: auth.user?.roles
|
|
726
|
+
};
|
|
727
|
+
|
|
728
|
+
// Dispatch directly to Redux with fresh data
|
|
729
|
+
console.log('đ DASHAuthenticationService: Dispatching fresh auth to Redux:', resultObject);
|
|
730
|
+
dispatchToRedux(
|
|
731
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
732
|
+
user: resultObject.user,
|
|
733
|
+
authenticated: resultObject.authenticated,
|
|
734
|
+
auth: resultObject.auth,
|
|
735
|
+
})
|
|
736
|
+
);
|
|
737
|
+
|
|
738
|
+
// Determine final redirect URL (backend takes precedence)
|
|
739
|
+
// Don't persist redirect during app init - only during actual login
|
|
740
|
+
const redirectAfterLogin = this.determineRedirectUrl(backendRedirect, false);
|
|
741
|
+
|
|
742
|
+
console.log('Auth data refreshed successfully');
|
|
743
|
+
|
|
744
|
+
await syncLocalStorageToDeviceStore();
|
|
745
|
+
|
|
746
|
+
return {
|
|
747
|
+
success: true,
|
|
748
|
+
token: token,
|
|
749
|
+
user: auth.user,
|
|
750
|
+
auth: auth.auth,
|
|
751
|
+
redirectAfterLogin: redirectAfterLogin
|
|
752
|
+
};
|
|
753
|
+
|
|
754
|
+
} catch (error) {
|
|
755
|
+
console.error('Error refreshing auth data:', error);
|
|
756
|
+
|
|
757
|
+
// If refresh fails, fall back to existing data but don't fail the initialization
|
|
758
|
+
console.log('Falling back to existing auth data');
|
|
759
|
+
|
|
760
|
+
const existingUser = JSON.parse(user);
|
|
761
|
+
const persistedAuth = AuthPersistenceService.getAuth();
|
|
762
|
+
|
|
763
|
+
// Dispatch existing data to Redux
|
|
764
|
+
console.log('đ DASHAuthenticationService: Dispatching existing auth to Redux');
|
|
765
|
+
dispatchToRedux(
|
|
766
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
767
|
+
user: existingUser,
|
|
768
|
+
authenticated: true,
|
|
769
|
+
auth: persistedAuth?.auth || null,
|
|
770
|
+
})
|
|
771
|
+
);
|
|
772
|
+
|
|
773
|
+
// Still check for localStorage redirect as fallback
|
|
774
|
+
// Don't persist redirect during app init - only during actual login
|
|
775
|
+
const redirectAfterLogin = this.determineRedirectUrl(undefined, false);
|
|
776
|
+
|
|
777
|
+
await syncLocalStorageToDeviceStore();
|
|
778
|
+
|
|
779
|
+
return {
|
|
780
|
+
success: true,
|
|
781
|
+
token: token,
|
|
782
|
+
user: existingUser,
|
|
783
|
+
auth: persistedAuth?.auth || null,
|
|
784
|
+
redirectAfterLogin: redirectAfterLogin
|
|
785
|
+
};
|
|
786
|
+
}
|
|
787
|
+
} else {
|
|
788
|
+
console.log('No auth refresh needed, using existing data');
|
|
789
|
+
|
|
790
|
+
const existingUser = JSON.parse(user);
|
|
791
|
+
const persistedAuth = AuthPersistenceService.getAuth();
|
|
792
|
+
|
|
793
|
+
// Dispatch existing data to Redux
|
|
794
|
+
console.log('đ DASHAuthenticationService: Dispatching existing auth to Redux');
|
|
795
|
+
dispatchToRedux(
|
|
796
|
+
DASH_REDUX_ACTIONS.updateAuth(ACTION_UPDATE_AUTH, {
|
|
797
|
+
user: existingUser,
|
|
798
|
+
authenticated: true,
|
|
799
|
+
auth: persistedAuth?.auth || null,
|
|
800
|
+
})
|
|
801
|
+
);
|
|
802
|
+
|
|
803
|
+
// Still check for pending redirect even if not refreshing auth
|
|
804
|
+
// Don't persist redirect during app init - only during actual login
|
|
805
|
+
const redirectAfterLogin = this.determineRedirectUrl(undefined, false);
|
|
806
|
+
|
|
807
|
+
await syncLocalStorageToDeviceStore();
|
|
808
|
+
|
|
809
|
+
return {
|
|
810
|
+
success: true,
|
|
811
|
+
token: token,
|
|
812
|
+
user: existingUser,
|
|
813
|
+
auth: persistedAuth?.auth || null,
|
|
814
|
+
redirectAfterLogin: redirectAfterLogin
|
|
815
|
+
};
|
|
816
|
+
}
|
|
817
|
+
} else {
|
|
818
|
+
console.log('No valid authentication found');
|
|
819
|
+
await syncLocalStorageToDeviceStore();
|
|
820
|
+
return {
|
|
821
|
+
success: false,
|
|
822
|
+
error: 'No valid authentication found'
|
|
823
|
+
};
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
// Method to integrate with React Admin
|
|
831
|
+
async loginWithReactAdmin(credentials: DASHAuthenticationServiceLoginCredentials, reactAdminLogin?: any): Promise<void> {
|
|
832
|
+
debugger;
|
|
833
|
+
const effectiveLogin = reactAdminLogin || this.login;
|
|
834
|
+
const authResponse = await effectiveLogin(credentials);
|
|
835
|
+
return authResponse;
|
|
836
|
+
/*if (authResponse.success) {
|
|
837
|
+
// Use React Admin's login with custom auth data
|
|
838
|
+
await reactAdminLogin({
|
|
839
|
+
customAuthData: {
|
|
840
|
+
token: authResponse.token,
|
|
841
|
+
user: authResponse.user,
|
|
842
|
+
auth: authResponse.auth,
|
|
843
|
+
refreshToken: authResponse.refreshToken,
|
|
844
|
+
redirectAfterLogin: authResponse.redirectAfterLogin
|
|
845
|
+
}
|
|
846
|
+
});
|
|
847
|
+
} else {
|
|
848
|
+
throw new Error(authResponse.error || 'Login failed');
|
|
849
|
+
}*/
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
// Function to get initial auth state with persisted values
|
|
853
|
+
getInitialAuthState = () => {
|
|
854
|
+
try {
|
|
855
|
+
// Get persisted auth data
|
|
856
|
+
const persistedAuth = AuthPersistenceService.getAuth();
|
|
857
|
+
const storedUser = AuthPersistenceService.getUser();
|
|
858
|
+
const storedToken = AuthPersistenceService.getToken();
|
|
859
|
+
const isAuthenticated = JSON.parse(dashStorage.getItem('authenticated') || 'false');
|
|
860
|
+
|
|
861
|
+
console.log('đ DASHLightApp: Initializing auth state with persisted data:', {
|
|
862
|
+
hasPersistedAuth: !!persistedAuth,
|
|
863
|
+
hasStoredUser: !!storedUser,
|
|
864
|
+
hasStoredToken: !!storedToken,
|
|
865
|
+
isAuthenticated,
|
|
866
|
+
storedUser: storedUser ? `${storedUser.name || storedUser.email} (${storedUser.id})` : null,
|
|
867
|
+
persistedAuthStructure: persistedAuth ? Object.keys(persistedAuth) : null
|
|
868
|
+
});
|
|
869
|
+
|
|
870
|
+
// If we have valid persisted auth data, use it
|
|
871
|
+
if (isAuthenticated && storedUser && storedToken && persistedAuth) {
|
|
872
|
+
console.log('â
DASHLightApp: Using persisted auth state');
|
|
873
|
+
const authState = {
|
|
874
|
+
authenticated: true,
|
|
875
|
+
user: storedUser, // This should be the actual user object
|
|
876
|
+
auth: persistedAuth.auth || null, // This should be the actual auth object
|
|
877
|
+
};
|
|
878
|
+
|
|
879
|
+
console.log('đ DASHLightApp: Constructed auth state:', {
|
|
880
|
+
authenticated: authState.authenticated,
|
|
881
|
+
user: authState.user ? `${authState.user.name || authState.user.email} (${authState.user.id})` : null,
|
|
882
|
+
auth: authState.auth ? 'present' : null
|
|
883
|
+
});
|
|
884
|
+
|
|
885
|
+
return authState;
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
// If we have a token but not full auth data, we'll let DASHAuthenticationService handle initialization
|
|
889
|
+
if (storedToken && !isAuthenticated) {
|
|
890
|
+
console.log('đ DASHLightApp: Token found but not authenticated, will initialize later');
|
|
891
|
+
return {
|
|
892
|
+
authenticated: false,
|
|
893
|
+
user: null,
|
|
894
|
+
auth: null,
|
|
895
|
+
};
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
console.log('âšī¸ DASHLightApp: No valid persisted auth found, using default auth state');
|
|
899
|
+
return {
|
|
900
|
+
authenticated: false,
|
|
901
|
+
user: null,
|
|
902
|
+
auth: null
|
|
903
|
+
};
|
|
904
|
+
} catch (error) {
|
|
905
|
+
console.error('â DASHLightApp: Error getting initial auth state:', error);
|
|
906
|
+
return {
|
|
907
|
+
authenticated: false,
|
|
908
|
+
user: null,
|
|
909
|
+
auth: null
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
};
|
|
913
|
+
|
|
914
|
+
|
|
915
|
+
}
|
|
916
|
+
|
|
917
|
+
export default new DASHAuthenticationService();
|