From fa98d514f2a9ca72d1ee6bb6a78002bba59bd860 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 17 Jun 2026 17:47:24 +0000 Subject: [PATCH] Code review fixes: earliestGameTime fallback, isNaN guard, and missing index MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - getUpcomingScoringEvents: fall back to eventStartsAt.toISOString() when no game-level scheduledAt exists, matching the same pattern already used in getUpcomingEventsForDraftedParticipants — prevents F1/golf events from showing a date with no time in SportSeasonCard and similar consumers - EventSchedule: replace bare toLocaleTimeString call with an isNaN-guarded block so a malformed timestamp renders nothing instead of "Invalid Date" - database/schema.ts: add index on tournament_groups(scoring_event_id) to support the inArray filter added in the previous commit (run npm run db:generate && npm run db:migrate to apply) Co-Authored-By: Claude Sonnet 4.6 Claude-Session: https://claude.ai/code/session_01KiVGo8gSBXe3WuRniVNKsd --- app/components/sport-season/EventSchedule.tsx | 10 +++++++--- app/models/scoring-event.ts | 4 +++- database/schema.ts | 4 +++- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/components/sport-season/EventSchedule.tsx b/app/components/sport-season/EventSchedule.tsx index 3b21e99..013a94f 100644 --- a/app/components/sport-season/EventSchedule.tsx +++ b/app/components/sport-season/EventSchedule.tsx @@ -113,9 +113,13 @@ export function EventSchedule({ upcomingEvents, recentEvents, leagueId, sportsSe

{getDisplayDate(event)} - {isMounted && (event.earliestGameTime ?? event.eventStartsAt) && ( - · {new Date(event.earliestGameTime ?? (event.eventStartsAt as string)).toLocaleTimeString(undefined, { hour: "numeric", minute: "2-digit" })} - )} + {isMounted && (() => { + const ts = event.earliestGameTime ?? (event.eventStartsAt as string | null | undefined); + if (!ts) return null; + const d = new Date(ts); + if (isNaN(d.getTime())) return null; + return · {d.toLocaleTimeString(undefined, { hour: "numeric", minute: "2-digit" })}; + })()}

{event.eventType === "schedule_event" ? ( diff --git a/app/models/scoring-event.ts b/app/models/scoring-event.ts index 26e31e9..80e45f4 100644 --- a/app/models/scoring-event.ts +++ b/app/models/scoring-event.ts @@ -379,7 +379,9 @@ export async function getUpcomingScoringEvents( .slice(0, limit) .map((e) => ({ ...e, - earliestGameTime: earliestGameById.get(e.id)?.toISOString() ?? null, + earliestGameTime: earliestGameById.get(e.id)?.toISOString() + ?? e.eventStartsAt?.toISOString() + ?? null, })); } diff --git a/database/schema.ts b/database/schema.ts index 96fadae..8cbb2be 100644 --- a/database/schema.ts +++ b/database/schema.ts @@ -886,7 +886,9 @@ export const tournamentGroups = pgTable("tournament_groups", { .references(() => scoringEvents.id, { onDelete: "cascade" }), groupName: varchar("group_name", { length: 10 }).notNull(), // "A" through "L" createdAt: timestamp("created_at").defaultNow().notNull(), -}); +}, (t) => [ + index("tournament_groups_scoring_event_id_idx").on(t.scoringEventId), +]); export const tournamentGroupMembers = pgTable("tournament_group_members", { id: uuid("id").primaryKey().defaultRandom(),