@dashadmin/dash-admin 1.3.25 → 1.3.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. package/dist/AppAsyncWrapper.js +30 -1
  2. package/dist/AppWrapper.js +35 -1
  3. package/dist/DASHAdmin.js +312 -1
  4. package/dist/RoutingWrapper.js +76 -1
  5. package/dist/classes/DASHStorageClass.js +15 -1
  6. package/dist/components/Input/RichTextField.js +26 -1
  7. package/dist/components/Redirect.js +56 -1
  8. package/dist/components/avatar/Avatar.js +72 -1
  9. package/dist/components/avatar/SingleImageUploader.js +46 -1
  10. package/dist/components/currency/Format.js +71 -1
  11. package/dist/components/custom/Redirect.js +20 -1
  12. package/dist/components/error/Error.js +161 -1
  13. package/dist/components/geocoding/GeocodingField.js +133 -1
  14. package/dist/components/i18n/BridgedLocalesMenuButton.js +126 -1
  15. package/dist/components/i18n/LangSwitcher.js +196 -1
  16. package/dist/components/loader/GlobalLoader.js +71 -1
  17. package/dist/components/logs/LogFile.js +99 -1
  18. package/dist/components/logs/LogFileById.js +75 -1
  19. package/dist/components/logs/LogViewer.js +33 -1
  20. package/dist/components/menu/AppMenu.js +11 -1
  21. package/dist/components/menu/CustomMenuItemLink.js +77 -1
  22. package/dist/components/menu/DarkToggleMode.js +47 -1
  23. package/dist/components/menu/LanguageToggleMode.js +99 -1
  24. package/dist/components/misc/CustomImageInput.js +54 -1
  25. package/dist/components/misc/DASHGlobalErrorHandler.js +159 -1
  26. package/dist/components/misc/DarkModeSwitcher.js +40 -1
  27. package/dist/components/misc/LanguageSwitcher.js +193 -1
  28. package/dist/components/misc/MUIHtmlToolTip.js +50 -1
  29. package/dist/components/misc/MuiSimpleJsonTable.js +178 -1
  30. package/dist/components/misc/MultiLevelTable.js +124 -1
  31. package/dist/components/misc/NoResults.js +17 -1
  32. package/dist/components/misc/PDFViewer.js +86 -1
  33. package/dist/components/navigation/Breadcrumbs.js +178 -1
  34. package/dist/components/navigation/BreadcrumbsManager.js +194 -1
  35. package/dist/components/navigation/index.js +8 -1
  36. package/dist/components/panel/Error.js +161 -1
  37. package/dist/components/permission/AvailablePermissionsContext.js +157 -1
  38. package/dist/components/permission/PermissionsSelector.js +719 -1
  39. package/dist/components/permission/PermissionsSelectorList.js +400 -1
  40. package/dist/components/racustombuttons/CustomRAButton.js +94 -1
  41. package/dist/components/racustombuttons/QuickButton.js +109 -1
  42. package/dist/components/racustombuttons/QuickEditButton.js +114 -1
  43. package/dist/components/racustombuttons/QuickIconButton.js +119 -1
  44. package/dist/components/scrollbar/Scrollbar.js +52 -1
  45. package/dist/components/selects/MultiSelect.js +42 -1
  46. package/dist/components/selects/RASearchableSelect.js +207 -1
  47. package/dist/components/selects/RASearchableSelectChips.js +225 -1
  48. package/dist/components/selects/SearchableSelect.js +128 -1
  49. package/dist/components/subscription/BillingCycleSelectInput.js +50 -1
  50. package/dist/components/subscription/PlanAddonsSettings.js +396 -1
  51. package/dist/components/subscription/PlanAuditLog.js +345 -1
  52. package/dist/components/subscription/PlanFeaturesSettings.js +151 -1
  53. package/dist/components/subscription/PlanLimitsSettings.js +168 -1
  54. package/dist/components/subscription/PlanMetadataSettings.js +219 -1
  55. package/dist/components/subscription/PlanPricesSettings.js +222 -1
  56. package/dist/components/subscription/index.js +12 -1
  57. package/dist/components/svgelements/SvgLoading.js +330 -1
  58. package/dist/components/svgelements/SvgLogo.js +70 -1
  59. package/dist/components/svgelements/SvgLogoMin.js +76 -1
  60. package/dist/components/svgelements/SvgShipping.js +1001 -1
  61. package/dist/components/tenant/TenantAttributes.js +107 -1
  62. package/dist/components/tenant/TenantAttributesContext.js +150 -1
  63. package/dist/components/tenant/TenantSelector.js +160 -1
  64. package/dist/components/tenant/TenantSettings.js +107 -1
  65. package/dist/components/tenant/TenantSettingsContext.js +152 -1
  66. package/dist/components/tenant/TenantTheme.js +112 -1
  67. package/dist/components/user/AvatarComponent.js +270 -1
  68. package/dist/components/user/TenantAvatarComponent.js +83 -1
  69. package/dist/components/user/UserPreferences.js +422 -1
  70. package/dist/config/ACTIONS.js +25 -1
  71. package/dist/config/ConstantsService.js +25 -1
  72. package/dist/config/DASHAdminSystemConstants.js +137 -1
  73. package/dist/config/PARSERS.js +9 -1
  74. package/dist/contexts/DashQueryClientContext.js +78 -1
  75. package/dist/contexts/DashResourceContext.js +21 -1
  76. package/dist/contexts/I18nBridgeContext.js +123 -1
  77. package/dist/contexts/I18nBridgeSetter.js +29 -1
  78. package/dist/contexts/I18nReduxSync.js +16 -1
  79. package/dist/contexts/SubscriptionPlanFormatsProvider.js +175 -1
  80. package/dist/contexts/SystemRequestsCache.js +194 -1
  81. package/dist/contexts/auth/AuthContext.js +396 -1
  82. package/dist/contexts/auth/AuthContextLocalStorage.js +118 -1
  83. package/dist/contexts/auth/DASHAuthenticationService.js +679 -1
  84. package/dist/contexts/auth/WindowContext.js +10 -1
  85. package/dist/contexts/auth/index.js +2 -1
  86. package/dist/contexts/com/FCMContext.js +378 -1
  87. package/dist/contexts/com/LaravelEchoContext.js +45 -1
  88. package/dist/contexts/com/LaravelEchoMgr.js +121 -1
  89. package/dist/contexts/com/components/DefaultNotificationComponent.js +31 -1
  90. package/dist/contexts/com/components/NotificationAttributesTable.js +28 -1
  91. package/dist/contexts/com/components/NotificationRenderer.js +36 -1
  92. package/dist/contexts/com/components/NotificationsWidget.js +142 -1
  93. package/dist/contexts/com/components/notificationFormats.js +15 -1
  94. package/dist/contexts/com/useLaravelEcho.js +340 -1
  95. package/dist/contexts/dictionary/DictionaryContext.js +43 -1
  96. package/dist/default-theme/DASHAppProviders.js +86 -1
  97. package/dist/default-theme/DashThemeContext.js +146 -1
  98. package/dist/default-theme/DashThemeHelperProvider.js +54 -1
  99. package/dist/default-theme/DomainAppLayout.js +126 -1
  100. package/dist/default-theme/DomainHeader.js +114 -1
  101. package/dist/default-theme/DomainTheme.js +60 -1
  102. package/dist/default-theme/FullLayoutMarkup.js +55 -1
  103. package/dist/default-theme/StaticLayout.js +36 -1
  104. package/dist/default-theme/index.js +19 -1
  105. package/dist/default-theme/menu/AppMaterialMenu.js +364 -1
  106. package/dist/default-theme/menu/AppMenuComponents/SubmenuPortal.js +33 -1
  107. package/dist/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItem.js +239 -1
  108. package/dist/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItems.js +22 -1
  109. package/dist/default-theme/menu/AppMenuComponents/expanded/CollapsableSidebarMenu.js +209 -1
  110. package/dist/default-theme/menu/AppMenuComponents/expanded/SidebarItem.js +71 -1
  111. package/dist/default-theme/menu/AppMenuComponents/getItem.js +7 -1
  112. package/dist/default-theme/menu/AppMenuComponents/submenuConstants.js +78 -1
  113. package/dist/default-theme/menu/AppSidebarMaterial.js +232 -1
  114. package/dist/default-theme/menu/SidebarActions.js +75 -1
  115. package/dist/default-theme/updateDomCssVariables.js +134 -1
  116. package/dist/helpers/checkRole.js +14 -1
  117. package/dist/helpers/parseAxiosError.js +28 -2
  118. package/dist/hooks/audio/useAudio.js +24 -1
  119. package/dist/hooks/axios.js +52 -1
  120. package/dist/hooks/data/useDashboardStats.js +88 -1
  121. package/dist/hooks/data/usePackageByClientsStats.js +51 -1
  122. package/dist/hooks/data/usePackageByCommunesStats.js +51 -1
  123. package/dist/hooks/data/usePackageStats.js +88 -1
  124. package/dist/hooks/data/usePackageWithdrawDetails.js +69 -1
  125. package/dist/hooks/data/useStats.js +94 -1
  126. package/dist/hooks/isCurrentPath.js +18 -1
  127. package/dist/hooks/notifications/WSMessagesManager.js +128 -1
  128. package/dist/hooks/notifications/WSPusherManager.js +70 -1
  129. package/dist/hooks/useBreadcrumbs.js +208 -1
  130. package/dist/hooks/useClickOutside.js +18 -1
  131. package/dist/hooks/useFormPersistance.js +129 -1
  132. package/dist/hooks/useGlobalErrorMediator.js +37 -1
  133. package/dist/hooks/useGlobalLoaderMgr.js +20 -1
  134. package/dist/hooks/useHash.js +24 -1
  135. package/dist/hooks/useLocalStorage.js +68 -1
  136. package/dist/hooks/usePolyglotTranslation.js +57 -1
  137. package/dist/hooks/usePrevious.js +12 -1
  138. package/dist/hooks/usePrintSelected.js +30 -1
  139. package/dist/hooks/useVirtualHash.js +28 -1
  140. package/dist/hooks/window/useWindowSize.js +23 -1
  141. package/dist/index.js +120 -97
  142. package/dist/interfaces.js +6 -1
  143. package/dist/layout/AppLayout.js +36 -1
  144. package/dist/layout/ApplicationLayout.js +110 -1
  145. package/dist/layout/MotionWrapper.js +182 -1
  146. package/dist/layout/MotionWrapper.original.js +182 -1
  147. package/dist/layout/ResourceMenu.js +87 -1
  148. package/dist/layout/ResoureLayout.js +47 -1
  149. package/dist/layout/TransitionWrapper.js +83 -2
  150. package/dist/pages/ChangePassword.js +198 -1
  151. package/dist/pages/DASHLanding.js +9 -1
  152. package/dist/pages/DASHLightWeightLogin.js +495 -1
  153. package/dist/pages/DASHSimpleLogin.js +231 -1
  154. package/dist/pages/Login.js +113 -1
  155. package/dist/pages/Profile.js +347 -1
  156. package/dist/pages/RecoverPassword.js +175 -1
  157. package/dist/pages/SingleImageUploader.js +40 -1
  158. package/dist/pages/VerifyAccount.js +129 -1
  159. package/dist/providers/authProvider.js +186 -1
  160. package/dist/providers/dataProvider.js +468 -1
  161. package/dist/providers/i18n/en.js +514 -1
  162. package/dist/providers/i18n/es.js +520 -1
  163. package/dist/providers/i18n/languages.js +8 -1
  164. package/dist/providers/i18nProvider.js +23 -1
  165. package/dist/react-admin-dash/RADashComponent.js +210 -1
  166. package/dist/react-admin-dash/Resource.js +62 -1
  167. package/dist/resources/Brand/BrandResource.js +106 -1
  168. package/dist/resources/DASHResourceLoader.js +104 -1
  169. package/dist/resources/Log/LogResource.js +59 -1
  170. package/dist/resources/Tenant/ImpersonateTenantResource.js +113 -1
  171. package/dist/resources/Trash/TrashTemplate.js +195 -1
  172. package/dist/resources.js +259 -1
  173. package/dist/schemas/log.js +45 -1
  174. package/dist/schemas/notification.js +39 -1
  175. package/dist/schemas/permissions.js +44 -1
  176. package/dist/schemas/roles.js +48 -1
  177. package/dist/schemas/rolesDataGrid.js +48 -1
  178. package/dist/schemas/subscription/components/SubscriptionActions.js +172 -1
  179. package/dist/schemas/subscription/components/SubscriptionPaymentHistory.js +101 -1
  180. package/dist/schemas/subscription/components/SubscriptionPlanFeatures.js +115 -1
  181. package/dist/schemas/subscription/components/SubscriptionPlanPreview.js +92 -1
  182. package/dist/schemas/subscription/components/SubscriptionPlanStats.js +181 -1
  183. package/dist/schemas/subscription/components/SubscriptionStatusIndicator.js +70 -1
  184. package/dist/schemas/subscription/subscriptionPlanSchema.js +184 -1
  185. package/dist/schemas/subscription/subscriptionSchema.js +147 -1
  186. package/dist/schemas/subscriptionPlan.js +397 -1
  187. package/dist/schemas/tenant.js +122 -1
  188. package/dist/schemas/tenantUser.js +94 -1
  189. package/dist/schemas/tenant_superadmin.js +118 -1
  190. package/dist/schemas/user.js +26 -1
  191. package/dist/systemResources.js +1039 -1
  192. package/dist/systemResources.old.js +668 -1
  193. package/dist/templates/ResourceTemplate.js +196 -1
  194. package/dist/templates/ResourceTemplateCreate.js +144 -1
  195. package/dist/templates/ResourceTemplateEdit.js +147 -1
  196. package/dist/templates/ResourceTemplateFull.js +518 -1
  197. package/dist/templates/ResourceTemplateList.js +295 -1
  198. package/dist/templates/ResourceTemplateShow.js +45 -1
  199. package/dist/templates/TrashTemplate.js +175 -1
  200. package/dist/tenantResources.js +206 -1
  201. package/dist/test_portal_bubbles.js +37 -1
  202. package/dist/theme/AppHeader.js +60 -1
  203. package/dist/theme/AppLayoutSetting.js +34 -1
  204. package/dist/theme/AppLogo.js +7 -1
  205. package/dist/theme/AppSidebar.js +30 -1
  206. package/dist/theme/AppSidebarContent.js +84 -1
  207. package/dist/theme/AppSidebarLogo.js +42 -1
  208. package/dist/theme/components/PageTitle.js +61 -1
  209. package/dist/utils/cache/CacheInvalidatorContext.js +100 -1
  210. package/dist/utils/cache/CacheInvalidatorListenerComponent.js +10 -1
  211. package/dist/utils/cache/useCacheInvalidatorListener.js +17 -1
  212. package/dist/utils/convertFileToBase64.js +10 -1
  213. package/dist/utils/convertToFile.js +12 -1
  214. package/dist/utils/cookies.js +45 -1
  215. package/dist/utils/dashDefaultQueryClient.js +15 -1
  216. package/dist/utils/dataUrlToBlob.js +23 -1
  217. package/dist/utils/deepReplace.js +17 -1
  218. package/dist/utils/getProfileMenu.js +31 -1
  219. package/dist/utils/getTenantSettings.js +9 -1
  220. package/dist/utils/getType.js +10 -1
  221. package/dist/utils/getUserSettings.js +9 -1
  222. package/dist/utils/hasCode.js +14 -1
  223. package/dist/utils/index.js +19 -1
  224. package/dist/utils/injectTenantStyles.js +19 -1
  225. package/dist/utils/isComponent.js +23 -1
  226. package/dist/utils/navEvents.js +75 -1
  227. package/dist/utils/prototypes.js +5 -1
  228. package/dist/utils/regexp.js +7 -1
  229. package/dist/utils/resolveObjectPath.js +5 -1
  230. package/dist/utils/setNativeValue.js +17 -1
  231. package/dist/utils/slugify.js +7 -1
  232. package/dist/utils/validators/emailValidator.js +8 -1
  233. package/dist/utils/validators/requiredValidator.js +7 -1
  234. package/dist/utils/validators/rutValidator.js +25 -1
  235. package/dist/utils/validators.js +57 -1
  236. package/package.json +153 -69
  237. package/src/AppAsyncWrapper.tsx +42 -0
  238. package/src/AppWrapper.tsx +45 -0
  239. package/src/DASHAdmin.tsx +501 -0
  240. package/src/RoutingWrapper.tsx +139 -0
  241. package/src/classes/DASHStorageClass.tsx +8 -0
  242. package/src/components/Input/RichTextField.tsx +27 -0
  243. package/src/components/Redirect.tsx +46 -0
  244. package/src/components/avatar/Avatar.tsx +67 -0
  245. package/src/components/avatar/SingleImageUploader.tsx +53 -0
  246. package/src/components/currency/Format.tsx +77 -0
  247. package/src/components/custom/Redirect.tsx +23 -0
  248. package/src/components/error/Error.tsx +168 -0
  249. package/src/components/geocoding/GeocodingField.tsx +167 -0
  250. package/src/components/i18n/BridgedLocalesMenuButton.tsx +159 -0
  251. package/src/components/i18n/LangSwitcher.tsx +204 -0
  252. package/src/components/loader/GlobalLoader.tsx +56 -0
  253. package/src/components/logs/LogFile.tsx +88 -0
  254. package/src/components/logs/LogFileById.tsx +68 -0
  255. package/src/components/logs/LogViewer.tsx +43 -0
  256. package/src/components/menu/AppMenu.tsx +22 -0
  257. package/src/components/menu/CustomMenuItemLink.tsx +61 -0
  258. package/src/components/menu/DarkToggleMode.tsx +65 -0
  259. package/src/components/menu/LanguageToggleMode.tsx +120 -0
  260. package/src/components/misc/CustomImageInput.tsx +62 -0
  261. package/src/components/misc/DASHGlobalErrorHandler.tsx +194 -0
  262. package/src/components/misc/DarkModeSwitcher.tsx +112 -0
  263. package/src/components/misc/LanguageSwitcher.tsx +199 -0
  264. package/src/components/misc/MUIHtmlToolTip.tsx +15 -0
  265. package/src/components/misc/MuiSimpleJsonTable.tsx +279 -0
  266. package/src/components/misc/MultiLevelTable.tsx +229 -0
  267. package/src/components/misc/NoResults.tsx +25 -0
  268. package/src/components/misc/PDFViewer.tsx +85 -0
  269. package/src/components/navigation/Breadcrumbs.tsx +220 -0
  270. package/src/components/navigation/BreadcrumbsManager.tsx +310 -0
  271. package/src/components/navigation/index.tsx +5 -0
  272. package/src/components/panel/Error.tsx +168 -0
  273. package/src/components/permission/AvailablePermissionsContext.tsx +173 -0
  274. package/src/components/permission/PermissionsSelector.tsx +819 -0
  275. package/src/components/permission/PermissionsSelectorList.tsx +468 -0
  276. package/src/components/permission/tsx +0 -0
  277. package/src/components/racustombuttons/CustomRAButton.tsx +87 -0
  278. package/src/components/racustombuttons/QuickButton.tsx +117 -0
  279. package/src/components/racustombuttons/QuickEditButton.tsx +115 -0
  280. package/src/components/racustombuttons/QuickIconButton.tsx +122 -0
  281. package/src/components/scrollbar/Scrollbar.tsx +31 -0
  282. package/src/components/selects/MultiSelect.tsx +53 -0
  283. package/src/components/selects/RASearchableSelect.tsx +279 -0
  284. package/src/components/selects/RASearchableSelectChips.tsx +304 -0
  285. package/src/components/selects/SearchableSelect.tsx +135 -0
  286. package/src/components/subscription/BillingCycleSelectInput.tsx +68 -0
  287. package/src/components/subscription/PlanAddonsSettings.tsx +522 -0
  288. package/src/components/subscription/PlanAuditLog.tsx +439 -0
  289. package/src/components/subscription/PlanFeaturesSettings.tsx +223 -0
  290. package/src/components/subscription/PlanLimitsSettings.tsx +230 -0
  291. package/src/components/subscription/PlanMetadataSettings.tsx +284 -0
  292. package/src/components/subscription/PlanPricesSettings.tsx +295 -0
  293. package/src/components/subscription/index.ts +7 -0
  294. package/src/components/svgelements/SvgLoading.tsx +229 -0
  295. package/src/components/svgelements/SvgLogo.tsx +53 -0
  296. package/src/components/svgelements/SvgLogoMin.tsx +64 -0
  297. package/src/components/svgelements/SvgShipping.tsx +673 -0
  298. package/src/components/tenant/AvailablePermissionsContext.tsx +0 -0
  299. package/src/components/tenant/TenantAttributes.tsx +153 -0
  300. package/src/components/tenant/TenantAttributesContext.tsx +163 -0
  301. package/src/components/tenant/TenantSelector.tsx +139 -0
  302. package/src/components/tenant/TenantSettings.tsx +172 -0
  303. package/src/components/tenant/TenantSettingsContext.tsx +165 -0
  304. package/src/components/tenant/TenantTheme.tsx +172 -0
  305. package/src/components/user/AvatarComponent.tsx +301 -0
  306. package/src/components/user/TenantAvatarComponent.tsx +99 -0
  307. package/src/components/user/UserPreferences.tsx +642 -0
  308. package/src/config/ACTIONS.tsx +26 -0
  309. package/src/config/ConstantsService.tsx +44 -0
  310. package/src/config/DASHAdminSystemConstants.tsx +182 -0
  311. package/src/config/PARSERS.tsx +9 -0
  312. package/src/contexts/DashQueryClientContext.tsx +113 -0
  313. package/src/contexts/DashResourceContext.tsx +34 -0
  314. package/src/contexts/I18nBridgeContext.tsx +156 -0
  315. package/src/contexts/I18nBridgeSetter.tsx +39 -0
  316. package/src/contexts/I18nReduxSync.tsx +27 -0
  317. package/src/contexts/SubscriptionPlanFormatsProvider.tsx +217 -0
  318. package/src/contexts/SystemRequestsCache.tsx +215 -0
  319. package/src/contexts/auth/AuthContext.tsx +553 -0
  320. package/src/contexts/auth/AuthContextLocalStorage.tsx +140 -0
  321. package/src/contexts/auth/DASHAuthenticationService.tsx +917 -0
  322. package/src/contexts/auth/WindowContext.tsx +15 -0
  323. package/src/contexts/auth/index.tsx +3 -0
  324. package/src/contexts/com/FCMContext.tsx +415 -0
  325. package/src/contexts/com/LaravelEchoContext.tsx +41 -0
  326. package/src/contexts/com/LaravelEchoMgr.tsx +155 -0
  327. package/src/contexts/com/components/DefaultNotificationComponent.tsx +20 -0
  328. package/src/contexts/com/components/NotificationAttributesTable.tsx +54 -0
  329. package/src/contexts/com/components/NotificationRenderer.tsx +42 -0
  330. package/src/contexts/com/components/NotificationsWidget.tsx +182 -0
  331. package/src/contexts/com/components/notificationFormats.tsx +50 -0
  332. package/src/contexts/com/useLaravelEcho.tsx +432 -0
  333. package/src/contexts/dictionary/DictionaryContext.tsx +94 -0
  334. package/src/default-theme/DASHAppProviders.tsx +117 -0
  335. package/src/default-theme/DashThemeContext.tsx +218 -0
  336. package/src/default-theme/DashThemeHelperProvider.tsx +98 -0
  337. package/src/default-theme/DomainAppLayout.tsx +166 -0
  338. package/src/default-theme/DomainHeader.tsx +162 -0
  339. package/src/default-theme/DomainTheme.tsx +59 -0
  340. package/src/default-theme/FullLayoutMarkup.tsx +250 -0
  341. package/src/default-theme/StaticLayout.tsx +47 -0
  342. package/src/default-theme/index.tsx +11 -0
  343. package/src/default-theme/menu/AppMaterialMenu.tsx +545 -0
  344. package/src/default-theme/menu/AppMenuComponents/SubmenuPortal.tsx +56 -0
  345. package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItem.tsx +254 -0
  346. package/src/default-theme/menu/AppMenuComponents/collapsed/CollapsedSidebarItems.tsx +31 -0
  347. package/src/default-theme/menu/AppMenuComponents/expanded/CollapsableSidebarMenu.tsx +276 -0
  348. package/src/default-theme/menu/AppMenuComponents/expanded/SidebarItem.tsx +91 -0
  349. package/src/default-theme/menu/AppMenuComponents/getItem.tsx +17 -0
  350. package/src/default-theme/menu/AppMenuComponents/interfaces.tsx +41 -0
  351. package/src/default-theme/menu/AppMenuComponents/submenuConstants.ts +85 -0
  352. package/src/default-theme/menu/AppSidebarMaterial.tsx +339 -0
  353. package/src/default-theme/menu/SidebarActions.tsx +84 -0
  354. package/src/default-theme/updateDomCssVariables.tsx +176 -0
  355. package/src/helpers/checkRole.tsx +66 -0
  356. package/src/helpers/parseAxiosError.tsx +41 -0
  357. package/src/hooks/audio/useAudio.tsx +39 -0
  358. package/src/hooks/axios.tsx +62 -0
  359. package/src/hooks/data/useDashboardStats.tsx +65 -0
  360. package/src/hooks/data/usePackageByClientsStats.tsx +44 -0
  361. package/src/hooks/data/usePackageByCommunesStats.tsx +44 -0
  362. package/src/hooks/data/usePackageStats.tsx +69 -0
  363. package/src/hooks/data/usePackageWithdrawDetails.tsx +61 -0
  364. package/src/hooks/data/useStats.tsx +86 -0
  365. package/src/hooks/isCurrentPath.tsx +22 -0
  366. package/src/hooks/notifications/WSMessagesManager.tsx +152 -0
  367. package/src/hooks/notifications/WSPusherManager.tsx +92 -0
  368. package/src/hooks/useBreadcrumbs.tsx +329 -0
  369. package/src/hooks/useClickOutside.tsx +17 -0
  370. package/src/hooks/useFormPersistance.tsx +150 -0
  371. package/src/hooks/useGlobalErrorMediator.tsx +43 -0
  372. package/src/hooks/useGlobalLoaderMgr.tsx +21 -0
  373. package/src/hooks/useHash.tsx +27 -0
  374. package/src/hooks/useLocalStorage.tsx +196 -0
  375. package/src/hooks/usePolyglotTranslation.tsx +62 -0
  376. package/src/hooks/usePrevious.tsx +9 -0
  377. package/src/hooks/usePrintSelected.tsx +37 -0
  378. package/src/hooks/useVirtualHash.tsx +33 -0
  379. package/src/hooks/window/useWindowSize.tsx +36 -0
  380. package/src/index.tsx +110 -0
  381. package/src/interfaces/IAppResourceConfig.tsx +20 -0
  382. package/src/interfaces/Log.tsx +16 -0
  383. package/src/interfaces/Tenant.tsx +25 -0
  384. package/src/interfaces/communication/IActions.tsx +5 -0
  385. package/src/interfaces/communication/INotification.tsx +21 -0
  386. package/src/interfaces/communication/IPayload.tsx +3 -0
  387. package/src/interfaces/communication/IRequestAction.tsx +10 -0
  388. package/src/interfaces/communication/IRequestPayload.tsx +7 -0
  389. package/src/interfaces/communication/IResponseAction.tsx +7 -0
  390. package/src/interfaces/misc/IAny.tsx +3 -0
  391. package/src/interfaces/misc/IFlashMessage.tsx +10 -0
  392. package/src/interfaces/navigation/IAppMenu.ts +14 -0
  393. package/src/interfaces/navigation/ICollapsableSidebarMenu.ts +12 -0
  394. package/src/interfaces/navigation/IMenuItem.ts +16 -0
  395. package/src/interfaces/notifications/IModel.tsx +6 -0
  396. package/src/interfaces/notifications/IModelField.tsx +8 -0
  397. package/src/interfaces/notifications/IUserNotification.tsx +12 -0
  398. package/src/interfaces/notifications/IUserNotificationData.tsx +13 -0
  399. package/src/interfaces/notifications/IUserNotificationPayload.tsx +8 -0
  400. package/src/interfaces/user/IGetAuth.tsx +92 -0
  401. package/src/interfaces/user/ITenantSettings.tsx +3 -0
  402. package/src/interfaces/user/IUser.tsx +60 -0
  403. package/src/interfaces/user/IUserSettings.tsx +43 -0
  404. package/src/interfaces.tsx +6 -0
  405. package/src/layout/AppLayout.tsx +112 -0
  406. package/src/layout/ApplicationLayout.tsx +197 -0
  407. package/src/layout/MotionWrapper.original.tsx +236 -0
  408. package/src/layout/MotionWrapper.tsx +236 -0
  409. package/src/layout/ResourceMenu.tsx +164 -0
  410. package/src/layout/ResoureLayout.tsx +105 -0
  411. package/src/layout/TransitionWrapper.tsx +125 -0
  412. package/src/pages/ChangePassword.tsx +179 -0
  413. package/src/pages/DASHLanding.tsx +22 -0
  414. package/src/pages/DASHLightWeightLogin.tsx +610 -0
  415. package/src/pages/DASHSimpleLogin.tsx +260 -0
  416. package/src/pages/Login.tsx +111 -0
  417. package/src/pages/Profile.tsx +394 -0
  418. package/src/pages/RecoverPassword.tsx +166 -0
  419. package/src/pages/SingleImageUploader.tsx +55 -0
  420. package/src/pages/VerifyAccount.tsx +128 -0
  421. package/src/providers/authProvider.tsx +210 -0
  422. package/src/providers/dataProvider.tsx +672 -0
  423. package/src/providers/i18n/en.ts +533 -0
  424. package/src/providers/i18n/es.ts +539 -0
  425. package/src/providers/i18n/languages.tsx +5 -0
  426. package/src/providers/i18nProvider.tsx +23 -0
  427. package/src/react-admin-dash/RADashComponent.tsx +240 -0
  428. package/src/react-admin-dash/Resource.tsx +77 -0
  429. package/src/resources/Brand/BrandResource.tsx +130 -0
  430. package/src/resources/DASHResourceLoader.ts +180 -0
  431. package/src/resources/Log/LogResource.tsx +73 -0
  432. package/src/resources/Tenant/ImpersonateTenantResource.tsx +113 -0
  433. package/src/resources/Trash/TrashTemplate.tsx +180 -0
  434. package/src/resources.tsx +280 -0
  435. package/src/schemas/log.tsx +45 -0
  436. package/src/schemas/notification.tsx +42 -0
  437. package/src/schemas/permissions.tsx +44 -0
  438. package/src/schemas/roles.tsx +48 -0
  439. package/src/schemas/rolesDataGrid.tsx +48 -0
  440. package/src/schemas/subscription/components/SubscriptionActions.tsx +153 -0
  441. package/src/schemas/subscription/components/SubscriptionPaymentHistory.tsx +120 -0
  442. package/src/schemas/subscription/components/SubscriptionPlanFeatures.tsx +155 -0
  443. package/src/schemas/subscription/components/SubscriptionPlanPreview.tsx +128 -0
  444. package/src/schemas/subscription/components/SubscriptionPlanStats.tsx +268 -0
  445. package/src/schemas/subscription/components/SubscriptionStatusIndicator.tsx +72 -0
  446. package/src/schemas/subscription/subscriptionPlanSchema.tsx +185 -0
  447. package/src/schemas/subscription/subscriptionSchema.tsx +152 -0
  448. package/src/schemas/subscriptionPlan.ts +422 -0
  449. package/src/schemas/tenant.tsx +129 -0
  450. package/src/schemas/tenantUser.tsx +96 -0
  451. package/src/schemas/tenant_superadmin.tsx +119 -0
  452. package/src/schemas/user.tsx +26 -0
  453. package/src/systemResources.old.tsx +928 -0
  454. package/src/systemResources.tsx +1135 -0
  455. package/src/templates/ResourceTemplate.tsx +240 -0
  456. package/src/templates/ResourceTemplateCreate.tsx +167 -0
  457. package/src/templates/ResourceTemplateEdit.tsx +176 -0
  458. package/src/templates/ResourceTemplateFull.tsx +581 -0
  459. package/src/templates/ResourceTemplateList.tsx +340 -0
  460. package/src/templates/ResourceTemplateShow.tsx +88 -0
  461. package/src/templates/TrashTemplate.tsx +179 -0
  462. package/src/tenantResources.tsx +223 -0
  463. package/src/test_portal_bubbles.tsx +40 -0
  464. package/src/theme/AppHeader.tsx +52 -0
  465. package/src/theme/AppLayoutSetting.tsx +33 -0
  466. package/src/theme/AppLogo.tsx +13 -0
  467. package/src/theme/AppSidebar.tsx +12 -0
  468. package/src/theme/AppSidebarContent.tsx +105 -0
  469. package/src/theme/AppSidebarLogo.tsx +48 -0
  470. package/src/theme/components/PageTitle.tsx +37 -0
  471. package/src/utils/cache/CacheInvalidatorContext.tsx +125 -0
  472. package/src/utils/cache/CacheInvalidatorListenerComponent.tsx +10 -0
  473. package/src/utils/cache/useCacheInvalidatorListener.tsx +27 -0
  474. package/src/utils/convertFileToBase64.tsx +9 -0
  475. package/src/utils/convertToFile.tsx +14 -0
  476. package/src/utils/cookies.tsx +33 -0
  477. package/src/utils/dashDefaultQueryClient.tsx +34 -0
  478. package/src/utils/dataUrlToBlob.tsx +30 -0
  479. package/src/utils/deepReplace.tsx +19 -0
  480. package/src/utils/getProfileMenu.tsx +41 -0
  481. package/src/utils/getTenantSettings.tsx +9 -0
  482. package/src/utils/getType.tsx +8 -0
  483. package/src/utils/getUserSettings.tsx +8 -0
  484. package/src/utils/hasCode.tsx +14 -0
  485. package/src/utils/index.ts +19 -0
  486. package/src/utils/injectTenantStyles.ts +28 -0
  487. package/src/utils/isComponent.tsx +45 -0
  488. package/src/utils/navEvents.tsx +91 -0
  489. package/src/utils/prototypes.tsx +5 -0
  490. package/src/utils/regexp.tsx +4 -0
  491. package/src/utils/resolveObjectPath.tsx +4 -0
  492. package/src/utils/setNativeValue.tsx +24 -0
  493. package/src/utils/slugify.tsx +11 -0
  494. package/src/utils/validators/emailValidator.tsx +6 -0
  495. package/src/utils/validators/requiredValidator.tsx +5 -0
  496. package/src/utils/validators/rutValidator.tsx +31 -0
  497. package/src/utils/validators.tsx +96 -0
  498. package/dist/ChangePassword-DmWAQAX_.js +0 -152
  499. package/dist/Login-t41HMhVT.js +0 -101
  500. package/dist/Profile-By-gdPUd.js +0 -294
  501. package/dist/RecoverPassword-DzPdbkg2.js +0 -149
  502. package/dist/VerifyAccount-Bofaxe5w.js +0 -99
  503. package/dist/index-gfebuoyf.js +0 -21614
  504. /package/dist/{components/permission/tsx → declarations.d.js} +0 -0
  505. /package/{dist → src}/DASHAdmin.tsx.old +0 -0
  506. /package/{dist → src}/declarations.d.ts +0 -0
  507. /package/{dist → src}/default-theme/DashThemeContext.tsx.fast +0 -0
  508. /package/{dist → src}/default-theme/DashThemeContext.tsx.old +0 -0
  509. /package/{dist → src}/templates/ResourceTemplate.tsx.memoized_experiment +0 -0
  510. /package/{dist → src}/templates/ResourceTemplate.tsx.original +0 -0
  511. /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();