Filter meteo warnings by local county
This commit is contained in:
@@ -4,6 +4,7 @@ import { formatProvinceName } from "@/lib/provinces";
|
||||
import type { HourlyForecast, WeatherForecast } from "@/types/forecast";
|
||||
import type { WeatherWarning } from "@/types/imgw";
|
||||
import type { Province } from "@/types/province";
|
||||
import { warningMatchesCounty } from "@/lib/warning-regions";
|
||||
|
||||
export type WeatherBriefSeverity = "normal" | "attention" | "warning";
|
||||
|
||||
@@ -20,6 +21,7 @@ interface BuildWeatherBriefInput {
|
||||
forecast: WeatherForecast;
|
||||
warnings: WeatherWarning[];
|
||||
province: Province | null;
|
||||
countyTeryt?: string | null;
|
||||
locationName: string;
|
||||
language: Language;
|
||||
now?: Date;
|
||||
@@ -112,10 +114,10 @@ function getPeakHour(hours: HourlyForecast[], selector: (hour: HourlyForecast) =
|
||||
}, null);
|
||||
}
|
||||
|
||||
function isRelevantMeteoWarning(warning: WeatherWarning, province: Province | null, now: number) {
|
||||
function isRelevantMeteoWarning(warning: WeatherWarning, province: Province | null, countyTeryt: string | null | undefined, now: number) {
|
||||
const validTo = getTimestamp(warning.validTo);
|
||||
return warning.kind === "meteo"
|
||||
&& (!province || warning.provinces.includes(province))
|
||||
&& (countyTeryt ? warningMatchesCounty(warning, countyTeryt) : !province || warning.provinces.includes(province))
|
||||
&& (validTo === null || validTo > now);
|
||||
}
|
||||
|
||||
@@ -125,12 +127,12 @@ function compareWarnings(a: WeatherWarning, b: WeatherWarning) {
|
||||
return (getTimestamp(a.validFrom) ?? 0) - (getTimestamp(b.validFrom) ?? 0);
|
||||
}
|
||||
|
||||
export function buildWeatherBrief({ forecast, warnings, province, locationName, language, now = new Date() }: BuildWeatherBriefInput): WeatherBrief | null {
|
||||
export function buildWeatherBrief({ forecast, warnings, province, countyTeryt, locationName, language, now = new Date() }: BuildWeatherBriefInput): WeatherBrief | null {
|
||||
const hours = getUpcomingHours(forecast.hourly, now, 24);
|
||||
if (!hours.length) return null;
|
||||
|
||||
const relevantWarnings = warnings
|
||||
.filter((warning) => isRelevantMeteoWarning(warning, province, now.getTime()))
|
||||
.filter((warning) => isRelevantMeteoWarning(warning, province, countyTeryt, now.getTime()))
|
||||
.sort(compareWarnings);
|
||||
const topWarning = relevantWarnings[0] ?? null;
|
||||
const minimumTemperature = getMinimum(hours.map((hour) => hour.temperature));
|
||||
|
||||
Reference in New Issue
Block a user