@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.
- package/dist/{DataTable-CBZ4FWLB.js → DataTable-HEKRWAIY.js} +5 -5
- package/dist/{chunk-YOMT5BFG.js → chunk-B7SEFA3N.js} +2 -2
- package/dist/{chunk-UK5BMO5B.js → chunk-I74GLRTW.js} +3 -3
- package/dist/{chunk-QGIMHNFE.js → chunk-I75UJB4H.js} +3 -3
- package/dist/{chunk-ZK26ZQ3P.js → chunk-LM3Y67VN.js} +3 -3
- package/dist/{chunk-RZZ4U2VB.js → chunk-NN2FBCPX.js} +3 -3
- package/dist/{chunk-YJ7MYXN4.js → chunk-OYGUYTFO.js} +2 -2
- package/dist/{chunk-TCPMEL3C.js → chunk-PVBQU2PL.js} +22 -3
- package/dist/chunk-PVBQU2PL.js.map +1 -0
- package/dist/{chunk-VW4YRTVX.js → chunk-S6DAOMOC.js} +43 -11
- package/dist/{chunk-VW4YRTVX.js.map → chunk-S6DAOMOC.js.map} +1 -1
- package/dist/{chunk-WUCWNFHS.js → chunk-VFRMH3YO.js} +5 -5
- package/dist/{chunk-YAACZXDE.js → chunk-VSGY52OL.js} +4 -4
- package/dist/components.js +7 -7
- package/dist/hooks.js +4 -4
- package/dist/index.js +10 -10
- package/dist/providers.js +3 -3
- package/dist/rbac/index.js +5 -5
- package/dist/utils.js +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +1 -1
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventContextType.md +1 -1
- package/docs/api/interfaces/EventLogoProps.md +1 -1
- package/docs/api/interfaces/EventProviderProps.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACContextType.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RBACProviderProps.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +3 -3
- package/package.json +1 -1
- package/src/providers/EventProvider.tsx +21 -2
- package/src/providers/OrganisationProvider.tsx +48 -11
- package/dist/chunk-TCPMEL3C.js.map +0 -1
- /package/dist/{DataTable-CBZ4FWLB.js.map → DataTable-HEKRWAIY.js.map} +0 -0
- /package/dist/{chunk-YOMT5BFG.js.map → chunk-B7SEFA3N.js.map} +0 -0
- /package/dist/{chunk-UK5BMO5B.js.map → chunk-I74GLRTW.js.map} +0 -0
- /package/dist/{chunk-QGIMHNFE.js.map → chunk-I75UJB4H.js.map} +0 -0
- /package/dist/{chunk-ZK26ZQ3P.js.map → chunk-LM3Y67VN.js.map} +0 -0
- /package/dist/{chunk-RZZ4U2VB.js.map → chunk-NN2FBCPX.js.map} +0 -0
- /package/dist/{chunk-YJ7MYXN4.js.map → chunk-OYGUYTFO.js.map} +0 -0
- /package/dist/{chunk-WUCWNFHS.js.map → chunk-VFRMH3YO.js.map} +0 -0
- /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-
|
|
36
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
100
|
+
//# sourceMappingURL=DataTable-HEKRWAIY.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
init_UnifiedAuthProvider,
|
|
4
4
|
useOrganisations,
|
|
5
5
|
useUnifiedAuth
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
382
|
+
//# sourceMappingURL=chunk-B7SEFA3N.js.map
|
|
@@ -7,13 +7,13 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
init_EventProvider,
|
|
9
9
|
useEvents
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
509
|
+
//# sourceMappingURL=chunk-I74GLRTW.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
useCan
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
5587
|
+
//# sourceMappingURL=chunk-I75UJB4H.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
usePublicPageContext
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
522
|
+
//# sourceMappingURL=chunk-LM3Y67VN.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
init_EventProvider
|
|
3
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
17
|
+
//# sourceMappingURL=chunk-NN2FBCPX.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
init_UnifiedAuthProvider,
|
|
3
3
|
useUnifiedAuth
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
389
|
+
//# sourceMappingURL=chunk-OYGUYTFO.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
init_UnifiedAuthProvider,
|
|
4
4
|
useOrganisations,
|
|
5
5
|
useUnifiedAuth
|
|
6
|
-
} from "./chunk-
|
|
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-
|
|
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 (
|
|
7358
|
-
|
|
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
|
-
|
|
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
|
-
|
|
7539
|
+
console.log("[OrganisationProvider] Authentication stable, loading organizations... (retry:", retryCount, ")");
|
|
7510
7540
|
loadUserOrganisations();
|
|
7511
7541
|
} else if (!user && !session) {
|
|
7512
|
-
|
|
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,
|
|
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-
|
|
7804
|
+
//# sourceMappingURL=chunk-S6DAOMOC.js.map
|