diff --git a/src/features/online-board/components/BoardDetailsHeader/FlightStatusButton.tsx b/src/features/online-board/components/BoardDetailsHeader/FlightStatusButton.tsx index 52e78c30..d10264a1 100644 --- a/src/features/online-board/components/BoardDetailsHeader/FlightStatusButton.tsx +++ b/src/features/online-board/components/BoardDetailsHeader/FlightStatusButton.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; import { useTranslation } from "@/i18n/provider.js"; -import type { ISimpleFlight } from "../../types.js"; +import { operatingCarrier, type ISimpleFlight } from "../../types.js"; import { AIRLINES } from "./airlines.js"; import { buildOnlineBoardUrl } from "../../url.js"; import "./actions.scss"; @@ -15,7 +15,7 @@ export const FlightStatusButton: FC = ({ flight, locale const { t } = useTranslation(); const handleClick = () => { - const carrier = flight.operatingBy.carrier; + const carrier = operatingCarrier(flight.operatingBy); if (!carrier) return; const config = AIRLINES[carrier]; if (!config) return; diff --git a/src/features/online-board/components/BoardDetailsHeader/RegistrationButton.tsx b/src/features/online-board/components/BoardDetailsHeader/RegistrationButton.tsx index 5fcdb031..872062c4 100644 --- a/src/features/online-board/components/BoardDetailsHeader/RegistrationButton.tsx +++ b/src/features/online-board/components/BoardDetailsHeader/RegistrationButton.tsx @@ -1,6 +1,6 @@ import type { FC } from "react"; import { useTranslation } from "@/i18n/provider.js"; -import type { ISimpleFlight } from "../../types.js"; +import { operatingCarrier, type ISimpleFlight } from "../../types.js"; import { AIRLINES } from "./airlines.js"; import "./actions.scss"; @@ -12,7 +12,10 @@ export const RegistrationButton: FC = ({ flight }) => { const { t } = useTranslation(); const handleClick = () => { - const carrier = flight.operatingBy.carrier; + // IOperatingBy is `{scheduled, actual}` on real API payloads. The old + // `.carrier` shape survives as a deprecated alias; read through the + // helper so both work. + const carrier = operatingCarrier(flight.operatingBy); if (!carrier) return; const config = AIRLINES[carrier]; if (!config?.registrationUrl) return; diff --git a/src/features/online-board/components/BoardDetailsHeader/visibility/flightStatusVisibility.ts b/src/features/online-board/components/BoardDetailsHeader/visibility/flightStatusVisibility.ts index 1195c068..4dc5a416 100644 --- a/src/features/online-board/components/BoardDetailsHeader/visibility/flightStatusVisibility.ts +++ b/src/features/online-board/components/BoardDetailsHeader/visibility/flightStatusVisibility.ts @@ -1,5 +1,5 @@ import { parseISO, subHours, isAfter, isSameDay } from "date-fns"; -import type { ISimpleFlight } from "../../../types.js"; +import { operatingCarrier, type ISimpleFlight } from "../../../types.js"; /** * Flight Status button is visible when: @@ -13,7 +13,7 @@ export function canViewFlightStatus( availableFromHours: number, airlinesWithStatus: Set, ): boolean { - const carrier = flight.operatingBy.carrier; + const carrier = operatingCarrier(flight.operatingBy); if (!carrier || !airlinesWithStatus.has(carrier)) return false; const leg = flight.routeType === "Direct" ? flight.leg : flight.legs[0]; diff --git a/src/features/online-board/components/BoardDetailsHeader/visibility/registrationVisibility.ts b/src/features/online-board/components/BoardDetailsHeader/visibility/registrationVisibility.ts index 19ce7ec5..af38a34e 100644 --- a/src/features/online-board/components/BoardDetailsHeader/visibility/registrationVisibility.ts +++ b/src/features/online-board/components/BoardDetailsHeader/visibility/registrationVisibility.ts @@ -1,4 +1,4 @@ -import type { ISimpleFlight } from "../../../types.js"; +import { operatingCarrier, type ISimpleFlight } from "../../../types.js"; import type { AirlineConfig } from "../airlines.js"; /** @@ -10,7 +10,7 @@ export function canRegister( flight: ISimpleFlight, airlineConfig: Record, ): boolean { - const carrier = flight.operatingBy.carrier; + const carrier = operatingCarrier(flight.operatingBy); if (!carrier) return false; const config = airlineConfig[carrier]; if (!config?.registrationUrl) return false; diff --git a/src/features/online-board/components/OnlineBoardDetailsPage.tsx b/src/features/online-board/components/OnlineBoardDetailsPage.tsx index ece26d22..119cfe06 100644 --- a/src/features/online-board/components/OnlineBoardDetailsPage.tsx +++ b/src/features/online-board/components/OnlineBoardDetailsPage.tsx @@ -31,6 +31,7 @@ import { FlightSchedule } from "./FlightSchedule/index.js"; import { FullRouteTimeline } from "./FullRouteTimeline/index.js"; import { TransferBar } from "./TransferBar/index.js"; import type { IParsedFlightId, IFlightLeg } from "../types.js"; +import { operatingCarrier } from "../types.js"; import { formatLocalTime, formatUtcOffset, @@ -361,14 +362,17 @@ export const OnlineBoardDetailsPage: FC = ({ {/* Operating carrier */} - {displayFlight.operatingBy.carrier && ( -
- {t("BOARD.OPERATED-BY")}: {displayFlight.operatingBy.carrier} - {displayFlight.operatingBy.flightNumber - ? ` ${displayFlight.operatingBy.flightNumber}` - : ""} -
- )} + {(() => { + const opCarrier = operatingCarrier(displayFlight.operatingBy); + const opNumber = displayFlight.operatingBy.flightNumber; + if (!opCarrier) return null; + return ( +
+ {t("BOARD.OPERATED-BY")}: {opCarrier} + {opNumber ? ` ${opNumber}` : ""} +
+ ); + })()} {/* Detailed leg information */}