@jmruthers/pace-core 0.5.46 → 0.5.48

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 (125) hide show
  1. package/dist/{DataTable-CBZ4FWLB.js → DataTable-HEKRWAIY.js} +5 -5
  2. package/dist/{chunk-YOMT5BFG.js → chunk-B7SEFA3N.js} +2 -2
  3. package/dist/{chunk-UK5BMO5B.js → chunk-I74GLRTW.js} +3 -3
  4. package/dist/{chunk-QGIMHNFE.js → chunk-I75UJB4H.js} +3 -3
  5. package/dist/{chunk-ZK26ZQ3P.js → chunk-LM3Y67VN.js} +3 -3
  6. package/dist/{chunk-RZZ4U2VB.js → chunk-NN2FBCPX.js} +3 -3
  7. package/dist/{chunk-YJ7MYXN4.js → chunk-OYGUYTFO.js} +2 -2
  8. package/dist/{chunk-TCPMEL3C.js → chunk-PVBQU2PL.js} +22 -3
  9. package/dist/chunk-PVBQU2PL.js.map +1 -0
  10. package/dist/{chunk-VW4YRTVX.js → chunk-S6DAOMOC.js} +43 -11
  11. package/dist/{chunk-VW4YRTVX.js.map → chunk-S6DAOMOC.js.map} +1 -1
  12. package/dist/{chunk-WUCWNFHS.js → chunk-VFRMH3YO.js} +5 -5
  13. package/dist/{chunk-YAACZXDE.js → chunk-VSGY52OL.js} +4 -4
  14. package/dist/components.js +7 -7
  15. package/dist/hooks.js +4 -4
  16. package/dist/index.js +10 -10
  17. package/dist/providers.js +3 -3
  18. package/dist/rbac/index.js +5 -5
  19. package/dist/utils.js +1 -1
  20. package/docs/api/classes/ErrorBoundary.md +1 -1
  21. package/docs/api/classes/InvalidScopeError.md +1 -1
  22. package/docs/api/classes/MissingUserContextError.md +1 -1
  23. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  24. package/docs/api/classes/PermissionDeniedError.md +1 -1
  25. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  26. package/docs/api/classes/RBACAuditManager.md +1 -1
  27. package/docs/api/classes/RBACCache.md +1 -1
  28. package/docs/api/classes/RBACEngine.md +1 -1
  29. package/docs/api/classes/RBACError.md +1 -1
  30. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  31. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  32. package/docs/api/interfaces/AggregateConfig.md +1 -1
  33. package/docs/api/interfaces/ButtonProps.md +1 -1
  34. package/docs/api/interfaces/CardProps.md +1 -1
  35. package/docs/api/interfaces/ColorPalette.md +1 -1
  36. package/docs/api/interfaces/ColorShade.md +1 -1
  37. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  38. package/docs/api/interfaces/DataTableAction.md +1 -1
  39. package/docs/api/interfaces/DataTableColumn.md +1 -1
  40. package/docs/api/interfaces/DataTableProps.md +1 -1
  41. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  42. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  43. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  44. package/docs/api/interfaces/EventContextType.md +1 -1
  45. package/docs/api/interfaces/EventLogoProps.md +1 -1
  46. package/docs/api/interfaces/EventProviderProps.md +1 -1
  47. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  48. package/docs/api/interfaces/FileUploadProps.md +1 -1
  49. package/docs/api/interfaces/FooterProps.md +1 -1
  50. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  51. package/docs/api/interfaces/InputProps.md +1 -1
  52. package/docs/api/interfaces/LabelProps.md +1 -1
  53. package/docs/api/interfaces/LoginFormProps.md +1 -1
  54. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  55. package/docs/api/interfaces/NavigationContextType.md +1 -1
  56. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  57. package/docs/api/interfaces/NavigationItem.md +1 -1
  58. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  59. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  60. package/docs/api/interfaces/Organisation.md +1 -1
  61. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  62. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  63. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  64. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  65. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  66. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  67. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  68. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  69. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  70. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  71. package/docs/api/interfaces/PaletteData.md +1 -1
  72. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  73. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  74. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  75. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  76. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  77. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  78. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  79. package/docs/api/interfaces/RBACConfig.md +1 -1
  80. package/docs/api/interfaces/RBACContextType.md +1 -1
  81. package/docs/api/interfaces/RBACLogger.md +1 -1
  82. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  83. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  84. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  85. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  86. package/docs/api/interfaces/RouteConfig.md +1 -1
  87. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  88. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  89. package/docs/api/interfaces/StorageConfig.md +1 -1
  90. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  91. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  92. package/docs/api/interfaces/StorageListOptions.md +1 -1
  93. package/docs/api/interfaces/StorageListResult.md +1 -1
  94. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  95. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  96. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  97. package/docs/api/interfaces/StyleImport.md +1 -1
  98. package/docs/api/interfaces/ToastActionElement.md +1 -1
  99. package/docs/api/interfaces/ToastProps.md +1 -1
  100. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  101. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  102. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  103. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  104. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  105. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  106. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  107. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  108. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  109. package/docs/api/interfaces/UserEventAccess.md +1 -1
  110. package/docs/api/interfaces/UserMenuProps.md +1 -1
  111. package/docs/api/interfaces/UserProfile.md +1 -1
  112. package/docs/api/modules.md +3 -3
  113. package/package.json +1 -1
  114. package/src/providers/EventProvider.tsx +21 -2
  115. package/src/providers/OrganisationProvider.tsx +48 -11
  116. package/dist/chunk-TCPMEL3C.js.map +0 -1
  117. /package/dist/{DataTable-CBZ4FWLB.js.map → DataTable-HEKRWAIY.js.map} +0 -0
  118. /package/dist/{chunk-YOMT5BFG.js.map → chunk-B7SEFA3N.js.map} +0 -0
  119. /package/dist/{chunk-UK5BMO5B.js.map → chunk-I74GLRTW.js.map} +0 -0
  120. /package/dist/{chunk-QGIMHNFE.js.map → chunk-I75UJB4H.js.map} +0 -0
  121. /package/dist/{chunk-ZK26ZQ3P.js.map → chunk-LM3Y67VN.js.map} +0 -0
  122. /package/dist/{chunk-RZZ4U2VB.js.map → chunk-NN2FBCPX.js.map} +0 -0
  123. /package/dist/{chunk-YJ7MYXN4.js.map → chunk-OYGUYTFO.js.map} +0 -0
  124. /package/dist/{chunk-WUCWNFHS.js.map → chunk-VFRMH3YO.js.map} +0 -0
  125. /package/dist/{chunk-YAACZXDE.js.map → chunk-VSGY52OL.js.map} +0 -0
