import React, { useMemo, useState } from 'react'; import { createPortal } from 'react-dom'; import { Event } from '../types'; import { CLUBS } from '../constants'; const Portal: React.FC<{ children: React.ReactNode }> = ({ children }) => { return createPortal(children, document.body); }; interface UpcomingEventsSliderProps { events: Event[]; } const UpcomingEventsSlider: React.FC = ({ events }) => { const [selectedEvent, setSelectedEvent] = useState(null); const clubInfo = useMemo(() => selectedEvent ? CLUBS.find(c => c.name === selectedEvent.club) : null, [selectedEvent]); const sortedEvents = useMemo(() => { return [...events] .filter(e => e.status !== 'Completed') .sort((a, b) => { return new Date(a.date).getTime() - new Date(b.date).getTime(); }); }, [events]); // Duplicate events for seamless loop only if we have enough to fill the track const loopEvents = sortedEvents.length > 2 ? [...sortedEvents, ...sortedEvents] : sortedEvents; if (sortedEvents.length === 0) return null; return (

Upcoming Experiences

{/* Gradient masks removed to eliminate fogginess */}
{loopEvents.map((event, idx) => (
{event.title}
{event.category}

{event.title}

{event.date} {event.schedule?.[0]?.start_time || ''}
{event.location}
Limited Access
))}
{selectedEvent && (
{clubInfo && ( )}
{selectedEvent.club || 'Organized by'} {selectedEvent.coordinator}

Summary

{selectedEvent.event_summary || "Details for this session will be provided soon."}

)}
); }; export default UpcomingEventsSlider;