'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { useLanguage } from '@/context/LanguageContext'; import { eventsApi, Event } from '@/lib/api'; import { formatPrice } 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'; export default function EventsPage() { const { t, locale } = useLanguage(); const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState<'upcoming' | 'past'>('upcoming'); useEffect(() => { eventsApi.getAll() .then(({ events }) => setEvents(events)) .catch(console.error) .finally(() => setLoading(false)); }, []); const now = new Date(); const upcomingEvents = events.filter(e => e.status === 'published' && new Date(e.startDatetime) >= now ); const pastEvents = events.filter(e => e.status === 'completed' || (e.status === 'published' && new Date(e.startDatetime) < now) ); const displayedEvents = filter === 'upcoming' ? upcomingEvents : pastEvents; const formatDate = (dateStr: string) => { return new Date(dateStr).toLocaleDateString(locale === 'es' ? 'es-ES' : 'en-US', { weekday: 'short', month: 'short', day: 'numeric', }); }; const formatTime = (dateStr: string) => { return new Date(dateStr).toLocaleTimeString(locale === 'es' ? 'es-ES' : 'en-US', { hour: '2-digit', minute: '2-digit', }); }; const getStatusBadge = (event: Event) => { if (event.status === 'cancelled') { return {t('events.details.cancelled')}; } if (event.availableSeats === 0) { return {t('events.details.soldOut')}; } return null; }; return (

{t('events.title')}

{/* Filter tabs */}
{/* Events grid */}
{loading ? (
) : 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)} - {formatTime(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)}
))}
)}
); }