diff --git a/src/features/online-board/api.ts b/src/features/online-board/api.ts index ada773f9..27b26f64 100644 --- a/src/features/online-board/api.ts +++ b/src/features/online-board/api.ts @@ -165,10 +165,10 @@ function bitmaskToDates(bitmask: string, baseDate: string): string[] { // Parse baseDate — could be "yyyy-MM-ddT00:00:00" or "yyyyMMdd" let year: number, month: number, day: number; if (baseDate.includes("-")) { - const parts = baseDate.split("T")[0]!.split("-"); - year = parseInt(parts[0]!, 10); - month = parseInt(parts[1]!, 10) - 1; - day = parseInt(parts[2]!, 10); + const parts = (baseDate.split("T")[0] ?? baseDate).split("-"); + year = parseInt(parts[0] ?? "0", 10); + month = parseInt(parts[1] ?? "1", 10) - 1; + day = parseInt(parts[2] ?? "1", 10); } else { year = parseInt(baseDate.slice(0, 4), 10); month = parseInt(baseDate.slice(4, 6), 10) - 1; diff --git a/src/features/schedule/components/DayGroupedFlightList.tsx b/src/features/schedule/components/DayGroupedFlightList.tsx index 34f4478e..5d9c7e2b 100644 --- a/src/features/schedule/components/DayGroupedFlightList.tsx +++ b/src/features/schedule/components/DayGroupedFlightList.tsx @@ -45,7 +45,9 @@ interface DayGroup { function getPrimaryLeg(flight: ISimpleFlight): IFlightLeg { if (flight.routeType === "Direct") return flight.leg; - return flight.legs[0]!; + const first = flight.legs[0]; + if (!first) throw new Error("MultiLeg flight has no legs"); + return first; } /** Pull the local-time wall-clock date (yyyy-MM-dd) from the first leg. */ @@ -70,7 +72,7 @@ function groupFlightsByDay(flights: ISimpleFlight[]): DayGroup[] { const [y, m, d] = date.split("-").map((s) => parseInt(s, 10)); return { date, - parsed: new Date(y!, (m ?? 1) - 1, d ?? 1), + parsed: new Date(y ?? 1970, (m ?? 1) - 1, d ?? 1), flights: list, }; }); @@ -85,7 +87,14 @@ function depMinutes(f: ISimpleFlight): number { return (h ?? 0) * 60 + (m ?? 0); } function arrMinutes(f: ISimpleFlight): number { - const last = f.routeType === "Direct" ? f.leg : f.legs[f.legs.length - 1]!; + let last: IFlightLeg; + if (f.routeType === "Direct") { + last = f.leg; + } else { + const tail = f.legs[f.legs.length - 1]; + if (!tail) return 0; + last = tail; + } const iso = last.arrival.times.scheduledArrival.local ?? ""; const t = iso.slice(11, 16); if (!t) return 0; @@ -96,7 +105,7 @@ function flyingMinutes(f: ISimpleFlight): number { const ft = f.flyingTime ?? ""; const m = /^(\d+):(\d+)/.exec(ft); if (!m) return 0; - return parseInt(m[1]!, 10) * 60 + parseInt(m[2]!, 10); + return parseInt(m[1] ?? "0", 10) * 60 + parseInt(m[2] ?? "0", 10); } function sortFlights(flights: ISimpleFlight[], mode: SortMode): ISimpleFlight[] { diff --git a/src/ui/flights/FlightCard.tsx b/src/ui/flights/FlightCard.tsx index b5a02db3..510f8dbb 100644 --- a/src/ui/flights/FlightCard.tsx +++ b/src/ui/flights/FlightCard.tsx @@ -83,8 +83,8 @@ function formatFlyingTime(value: string, language: string): string { let m = 0; const hms = /^(\d+):(\d+):(\d+)$/.exec(value); if (hms) { - h = parseInt(hms[1]!, 10); - m = parseInt(hms[2]!, 10); + h = parseInt(hms[1] ?? "0", 10); + m = parseInt(hms[2] ?? "0", 10); } else { const iso = /^PT(?:(\d+)H)?(?:(\d+)M)?/.exec(value); if (iso) {