@@ -32,11 +32,11 @@ import {
32
32
  useDataTableContext,
33
33
  usePluginRegistry,
34
34
  useStateManager
35
- } from "./chunk-QGIMHNFE.js";
36
- import "./chunk-UK5BMO5B.js";
35
+ } from "./chunk-I75UJB4H.js";
36
+ import "./chunk-I74GLRTW.js";
37
37
  import "./chunk-GWSBHC4J.js";
38
38
  import "./chunk-7BNPOCLL.js";
39
- import "./chunk-TCPMEL3C.js";
39
+ import "./chunk-PVBQU2PL.js";
40
40
  import {
41
41
  DataChunkManager,
42
42
  SearchIndex,
@@ -48,7 +48,7 @@ import {
48
48
  throttle,
49
49
  useDataTablePerformance
50
50
  } from "./chunk-SS3E6QLB.js";
51
- import "./chunk-VW4YRTVX.js";
51
+ import "./chunk-S6DAOMOC.js";
52
52
  import "./chunk-YDJW5XTN.js";
53
53
  import "./chunk-MZBUOP4P.js";
54
54
  import "./chunk-WJARTBCT.js";
@@ -97,4 +97,4 @@ export {
97
97
  usePluginRegistry,
98
98
  useStateManager
99
99
  };
100
- //# sourceMappingURL=DataTable-CBZ4FWLB.js.map
100
+ //# sourceMappingURL=DataTable-HEKRWAIY.js.map
@@ -3,7 +3,7 @@ import {
3
3
  init_UnifiedAuthProvider,
4
4
  useOrganisations,
5
5
  useUnifiedAuth
6
- } from "./chunk-VW4YRTVX.js";
6
+ } from "./chunk-S6DAOMOC.js";
7
7
  import {
8
8
  init_organisationContext,
9
9
  setOrganisationContext
@@ -379,4 +379,4 @@ function useSecureDataAccess() {
379
379
  export {
380
380
  useSecureDataAccess
381
381
  };
382
- //# sourceMappingURL=chunk-YOMT5BFG.js.map
382
+ //# sourceMappingURL=chunk-B7SEFA3N.js.map
@@ -7,13 +7,13 @@ import {
7
7
  import {
8
8
  init_EventProvider,
9
9
  useEvents
10
- } from "./chunk-TCPMEL3C.js";
10
+ } from "./chunk-PVBQU2PL.js";
11
11
  import {
12
12
  init_OrganisationProvider,
13
13
  init_UnifiedAuthProvider,
14
14
  useOrganisations,
15
15
  useUnifiedAuth
16
- } from "./chunk-VW4YRTVX.js";
16
+ } from "./chunk-S6DAOMOC.js";
17
17
 
18
18
  // src/rbac/hooks/useRBAC.ts
19
19
  init_UnifiedAuthProvider();
@@ -506,4 +506,4 @@ export {
506
506
  useHasAllPermissions,
507
507
  useCachedPermissions
508
508
  };
509
- //# sourceMappingURL=chunk-UK5BMO5B.js.map
509
+ //# sourceMappingURL=chunk-I74GLRTW.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useCan
3
- } from "./chunk-UK5BMO5B.js";
3
+ } from "./chunk-I74GLRTW.js";
4
4
  import {
5
5
  useDataTablePerformance
6
6
  } from "./chunk-SS3E6QLB.js";
