import { format } from "date-fns"; import { Link } from "react-router"; import { Badge } from "~/components/ui/badge"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "~/components/ui/card"; import { Trophy, Target, Flag, Calendar, Users } from "lucide-react"; import { formatEventDate } from "~/lib/date-utils"; import type { UpcomingParticipantEvent } from "~/models/scoring-event"; import { SportIcon } from "~/components/SportIcon"; interface SportSeasonCardProps { leagueId: string; sportSeasonId: string; sportName: string; sportIconUrl?: string | null; seasonName: string; status: "upcoming" | "active" | "completed"; scoringPattern?: string | null; upcomingParticipantEvents?: UpcomingParticipantEvent[]; } const MAX_EVENTS_SHOWN = 3; function EventLine({ event }: { event: UpcomingParticipantEvent }) { const gameDate = event.earliestGameTime ? new Date(event.earliestGameTime) : null; const dateStr = gameDate ? format(gameDate, "MMM d") : formatEventDate(event.eventDate); const isAllCompete = event.eventType !== "playoff_game"; const count = event.relevantParticipants.length; const displayName = event.matchLabel ? `${event.name} — ${event.matchLabel}` : event.name; return (
{displayName} {dateStr && ( {" — "}{dateStr} )} {isAllCompete && count > 1 ? ( {count} ) : ( event.relevantParticipants.slice(0, 2).map((p) => ( {p.name} )) )}
); } export function SportSeasonCard({ leagueId, sportSeasonId, sportName, sportIconUrl, seasonName, status, scoringPattern, upcomingParticipantEvents = [], }: SportSeasonCardProps) { const getStatusBadge = () => { switch (status) { case "upcoming": return ( Upcoming ); case "active": return ( Active ); case "completed": return ( Completed ); } }; const getScoringPatternLabel = () => { if (!scoringPattern) return null; switch (scoringPattern) { case "playoff_bracket": return "Playoff Bracket"; case "season_standings": return "Season Standings"; case "qualifying_points": return "Qualifying Points"; default: return null; } }; const scoringLabel = getScoringPatternLabel(); const isPlayoffType = scoringPattern === "playoff_bracket"; const shownEvents = upcomingParticipantEvents.slice(0, MAX_EVENTS_SHOWN); const overflowCount = upcomingParticipantEvents.length - MAX_EVENTS_SHOWN; return (
{sportName} {seasonName}
{getStatusBadge()}
{scoringLabel && (
{isPlayoffType ? ( ) : ( )} {scoringLabel}
)} {shownEvents.length > 0 && (
{shownEvents.map((event) => ( ))} {overflowCount > 0 && (

+{overflowCount} more event{overflowCount > 1 ? "s" : ""}

)}
)}
); }