'use client'; import { useState } from 'react'; import Link from 'next/link'; import { useLanguage } from '@/context/LanguageContext'; import { Event } from '@/lib/api'; import { formatPrice, formatDateShort, formatTime } from '@/lib/utils'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import { CalendarIcon, MapPinIcon, UserGroupIcon } from '@heroicons/react/24/outline'; import clsx from 'clsx'; // Receives the event list already fetched on the server so event titles, dates, // and locations are present in the initial HTML. The upcoming/past filter below // is client-side interactivity layered on top of the server-rendered data. export default function EventsClient({ initialEvents }: { initialEvents: Event[] }) { const { t, locale } = useLanguage(); const [filter, setFilter] = useState<'upcoming' | 'past'>('upcoming'); const now = new Date(); // An event that has started but still sells at the door stays under Upcoming. const isUpcoming = (e: Event) => new Date(e.startDatetime) >= now || e.salesState === 'door'; const upcomingEvents = initialEvents.filter(e => e.status === 'published' && isUpcoming(e) ); const pastEvents = initialEvents.filter(e => e.status === 'completed' || (e.status === 'published' && !isUpcoming(e)) ); const displayedEvents = filter === 'upcoming' ? upcomingEvents : pastEvents; const formatDate = (dateStr: string) => formatDateShort(dateStr, locale as 'en' | 'es'); const fmtTime = (dateStr: string) => formatTime(dateStr, locale as 'en' | 'es'); const getStatusBadge = (event: Event) => { if (event.status === 'cancelled') { return {t('events.details.cancelled')}; } if (event.salesState === 'sold_out' || event.availableSeats === 0) { return {t('events.details.soldOut')}; } if (event.salesState === 'door') { return ( {t('events.door.badge')} ); } return null; }; return (

{t('events.title')}

{/* Filter tabs */}
{/* Events grid */}
{displayedEvents.length === 0 ? (

{t('events.noEvents')}

) : (
{displayedEvents.map((event) => ( {/* Event banner */} {event.bannerUrl ? ( {`${event.title} ) : (
)}

{locale === 'es' && event.titleEs ? event.titleEs : event.title}

{getStatusBadge(event)}
{formatDate(event.startDatetime)} - {fmtTime(event.startDatetime)}
{event.location}
{!event.externalBookingEnabled && (
{Math.max(0, event.capacity - (event.bookedCount ?? 0))} / {event.capacity} {t('events.details.spotsLeft')}
)}
{event.price === 0 ? t('events.details.free') : formatPrice(event.price, event.currency)}
))}
)}
); }