import { format } from "date-fns"; import { useHasMounted } from "~/hooks/useHasMounted"; import { Link } from "react-router"; import { Card, CardContent, CardHeader, CardTitle } from "~/components/ui/card"; import { Badge } from "~/components/ui/badge"; import { Calendar, CheckCircle2, Clock } from "lucide-react"; interface ScheduleEvent { id: string; name: string; eventDate: string | null; eventStartsAt?: Date | string | null; eventType: string; isComplete: boolean; completedAt?: Date | string | null; } interface EventScheduleProps { upcomingEvents: ScheduleEvent[]; recentEvents: ScheduleEvent[]; /** When provided, event names link to the event detail page */ leagueId?: string; sportsSeasonId?: string; } function formatEventDate(dateStr: string | null | undefined): string { if (!dateStr) return "Date TBD"; try { const [year, month, day] = dateStr.split("-").map(Number); return format(new Date(year, month - 1, day), "MMM d, yyyy"); } catch { return dateStr; } } function getEventTypeLabel(eventType: string): string { switch (eventType) { case "playoff_game": return "Bracket"; case "major_tournament": return "Major"; case "final_standings": return "Final Standings"; case "schedule_event": return "Non-Scoring"; default: return eventType; } } export function EventSchedule({ upcomingEvents, recentEvents, leagueId, sportsSeasonId }: EventScheduleProps) { const isMounted = useHasMounted(); function getDisplayDate(event: Pick): string { if (isMounted && event.eventStartsAt) { const d = new Date(event.eventStartsAt as string); if (!isNaN(d.getTime())) return format(d, "MMM d, yyyy"); } return formatEventDate(event.eventDate); } const hasUpcoming = upcomingEvents.length > 0; const hasRecent = recentEvents.length > 0; if (!hasUpcoming && !hasRecent) return null; return (
{/* Upcoming Events */} {hasUpcoming && ( Upcoming
    {upcomingEvents.map((event, index) => { const eventDetailUrl = leagueId && sportsSeasonId ? `/leagues/${leagueId}/sports-seasons/${sportsSeasonId}/events/${event.id}` : null; return (
  • {index === 0 && ( )} {eventDetailUrl ? ( {event.name} ) : ( event.name )}

    {getDisplayDate(event)} {isMounted && event.eventStartsAt && ( ยท {format(new Date(event.eventStartsAt), "h:mm a")} )}

    {event.eventType === "schedule_event" ? ( !event.isComplete && (() => { const isPast = event.eventStartsAt ? new Date(event.eventStartsAt) < new Date() : event.eventDate !== null && event.eventDate < new Date().toISOString().split("T")[0]; return isPast && ( Results Pending ); })() ) : ( {getEventTypeLabel(event.eventType)} )}
  • ); })}
)} {/* Recent Results */} {hasRecent && ( Recent Results
    {recentEvents.map((event, index) => { const eventDetailUrl = leagueId && sportsSeasonId ? `/leagues/${leagueId}/sports-seasons/${sportsSeasonId}/events/${event.id}` : null; return (
  • {eventDetailUrl ? ( {event.name} ) : ( event.name )}

    {getDisplayDate(event)}

    {event.eventType !== "schedule_event" && ( Done )}
  • ); })}
)}
); }