@@ -14,7 +14,7 @@ import {
14
14
  init_Button,
15
15
  init_UnifiedAuthProvider,
16
16
  useUnifiedAuth
17
- } from "./chunk-VW4YRTVX.js";
17
+ } from "./chunk-S6DAOMOC.js";
18
18
  import {
19
19
  getCurrentAppName,
20
20
  init_appNameResolver
@@ -5584,4 +5584,4 @@ export {
5584
5584
  GroupHeader,
5585
5585
  EditableRow
5586
5586
  };
5587
- //# sourceMappingURL=chunk-QGIMHNFE.js.map
5587
+ //# sourceMappingURL=chunk-I75UJB4H.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  usePublicPageContext
3
- } from "./chunk-YJ7MYXN4.js";
3
+ } from "./chunk-OYGUYTFO.js";
4
4
  import {
5
5
  init_OrganisationProvider,
6
6
  init_UnifiedAuthProvider,
7
7
  useOrganisations,
8
8
  useUnifiedAuth
9
- } from "./chunk-VW4YRTVX.js";
9
+ } from "./chunk-S6DAOMOC.js";
10
10
 
11
11
  // src/hooks/useOrganisationPermissions.ts
12
12
  init_OrganisationProvider();
@@ -519,4 +519,4 @@ export {
519
519
  generatePublicRoutePath,
520
520
  extractEventCodeFromPath
521
521
  };
522
- //# sourceMappingURL=chunk-ZK26ZQ3P.js.map
522
+ //# sourceMappingURL=chunk-LM3Y67VN.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  init_EventProvider
3
- } from "./chunk-TCPMEL3C.js";
3
+ } from "./chunk-PVBQU2PL.js";
4
4
  import {
5
5
  init_AuthProvider,
6
6
  init_InactivityProvider,
7
7
  init_OrganisationProvider,
8
8
  init_UnifiedAuthProvider
9
- } from "./chunk-VW4YRTVX.js";
9
+ } from "./chunk-S6DAOMOC.js";
10
10
 
11
11
  // src/providers/index.ts
12
12
  init_EventProvider();
@@ -14,4 +14,4 @@ init_OrganisationProvider();
14
14
  init_UnifiedAuthProvider();
15
15
  init_AuthProvider();
16
16
  init_InactivityProvider();
17
- //# sourceMappingURL=chunk-RZZ4U2VB.js.map
17
+ //# sourceMappingURL=chunk-NN2FBCPX.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  init_UnifiedAuthProvider,
3
3
  useUnifiedAuth
4
- } from "./chunk-VW4YRTVX.js";
4
+ } from "./chunk-S6DAOMOC.js";
5
5
 
6
6
  // src/components/PublicLayout/PublicErrorBoundary.tsx
7
7
  import React, { Component } from "react";
@@ -386,4 +386,4 @@ export {
386
386
  clearPublicLogoCache,
387
387
  getPublicLogoCacheStats
388
388
  };
