"use client"; import { useEffect, useMemo, useState } from "react"; import Link from "next/link"; import { motion } from "framer-motion"; import { AlertTriangle, ArrowRight, CalendarClock } from "lucide-react"; import { useWarnings } from "@/hooks/use-warnings"; import { DEFAULT_STATION_ID } from "@/lib/constants"; import { useI18n } from "@/lib/i18n"; import { formatProvinceName, getProvinceForSelection } from "@/lib/provinces"; import { useWeatherStore } from "@/lib/store"; import { formatDateTime } from "@/lib/weather-utils"; import type { WeatherWarning } from "@/types/imgw"; const MAX_VISIBLE_WARNINGS = 2; function getTimestamp(value: string | null) { if (!value) return null; const timestamp = new Date(value).getTime(); return Number.isNaN(timestamp) ? null : timestamp; } function isWarningActive(warning: WeatherWarning, now: number) { const validFrom = getTimestamp(warning.validFrom); return validFrom === null || validFrom <= now; } function compareDashboardWarnings(a: WeatherWarning, b: WeatherWarning, now: number) { const activeDifference = Number(isWarningActive(b, now)) - Number(isWarningActive(a, now)); if (activeDifference) return activeDifference; const levelDifference = (b.level ?? 0) - (a.level ?? 0); if (levelDifference) return levelDifference; return (getTimestamp(a.validFrom) ?? 0) - (getTimestamp(b.validFrom) ?? 0); } export function DashboardWarnings() { const { data: warnings } = useWarnings(); const { language, t } = useI18n(); const selectedStationId = useWeatherStore((state) => state.selectedStationId); const selectedLocation = useWeatherStore((state) => state.selectedLocation); const [now, setNow] = useState(null); useEffect(() => { const timeoutId = window.setTimeout(() => setNow(Date.now()), 0); const intervalId = window.setInterval(() => setNow(Date.now()), 30_000); return () => { window.clearTimeout(timeoutId); window.clearInterval(intervalId); }; }, []); const province = getProvinceForSelection(selectedLocation?.province, selectedStationId ?? DEFAULT_STATION_ID); const relevantWarnings = useMemo(() => { if (!warnings || !province || now === null) return []; return warnings .filter((warning) => { const validTo = getTimestamp(warning.validTo); return warning.kind === "meteo" && warning.provinces.includes(province) && (validTo === null || validTo > now); }) .sort((a, b) => compareDashboardWarnings(a, b, now)); }, [now, province, warnings]); if (!province || !relevantWarnings.length || now === null) return null; const visibleWarnings = relevantWarnings.slice(0, MAX_VISIBLE_WARNINGS); const hiddenWarningsCount = relevantWarnings.length - visibleWarnings.length; return (

IMGW · {formatProvinceName(province, language)}

{t("warnings.dashboard.title")}

{t("warnings.dashboard.viewAll")}
{visibleWarnings.map((warning) => { const active = isWarningActive(warning, now); const validityLabel = active ? warning.validTo && t("warnings.dashboard.validUntil", { date: formatDateTime(warning.validTo, language) }) : warning.validFrom && t("warnings.dashboard.validFrom", { date: formatDateTime(warning.validFrom, language) }); return (

{t(active ? "warnings.dashboard.active" : "warnings.dashboard.upcoming")} {warning.level !== null && ` · ${t("warnings.level", { level: warning.level })}`}

{warning.title || t("warnings.genericMeteo")}

{validityLabel && (

)}
); })}
{hiddenWarningsCount > 0 && (

{t("warnings.dashboard.more", { count: hiddenWarningsCount })}

)}
); }