import React, { useState, useEffect, useMemo, useCallback } from 'react'; import type { Event } from '../../types'; interface EventsHeroSliderProps { events: Event[]; } const EventsHeroSlider: React.FC = ({ events }) => { 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]); const [currentIndex, setCurrentIndex] = useState(0); const [timeLeft, setTimeLeft] = useState({ d: '00', h: '00', m: '00', s: '00' }); const nextSlide = useCallback(() => { setCurrentIndex((prev) => (prev + 1) % sortedEvents.length); }, [sortedEvents.length]); const prevSlide = useCallback(() => { setCurrentIndex((prev) => (prev - 1 + sortedEvents.length) % sortedEvents.length); }, [sortedEvents.length]); useEffect(() => { if (sortedEvents.length === 0) return; const interval = setInterval(nextSlide, 5000); return () => clearInterval(interval); }, [sortedEvents.length, nextSlide]); const updateTimer = useCallback(() => { const activeEvent = sortedEvents[currentIndex]; if (!activeEvent) { setTimeLeft({ d: '00', h: '00', m: '00', s: '00' }); return; } const targetDate = new Date(activeEvent.date).getTime(); const now = new Date().getTime(); const distance = targetDate - now; if (isNaN(targetDate) || distance < 0) { setTimeLeft({ d: '00', h: '00', m: '00', s: '00' }); return; } setTimeLeft(prev => { const newD = Math.floor(distance / (1000 * 60 * 60 * 24)).toString().padStart(2, '0'); const newH = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)).toString().padStart(2, '0'); const newM = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)).toString().padStart(2, '0'); const newS = Math.floor((distance % (1000 * 60)) / 1000).toString().padStart(2, '0'); if (prev.d === newD && prev.h === newH && prev.m === newM && prev.s === newS) { return prev; } return { d: newD, h: newH, m: newM, s: newS }; }); }, [sortedEvents, currentIndex]); useEffect(() => { updateTimer(); const timerId = setInterval(updateTimer, 1000); return () => clearInterval(timerId); }, [updateTimer]); if (sortedEvents.length === 0) return null; const activeEvent = sortedEvents[currentIndex]; return (
{/* Background Images & Content */} {sortedEvents.map((event, idx) => { const isActive = idx === currentIndex; return (
{/* Background Image */}
{event.title}
{/* Top Right Location Button */}
{event.location}
{/* Main Content */}
JOIN US {event.date}

{event.title}

); })} {/* Countdown Timer Block (Slanted Orange Design) */}
{timeLeft.d} Days
{timeLeft.h} Hrs
{timeLeft.m} Min
{timeLeft.s} Sec
{/* Navigation Arrows */} {/* Slider Dots */}
{sortedEvents.map((_, idx) => ( ))}
{/* Scroll Down Indicator */}
Scroll down to explore the events
); }; export default EventsHeroSlider;