389
- //# sourceMappingURL=chunk-YJ7MYXN4.js.map
389
+ //# sourceMappingURL=chunk-OYGUYTFO.js.map
@@ -3,7 +3,7 @@ import {
3
3
  init_UnifiedAuthProvider,
4
4
  useOrganisations,
5
5
  useUnifiedAuth
6
- } from "./chunk-VW4YRTVX.js";
6
+ } from "./chunk-S6DAOMOC.js";
7
7
  import {
8
8
  DebugLogger,
9
9
  init_debugLogger,
@@ -155,6 +155,12 @@ function EventProvider({ children }) {
155
155
  }
156
156
  if (isMounted) {
157
157
  const eventsData = data || [];
158
+ console.log("[EventProvider] Loaded events:", eventsData.map((event) => ({
159
+ eventId: event.event_id,
160
+ eventName: event.event_name,
161
+ organisationId: event.organisation_id,
162
+ selectedOrganisationId: selectedOrganisation?.id
163
+ })));
158
164
  setEvents(eventsData);
159
165
  setError(null);
160
166
  hasAutoSelectedRef.current = false;
@@ -201,11 +207,24 @@ function EventProvider({ children }) {
201
207
  const setSelectedEvent = useCallback((event) => {
202
208
  if (event) {
203
209
  try {
210
+ console.log("[EventProvider] Event selection validation:", {
211
+ eventId: event.event_id,
212
+ eventName: event.event_name,
213
+ eventOrganisationId: event.organisation_id,
214
+ selectedOrganisationId: selectedOrganisation?.id,
215
+ selectedOrganisationName: selectedOrganisation?.display_name,
216
+ match: event.organisation_id === selectedOrganisation?.id
217
+ });
204
218
  if (selectedOrganisation && event.organisation_id !== selectedOrganisation.id) {
205
- console.error("[EventProvider] Event organisation_id does not match selected organisation");
219
+ console.error("[EventProvider] Event organisation_id does not match selected organisation", {
220
+ eventOrganisationId: event.organisation_id,
221
+ selectedOrganisationId: selectedOrganisation.id,
222
+ eventName: event.event_name
223
+ });
206
224
  return;
207
225
  }
208
226
  } catch (error2) {
227
+ console.error("[EventProvider] Error during event validation:", error2);
209
228
  }
210
229
  setSelectedEventState(event);
211
230
  setSelectedEventId(event.event_id);
@@ -261,4 +280,4 @@ export {
261
280
  EventProvider_exports,
262
281
  init_EventProvider
263
282
  };
264
- //# sourceMappingURL=chunk-TCPMEL3C.js.map
283
+ //# sourceMappingURL=chunk-PVBQU2PL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/EventProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useEffect,\n useLayoutEffect,\n useCallback,\n useRef,\n useMemo,\n} from 'react';\nimport { useUnifiedAuth } from './UnifiedAuthProvider';\nimport { useOrganisations } from './OrganisationProvider';\nimport { setOrganisationContext } from '../utils/organisationContext';\nimport { DebugLogger } from '../utils/debugLogger';\n\nimport { Event } from '../types/unified';\n\nexport interface EventContextType {\n events: Event[];\n selectedEvent: Event | null;\n isLoading: boolean;\n error: Error | null;\n setSelectedEvent: (event: Event | null) => void;\n refreshEvents: () => Promise<void>;\n}\n\nconst EventContext = createContext<EventContextType | undefined>(undefined);\n\nexport const useEvents = () => {\n const context = useContext(EventContext);\n if (context === undefined) {\n throw new Error('useEvents must be used within an EventProvider');\n }\n return context;\n};\n\nexport interface EventProviderProps {\n children: React.ReactNode;\n}\n\n// Helper function to get the next event by date\nfunction getNextEventByDate(events: Event[]): Event | null {\n if (!events || events.length === 0) {\n return null;\n }\n\n const now = new Date();\n const futureEvents = events.filter(event => {\n if (!event.event_date) return false;\n const eventDate = new Date(event.event_date);\n return eventDate >= now;\n });\n\n if (futureEvents.length === 0) {\n return null;\n }\n\n // Sort by date (ascending) to get the next event\n const sortedFutureEvents = futureEvents.sort((a, b) => {\n const dateA = new Date(a.event_date!);\n const dateB = new Date(b.event_date!);\n return dateA.getTime() - dateB.getTime();\n });\n\n return sortedFutureEvents[0];\n}\n\nexport function EventProvider({ children }: EventProviderProps) {\n const [events, setEvents] = useState<Event[]>([]);\n const [selectedEvent, setSelectedEventState] = useState<Event | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const { user, session, supabase, appName, setSelectedEventId } = useUnifiedAuth();\n \n // Refs to prevent infinite loops\n const isInitializedRef = useRef(false);\n const isFetchingRef = useRef(false);\n const hasAutoSelectedRef = useRef(false);\n const userClearedEventRef = useRef(false);\n const setSelectedEventIdRef = useRef(setSelectedEventId);\n \n // Try to get organisation context, but don't fail if not available\n let selectedOrganisation = null;\n let ensureOrganisationContext = null;\n \n try {\n const orgContext = useOrganisations();\n selectedOrganisation = orgContext.selectedOrganisation;\n ensureOrganisationContext = orgContext.ensureOrganisationContext;\n } catch (error) {\n console.warn('[EventProvider] Organisation context not available:', error);\n }\n\n // Load persisted event selection with tab-scoped storage\n const loadPersistedEvent = useCallback(async (events: Event[]) => {\n try {\n // Try sessionStorage first (tab-specific)\n let persistedEventId = sessionStorage.getItem('pace-core-selected-event');\n \n // Fallback to localStorage if no sessionStorage value (for new tabs)\n if (!persistedEventId) {\n persistedEventId = localStorage.getItem('pace-core-selected-event');\n // If we found a value in localStorage, also store it in sessionStorage for this tab\n if (persistedEventId) {\n sessionStorage.setItem('pace-core-selected-event', persistedEventId);\n }\n }\n \n if (persistedEventId && events.length > 0) {\n const persistedEvent = events.find(event => event.event_id === persistedEventId);\n if (persistedEvent) {\n DebugLogger.log('EventProvider', 'Restoring persisted event:', persistedEvent.event_name);\n setSelectedEventState(persistedEvent);\n setSelectedEventId(persistedEventId);\n return true;\n }\n }\n } catch (error) {\n console.warn('[EventProvider] Failed to load persisted event:', error);\n }\n return false;\n }, [setSelectedEventId]);\n\n // Persist event selection with tab-scoped storage\n const persistEventSelection = useCallback((eventId: string) => {\n try {\n // Store in sessionStorage for tab-specific persistence\n sessionStorage.setItem('pace-core-selected-event', eventId);\n // Also store in localStorage as fallback for new tabs\n localStorage.setItem('pace-core-selected-event', eventId);\n } catch (error) {\n console.warn('[EventProvider] Failed to persist event selection:', error);\n }\n }, []);\n\n // Auto-select next event\n const autoSelectNextEvent = useCallback((events: Event[]) => {\n const nextEvent = getNextEventByDate(events);\n if (nextEvent) {\n DebugLogger.log('EventProvider', 'Auto-selecting next event:', nextEvent.event_name);\n setSelectedEventState(nextEvent);\n setSelectedEventId(nextEvent.event_id);\n persistEventSelection(nextEvent.event_id);\n }\n }, [setSelectedEventId, persistEventSelection]);\n\n // Main fetch function\n const fetchEvents = useCallback(async () => {\n if (!user || !session || !supabase || !appName || !selectedOrganisation) {\n DebugLogger.log('EventProvider', 'Missing required dependencies, skipping fetch');\n setIsLoading(false);\n return;\n }\n\n // Prevent multiple simultaneous fetches\n if (isFetchingRef.current) {\n DebugLogger.log('EventProvider', 'Already fetching events, skipping');\n return;\n }\n\n DebugLogger.log('EventProvider', 'User and organisation found, fetching events for:', {\n userId: user.id,\n appName: appName,\n organisationId: selectedOrganisation.id,\n organisationName: selectedOrganisation.display_name\n });\n\n isFetchingRef.current = true;\n let isMounted = true;\n\n try {\n // Ensure organisation context is set\n if (ensureOrganisationContext) {\n await ensureOrganisationContext();\n await setOrganisationContext(supabase, selectedOrganisation.id);\n }\n\n // Resolve app name to app ID\n // Call the RPC function\n DebugLogger.log('EventProvider', 'Calling get_pace_user_events RPC with:', {\n user_id: user.id,\n org_id: selectedOrganisation.id\n });\n\n const response = await supabase.rpc('get_pace_user_events', {\n user_id: user.id,\n org_id: selectedOrganisation.id,\n });\n \n const { data, error: rpcError } = response || {};\n\n DebugLogger.log('EventProvider', 'RPC response:', {\n data,\n error: rpcError,\n dataLength: data?.length || 0,\n organisationId: selectedOrganisation.id\n });\n\n if (rpcError) {\n throw new Error(rpcError.message || 'Failed to fetch events');\n }\n\n if (isMounted) {\n const eventsData = data || [];\n console.log('[EventProvider] Loaded events:', eventsData.map((event: any) => ({\n eventId: event.event_id,\n eventName: event.event_name,\n organisationId: event.organisation_id,\n selectedOrganisationId: selectedOrganisation?.id\n })));\n setEvents(eventsData);\n setError(null);\n\n // Note: Event colors are now managed by useEventTheme hook based on route and selected event\n // This prevents unwanted color cycling on non-event pages\n\n // Reset auto-selection ref for new events\n hasAutoSelectedRef.current = false;\n\n // Try to restore persisted event first\n await loadPersistedEvent(eventsData);\n }\n } catch (err) {\n console.error('[EventProvider] Error fetching events:', err);\n const _error = err instanceof Error ? err : new Error('Unknown error occurred');\n \n if (isMounted) {\n setError(_error);\n setEvents([]);\n }\n } finally {\n if (isMounted) {\n setIsLoading(false);\n }\n isFetchingRef.current = false;\n }\n\n return () => {\n isMounted = false;\n };\n }, [user, session, supabase, appName, selectedOrganisation, ensureOrganisationContext, loadPersistedEvent, autoSelectNextEvent]);\n\n // Initialize events only once\n useEffect(() => {\n if (!isInitializedRef.current) {\n isInitializedRef.current = true;\n fetchEvents();\n }\n }, [fetchEvents]);\n\n // Update ref when setSelectedEventId changes\n useEffect(() => {\n setSelectedEventIdRef.current = setSelectedEventId;\n }, [setSelectedEventId]);\n\n // Auto-select next event when events are loaded and no event is selected\n useLayoutEffect(() => {\n if (events.length > 0 && !selectedEvent && !hasAutoSelectedRef.current && !userClearedEventRef.current) {\n const nextEvent = getNextEventByDate(events);\n if (nextEvent) {\n DebugLogger.log('EventProvider', 'Auto-selecting next event:', nextEvent.event_name);\n hasAutoSelectedRef.current = true;\n setSelectedEventState(nextEvent);\n setSelectedEventIdRef.current(nextEvent.event_id);\n persistEventSelection(nextEvent.event_id);\n }\n }\n }, [events, selectedEvent]);\n\n const setSelectedEvent = useCallback((event: Event | null) => {\n if (event) {\n // SECURITY: Validate event belongs to current organisation\n try {\n console.log('[EventProvider] Event selection validation:', {\n eventId: event.event_id,\n eventName: event.event_name,\n eventOrganisationId: event.organisation_id,\n selectedOrganisationId: selectedOrganisation?.id,\n selectedOrganisationName: selectedOrganisation?.display_name,\n match: event.organisation_id === selectedOrganisation?.id\n });\n \n if (selectedOrganisation && event.organisation_id !== selectedOrganisation.id) {\n console.error('[EventProvider] Event organisation_id does not match selected organisation', {\n eventOrganisationId: event.organisation_id,\n selectedOrganisationId: selectedOrganisation.id,\n eventName: event.event_name\n });\n return;\n }\n } catch (error) {\n console.error('[EventProvider] Error during event validation:', error);\n }\n\n setSelectedEventState(event);\n setSelectedEventId(event.event_id);\n persistEventSelection(event.event_id);\n // Reset the user cleared flag when selecting an event\n userClearedEventRef.current = false;\n } else {\n setSelectedEventState(null);\n setSelectedEventId(null);\n // Clear both sessionStorage and localStorage\n sessionStorage.removeItem('pace-core-selected-event');\n localStorage.removeItem('pace-core-selected-event');\n // Reset the auto-selection flag when clearing the event\n hasAutoSelectedRef.current = false;\n // Mark that user explicitly cleared the event to prevent auto-selection\n userClearedEventRef.current = true;\n }\n }, [selectedOrganisation, setSelectedEventId, persistEventSelection]);\n\n const refreshEvents = useCallback(async () => {\n isInitializedRef.current = false;\n isFetchingRef.current = false;\n // Reset the user cleared flag when refreshing events\n userClearedEventRef.current = false;\n await fetchEvents();\n }, [fetchEvents]);\n\n // Memoize the context value to prevent unnecessary re-renders\n const contextValue: EventContextType = useMemo(() => ({\n events,\n selectedEvent,\n isLoading,\n error,\n setSelectedEvent,\n refreshEvents,\n }), [events, selectedEvent, isLoading, error, setSelectedEvent, refreshEvents]);\n\n return (\n <EventContext.Provider value={contextValue}>\n {children}\n </EventContext.Provider>\n );\n}"],"mappings":"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","names":["error","events"]}
@@ -7289,7 +7289,7 @@ __export(OrganisationProvider_exports, {
7289
7289
  OrganisationProvider: () => OrganisationProvider,
7290
7290
  useOrganisations: () => useOrganisations
7291
7291
  });
7292
- import { createContext as createContext5, useContext as useContext5, useState as useState7, useEffect as useEffect7, useCallback as useCallback7, useMemo as useMemo6 } from "react";
7292
+ import { createContext as createContext5, useContext as useContext5, useState as useState7, useEffect as useEffect7, useCallback as useCallback7, useMemo as useMemo6, useRef as useRef2 } from "react";
7293
7293
  import { useNavigate } from "react-router-dom";
7294
7294
  import { jsx as jsx9, jsxs as jsxs5 } from "react/jsx-runtime";
7295
7295
  function OrganisationProvider({ children }) {
@@ -7301,6 +7301,9 @@ function OrganisationProvider({ children }) {
7301
7301
  const [error, setError] = useState7(null);
7302
7302
  const [isContextReady, setIsContextReady] = useState7(false);
7303
7303
  const [retryCount, setRetryCount] = useState7(0);
7304
+ const isLoadingRef = useRef2(false);
7305
+ const lastLoadTimeRef = useRef2(0);
7306
+ const hasFailedRef = useRef2(false);
7304
7307
  const { user, session, supabase, signOut } = useUnifiedAuth();
7305
7308
  let navigate = null;
7306
7309
  try {
@@ -7354,10 +7357,17 @@ function OrganisationProvider({ children }) {
7354
7357
  setError(null);
7355
7358
  return;
7356
7359
  }
7357
- if (isLoading) {
7358
- DebugLogger.log("OrganisationProvider", "Already loading, skipping duplicate load");
7360
+ if (isLoadingRef.current) {
7361
+ console.log("OrganisationProvider", "Already loading, skipping duplicate load");
7359
7362
  return;
7360
7363
  }
7364
+ const now = Date.now();
7365
+ if (now - lastLoadTimeRef.current < 2e3) {
7366
+ console.log("OrganisationProvider", "Too soon since last load, skipping");
7367
+ return;
7368
+ }
7369
+ lastLoadTimeRef.current = now;
7370
+ isLoadingRef.current = true;
7361
7371
  setIsLoading(true);
7362
7372
  setError(null);
7363
7373
  try {
@@ -7391,7 +7401,14 @@ function OrganisationProvider({ children }) {
7391
7401
  if (!memberships || memberships.length === 0) {
7392
7402
  throw new Error("User has no active organisation memberships");
7393
7403
  }
7404
+ console.log("[OrganisationProvider] All memberships data:", memberships);
7394
7405
  memberships.forEach((membership, index) => {
7406
+ console.log(`[OrganisationProvider] Membership ${index}:`, {
7407
+ organisation_id: membership.organisation_id,
7408
+ type: typeof membership.organisation_id,
7409
+ length: membership.organisation_id ? membership.organisation_id.length : "null/undefined",
7410
+ trimmed: membership.organisation_id ? membership.organisation_id.trim() : "null/undefined"
7411
+ });
7395
7412
  if (!membership.organisation_id || membership.organisation_id.trim() === "") {
7396
7413
  console.warn(`[OrganisationProvider] Membership ${index} has invalid organisation_id:`, membership);
7397
7414
  }
@@ -7417,7 +7434,17 @@ function OrganisationProvider({ children }) {
7417
7434
  throw new Error("No valid organisation IDs found in memberships");
7418
7435
  }
7419
7436
  DebugLogger.log("OrganisationProvider", "Valid organisation IDs:", organisationIds);
7420
- const cleanOrganisationIds = organisationIds.filter((id) => id && id.trim() !== "");
7437
+ console.log("[OrganisationProvider] Raw organisation IDs before cleaning:", organisationIds);
7438
+ console.log("[OrganisationProvider] Raw organisation IDs types:", organisationIds.map((id) => typeof id));
7439
+ console.log("[OrganisationProvider] Raw organisation IDs lengths:", organisationIds.map((id) => id ? id.length : "null/undefined"));
7440
+ const cleanOrganisationIds = organisationIds.filter((id) => {
7441
+ const isValid = id && typeof id === "string" && id.trim() !== "";
7442
+ if (!isValid) {
7443
+ console.warn("[OrganisationProvider] Filtering out invalid ID:", { id, type: typeof id, length: id ? id.length : "null/undefined" });
7444
+ }
7445
+ return isValid;
7446
+ });
7447
+ console.log("[OrganisationProvider] Clean organisation IDs after filtering:", cleanOrganisationIds);
7421
7448
  if (cleanOrganisationIds.length === 0) {
7422
7449
  console.warn("[OrganisationProvider] No clean organisation IDs after filtering:", organisationIds);
7423
7450
  throw new Error("No valid organisation IDs found after cleaning");
@@ -7489,27 +7516,30 @@ function OrganisationProvider({ children }) {
7489
7516
  userRole: roleMap.get(initialOrg.id)
7490
7517
  });
7491
7518
  setRetryCount(0);
7519
+ hasFailedRef.current = false;
7492
7520
  } catch (err) {
7493
7521
  console.error("[OrganisationProvider] Failed to load organisations:", err);
7494
7522
  setError(err);
7495
7523
  setRetryCount((prev) => prev + 1);
7524
+ hasFailedRef.current = true;
7496
7525
  clearAllCachedData();
7497
7526
  } finally {
7527
+ isLoadingRef.current = false;
7498
7528
  setIsLoading(false);
7499
7529
  }
7500
7530
  }, [user, session, supabase, clearAllCachedData]);
7501
7531
  useEffect7(() => {
7502
- if (user && session && supabase && !isLoading) {
7503
- if (retryCount >= 3) {
7504
- console.error("[OrganisationProvider] Max retry count reached, stopping organisation loading");
7532
+ if (user && session && supabase && !isLoading && !isLoadingRef.current) {
7533
+ if (retryCount >= 3 || hasFailedRef.current) {
7534
+ console.error("[OrganisationProvider] Max retry count reached or failed flag set, stopping organisation loading");
7505
7535
  setError(new Error("Failed to load organisations after multiple attempts"));
7506
7536
  setIsLoading(false);
7507
7537
  return;
7508
7538
  }
7509
- DebugLogger.log("OrganisationProvider", "Authentication stable, loading organizations... (retry:", retryCount, ")");
7539
+ console.log("[OrganisationProvider] Authentication stable, loading organizations... (retry:", retryCount, ")");
7510
7540
  loadUserOrganisations();
7511
7541
  } else if (!user && !session) {
7512
- DebugLogger.log("OrganisationProvider", "No authentication, clearing organization state");
7542
+ console.log("[OrganisationProvider] No authentication, clearing organization state");
7513
7543
  setSelectedOrganisation(null);
7514
7544
  setOrganisations([]);
7515
7545
  setUserMemberships([]);
@@ -7517,10 +7547,12 @@ function OrganisationProvider({ children }) {
7517
7547
  setIsLoading(false);
7518
7548
  setError(null);
7519
7549
  setRetryCount(0);
7550
+ isLoadingRef.current = false;
7551
+ hasFailedRef.current = false;
7520
7552
  localStorage.removeItem(STORAGE_KEYS2.SELECTED_ORGANISATION);
7521
7553
  localStorage.removeItem(STORAGE_KEYS2.ORGANISATION_CONTEXT);
7522
7554
  }
7523
- }, [user, session, supabase, isLoading, loadUserOrganisations, retryCount]);
7555
+ }, [user, session, supabase, isLoading, retryCount]);
7524
7556
  const handleLogoutAndRedirect = useCallback7(async () => {
7525
7557
  try {
7526
7558
  await signOut();
@@ -7769,4 +7801,4 @@ lodash/lodash.js:
7769
7801
  * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
7770
7802
  *)
7771
7803
  */
7772
- //# sourceMappingURL=chunk-VW4YRTVX.js.map
7804
+ //# sourceMappingURL=chunk-S6DAOMOC.js.map