import React from 'react'; import { fetchEvent, type EventData, FetchEventError } from '../services/eventApi'; import { isTaskModeEnabled } from '@/guest/lib/engagement'; type EventDataStatus = 'idle' | 'loading' | 'ready' | 'error'; type EventDataContextValue = { event: EventData | null; status: EventDataStatus; error: string | null; token: string | null; tasksEnabled: boolean; }; const EventDataContext = React.createContext({ event: null, status: 'idle', error: null, token: null, tasksEnabled: true, }); type EventDataProviderProps = { token?: string | null; tasksEnabledFallback?: boolean; children: React.ReactNode; }; export function EventDataProvider({ token, tasksEnabledFallback = true, children, }: EventDataProviderProps) { const [event, setEvent] = React.useState(null); const [status, setStatus] = React.useState(token ? 'loading' : 'idle'); const [error, setError] = React.useState(null); React.useEffect(() => { if (!token) { setEvent(null); setStatus('idle'); setError(null); return; } let cancelled = false; const loadEvent = async () => { setStatus('loading'); setError(null); try { const eventData = await fetchEvent(token); if (cancelled) { return; } setEvent(eventData); setStatus('ready'); } catch (err) { if (cancelled) { return; } setEvent(null); setStatus('error'); if (err instanceof FetchEventError) { setError(err.message); } else if (err instanceof Error) { setError(err.message || 'Event could not be loaded.'); } else { setError('Event could not be loaded.'); } } }; loadEvent(); return () => { cancelled = true; }; }, [token]); const tasksEnabled = event ? isTaskModeEnabled(event) : tasksEnabledFallback; return ( {children} ); } export function useEventData() { return React.useContext(EventDataContext); }