Compare commits

..

No commits in common. "9a04e25c20f0f29514816783bf09311c2c88da30" and "08ae2bb88abbe41b17b9f183703ccf77fa10ab22" have entirely different histories.

2 changed files with 29 additions and 60 deletions

View file

@ -10,7 +10,6 @@ interface ScheduleEvent {
name: string;
eventDate: string | null;
eventStartsAt?: Date | string | null;
earliestGameTime?: string | null;
eventType: string;
isComplete: boolean;
completedAt?: Date | string | null;
@ -53,13 +52,10 @@ function getEventTypeLabel(eventType: string): string {
export function EventSchedule({ upcomingEvents, recentEvents, leagueId, sportsSeasonId }: EventScheduleProps) {
const isMounted = useHasMounted();
function getDisplayDate(event: Pick<ScheduleEvent, "eventDate" | "eventStartsAt" | "earliestGameTime">): string {
if (isMounted) {
const ts = event.earliestGameTime ?? (event.eventStartsAt as string | null | undefined);
if (ts) {
const d = new Date(ts);
if (!isNaN(d.getTime())) return format(d, "MMM d, yyyy");
}
function getDisplayDate(event: Pick<ScheduleEvent, "eventDate" | "eventStartsAt">): 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);
}
@ -113,8 +109,8 @@ export function EventSchedule({ upcomingEvents, recentEvents, leagueId, sportsSe
<p className="text-xs text-muted-foreground flex items-center gap-1 mt-0.5">
<Calendar className="h-3 w-3" />
<span>{getDisplayDate(event)}</span>
{isMounted && (event.earliestGameTime ?? event.eventStartsAt) && (
<span>· {new Date(event.earliestGameTime ?? (event.eventStartsAt as string)).toLocaleTimeString(undefined, { hour: "numeric", minute: "2-digit" })}</span>
{isMounted && event.eventStartsAt && (
<span>· {format(new Date(event.eventStartsAt), "h:mm a")}</span>
)}
</p>
</div>

View file

@ -310,54 +310,33 @@ export async function getUpcomingScoringEvents(
if (events.length === 0) return [];
// Find earliest upcoming game time per event from both bracket match games
// and group stage matches (FIFA World Cup style).
// Find earliest upcoming game time per event from bracket match games.
const eventIds = events.map((e) => e.id);
const now = new Date();
const [gameTimeRows, groupStageTimeRows] = await Promise.all([
db
.select({
eventId: schema.scoringEvents.id,
scheduledAt: schema.playoffMatchGames.scheduledAt,
})
.from(schema.scoringEvents)
.innerJoin(
schema.playoffMatches,
eq(schema.playoffMatches.scoringEventId, schema.scoringEvents.id)
const gameTimeRows = await db
.select({
eventId: schema.scoringEvents.id,
scheduledAt: schema.playoffMatchGames.scheduledAt,
})
.from(schema.scoringEvents)
.innerJoin(
schema.playoffMatches,
eq(schema.playoffMatches.scoringEventId, schema.scoringEvents.id)
)
.innerJoin(
schema.playoffMatchGames,
eq(schema.playoffMatchGames.playoffMatchId, schema.playoffMatches.id)
)
.where(
and(
inArray(schema.scoringEvents.id, eventIds),
isNotNull(schema.playoffMatchGames.scheduledAt),
gte(schema.playoffMatchGames.scheduledAt, now)
)
.innerJoin(
schema.playoffMatchGames,
eq(schema.playoffMatchGames.playoffMatchId, schema.playoffMatches.id)
)
.where(
and(
inArray(schema.scoringEvents.id, eventIds),
isNotNull(schema.playoffMatchGames.scheduledAt),
gte(schema.playoffMatchGames.scheduledAt, now)
)
),
db
.select({
eventId: schema.tournamentGroups.scoringEventId,
scheduledAt: schema.groupStageMatches.scheduledAt,
})
.from(schema.groupStageMatches)
.innerJoin(
schema.tournamentGroups,
eq(schema.groupStageMatches.tournamentGroupId, schema.tournamentGroups.id)
)
.where(
and(
inArray(schema.tournamentGroups.scoringEventId, eventIds),
isNotNull(schema.groupStageMatches.scheduledAt),
gte(schema.groupStageMatches.scheduledAt, now)
)
),
]);
);
const earliestGameById = new Map<string, Date>();
for (const row of [...gameTimeRows, ...groupStageTimeRows]) {
for (const row of gameTimeRows) {
if (!row.scheduledAt) continue;
const prev = earliestGameById.get(row.eventId);
if (!prev || row.scheduledAt < prev) {
@ -374,13 +353,7 @@ export async function getUpcomingScoringEvents(
return candidates.length > 0 ? Math.min(...candidates) : Infinity;
};
return events
.toSorted((a, b) => getEffectiveMs(a) - getEffectiveMs(b))
.slice(0, limit)
.map((e) => ({
...e,
earliestGameTime: earliestGameById.get(e.id)?.toISOString() ?? null,
}));
return events.toSorted((a, b) => getEffectiveMs(a) - getEffectiveMs(b)).slice(0, limit);
}
/**