96 lines
3.0 KiB
TypeScript
96 lines
3.0 KiB
TypeScript
import { getProvinceForSelection } from "@/lib/provinces";
|
|
import type { WeatherWarning } from "@/types/imgw";
|
|
import type { SelectedLocation } from "@/types/location";
|
|
import type { Province } from "@/types/province";
|
|
|
|
const mazowieckieCountyTerytByName: Record<string, string> = {
|
|
bialobrzeski: "1401",
|
|
ciechanowski: "1402",
|
|
garwolinski: "1403",
|
|
gostyninski: "1404",
|
|
grodziski: "1405",
|
|
grojecki: "1406",
|
|
kozienicki: "1407",
|
|
legionowski: "1408",
|
|
lipski: "1409",
|
|
losicki: "1410",
|
|
makowski: "1411",
|
|
minski: "1412",
|
|
mlawski: "1413",
|
|
nowodworski: "1414",
|
|
ostrolecki: "1415",
|
|
ostrowski: "1416",
|
|
otwocki: "1417",
|
|
piaseczynski: "1418",
|
|
plocki: "1419",
|
|
plonski: "1420",
|
|
pruszkowski: "1421",
|
|
przasnyski: "1422",
|
|
przysuski: "1423",
|
|
pultuski: "1424",
|
|
radomski: "1425",
|
|
siedlecki: "1426",
|
|
sierpecki: "1427",
|
|
sochaczewski: "1428",
|
|
sokolowski: "1429",
|
|
szydlowiecki: "1430",
|
|
warszawski: "1431",
|
|
warszawski_zachodni: "1432",
|
|
wegrowski: "1433",
|
|
wolominski: "1434",
|
|
wyszkowski: "1435",
|
|
zwolenski: "1436",
|
|
zurominski: "1437",
|
|
zyrardowski: "1438",
|
|
ostroleka: "1461",
|
|
plock: "1462",
|
|
radom: "1463",
|
|
siedlce: "1464",
|
|
warszawa: "1465",
|
|
};
|
|
|
|
function normalizeRegionName(value: string | null | undefined) {
|
|
return value
|
|
?.replace(/[Łł]/g, "l")
|
|
.normalize("NFD")
|
|
.replace(/[\u0300-\u036f]/g, "")
|
|
.toLocaleLowerCase("pl-PL")
|
|
.replace(/^powiat\s+/, "")
|
|
.replace(/^m\.\s*/, "")
|
|
.replace(/^miasto\s+/, "")
|
|
.replace(/\s+powiat$/, "")
|
|
.replace(/\s+/g, "_")
|
|
.replace(/[^a-z0-9_]/g, "")
|
|
.replace(/^warszawa_zachodnia$/, "warszawski_zachodni")
|
|
.trim() ?? "";
|
|
}
|
|
|
|
function normalizeTerytCountyCode(value: string) {
|
|
const code = value.trim();
|
|
return /^\d{4}/.test(code) ? code.slice(0, 4) : null;
|
|
}
|
|
|
|
export function getCountyTerytForLocation(province: string | null | undefined, district: string | null | undefined, locationName: string | null | undefined) {
|
|
const normalizedProvince = getProvinceForSelection(province, null);
|
|
if (normalizedProvince !== "mazowieckie") return null;
|
|
|
|
const normalizedDistrict = normalizeRegionName(district);
|
|
const districtMatch = normalizedDistrict ? mazowieckieCountyTerytByName[normalizedDistrict] : null;
|
|
if (districtMatch) return districtMatch;
|
|
|
|
const normalizedLocation = normalizeRegionName(locationName);
|
|
return normalizedLocation ? mazowieckieCountyTerytByName[normalizedLocation] ?? null : null;
|
|
}
|
|
|
|
export function warningMatchesCounty(warning: WeatherWarning, countyTeryt: string | null | undefined) {
|
|
if (!countyTeryt || !warning.terytCodes.length) return false;
|
|
return warning.terytCodes.some((code) => normalizeTerytCountyCode(code) === countyTeryt);
|
|
}
|
|
|
|
export function warningMatchesLocalSelection(warning: WeatherWarning, province: Province | null, selectedLocation?: SelectedLocation | null) {
|
|
if (warning.kind === "meteo" && selectedLocation?.countyTeryt) {
|
|
return warningMatchesCounty(warning, selectedLocation.countyTeryt);
|
|
}
|
|
return province ? warning.provinces.includes(province) : false;
|
|
}
|