@dashadmin/dash-admin 1.3.72 → 1.3.74-srcfree.1

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