import { format } from "date-fns"; import { Calendar, Users } from "lucide-react"; import { Link } from "react-router"; import { Badge } from "~/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle, } from "~/components/ui/card"; import { formatEventDate } from "~/lib/date-utils"; import type { UpcomingParticipantEvent } from "~/models/scoring-event"; export interface CalendarPanelEvent extends UpcomingParticipantEvent { sportName: string; sportSeasonName: string; /** Present when showing events across multiple leagues (home page) */ leagueName?: string; leagueId?: string; sportsSeasonPageUrl?: string; } interface Props { events: CalendarPanelEvent[]; /** When true, renders a league name badge on each row */ showLeague?: boolean; } function ParticipantList({ participants }: { participants: Array<{ id: string; name: string }> }) { const MAX_SHOWN = 3; const shown = participants.slice(0, MAX_SHOWN); const overflow = participants.length - MAX_SHOWN; return ( {shown.map((p) => ( {p.name} ))} {overflow > 0 && ( +{overflow} more )} ); } function EventRow({ event, showLeague }: { event: CalendarPanelEvent; showLeague: boolean }) { // Prefer game-level scheduledAt over event-level eventDate for display const gameDate = event.earliestGameTime ? new Date(event.earliestGameTime) : null; const dateStr = gameDate ? format(gameDate, "MMM d") : formatEventDate(event.eventDate); const participantCount = event.relevantParticipants.length; const isAllCompete = event.eventType !== "playoff_game"; const displayName = event.matchLabel ? `${event.name} — ${event.matchLabel}` : event.name; const content = (
{/* Date pill */}
{dateStr ?? "TBD"} {gameDate && (

{gameDate.toLocaleTimeString(undefined, { hour: "numeric", minute: "2-digit", })}

)}
{/* Event details */}
{displayName} {showLeague && event.leagueName && ( {event.leagueName} )}
{event.sportName} · {event.sportSeasonName}
{isAllCompete && participantCount > 1 ? ( {participantCount} of your picks ) : ( )}
); if (event.sportsSeasonPageUrl) { return ( {content} ); } return content; } export function UpcomingCalendarPanel({ events, showLeague = false }: Props) { return ( Upcoming Events {events.length === 0 ? (

No upcoming events in the next 30 days.

) : (
{events.map((event) => ( ))}
)}
); }