{isEn ? label.en : label.zh}
/ {label.icao}
{obsLocal || "--"}
{label.sourceLabel}
{range
? `${range[0].toFixed(1)}–${range[1].toFixed(1)}${tempSymbol}`
: hasPairRows
? pairRows
.map((row) => row.temp)
.filter((value): value is number => value != null)
.map((value) => value.toFixed(1))
.join(" / ") + tempSymbol
: "--"}
{hasRunwayData ? (
<>
{hasPointRows ? (
<>
{isEn ? "Runway" : "跑道"}
TDZ / MID / END
{rows.map((row) => (
{row.runway || "--"}
{formatTemp(row.tdz_temp, tempSymbol)} /{" "}
{formatTemp(row.mid_temp, tempSymbol)} /{" "}
{formatTemp(row.end_temp, tempSymbol)}
))}
>
) : (
{isEn ? "Runway" : "跑道"}
{isEn ? "Temp / Dew" : "温度 / 露点"}
)}
{hasPairRows &&
pairRows.map((row) => (
{row.label}
{formatTemp(row.temp, tempSymbol)} / {formatTemp(row.dew, tempSymbol)}
))}
>
) : (
{isEn
? `No ${label.sourceLabel} runway observation loaded yet.`
: `暂无 ${label.sourceLabel} 跑道观测。`}
)}
);
}
export function RunwayObservationsPanel() {
const { locale } = useI18n();
const isEn = locale === "en-US";
const { cityDetailsByName } = useCityDetails();
const { ensureCityDetail } = useDashboardActions();
const loadAll = useCallback(
async () => {
await Promise.allSettled(
RUNWAY_OBSERVATION_CITIES.map((city) =>
ensureCityDetail(city.key, true, "panel"),
),
);
},
[ensureCityDetail],
);
const intervalRef = useRef