From 352287bc38c1e74872266c21e01c2103b58d9cc3 Mon Sep 17 00:00:00 2001 From: zv Date: Tue, 2 Jun 2026 15:10:37 +0200 Subject: [PATCH] fix: stop treating rainfall total as current rain --- AGENTS.md | 1 + README.md | 2 ++ components/weather/weather-effects.tsx | 24 +----------------------- components/weather/weather-hero.tsx | 2 +- components/weather/weather-icon.tsx | 3 +-- lib/i18n.tsx | 12 ++++-------- lib/weather-utils.ts | 4 ---- types/imgw.ts | 2 +- 8 files changed, 11 insertions(+), 39 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 6fc6035..df9b355 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -37,6 +37,7 @@ Repozytorium nie ma obecnie skryptu testów, osobnego skryptu type-check ani for - Dodawaj `"use client"` tylko tam, gdzie komponent lub moduł korzysta z hooków, stanu przeglądarki albo interakcji. - Dane zewnętrzne pobieraj przez route handlery Next.js. Nie omijaj allowlisty w `app/api/imgw/[...path]/route.ts`. - Traktuj IMGW jako źródło bieżących pomiarów, hydro i ostrzeżeń. Prognozę Open-Meteo pokazuj oddzielnie jako prognozę modelową. Nie generuj fikcyjnych danych ani nie przedstawiaj prognozy jako pomiaru IMGW. +- `synop.suma_opadu` jest akumulowaną sumą opadu. Nie używaj jej jako sygnału, że pada w tej chwili, ani do sterowania animacją deszczu. - GPS wymaga świadomej zgody użytkownika i HTTPS. Zaokrąglaj współrzędne przed użyciem i utrzymuj widoczną atrybucję OpenStreetMap dla reverse geocodingu Nominatim. - Normalizuj zewnętrzne odpowiedzi i obsługuj `null`, puste pola oraz błędne wartości. Brak danych pokazuj jawnie zamiast uzupełniać estymacją. - Dla pobierania danych używaj TanStack Query z sensownym `queryKey`, cache i retry. W UI zachowuj loading, error, retry oraz empty states. diff --git a/README.md b/README.md index 34c5938..a9813ab 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,8 @@ Przeglądarka pobiera dane przez route handlery Next.js. Proxy IMGW w `app/api/i Publiczny endpoint synoptyczny IMGW udostępnia najnowszy pomiar, a nie pełną prognozę godzinową lub wielodniową i nie historię odczytów. Dlatego prognoza pochodzi z Open-Meteo i jest wyraźnie oddzielona od pomiarów IMGW. `wtr.` nie generuje fikcyjnych prognoz. Widok stacji prezentuje aktualne parametry i jawnie opisany snapshot pomiarowy. Brakujące wartości są oznaczane jako `Brak danych`. +Pole `suma_opadu` z endpointu synoptycznego jest prezentowane jako akumulowana suma opadu. Nie służy do wnioskowania, że w danej chwili pada, ani do uruchamiania animacji deszczu. + Czas aktualizacji parametrów hydrologicznych może się różnić. Interfejs pokazuje czas pomiaru, aby starsze odczyty nie wyglądały na bieżące. ## Struktura projektu diff --git a/components/weather/weather-effects.tsx b/components/weather/weather-effects.tsx index 77a2b25..21b8531 100644 --- a/components/weather/weather-effects.tsx +++ b/components/weather/weather-effects.tsx @@ -3,15 +3,6 @@ import { motion, useReducedMotion } from "framer-motion"; import type { SynopStation, WeatherMood } from "@/types/imgw"; -const rainDrops = Array.from({ length: 58 }, (_, index) => ({ - left: `${(index * 29 + 7) % 100}%`, - delay: (index % 11) * 0.13, - duration: 0.72 + (index % 6) * 0.1, - height: 15 + (index % 5) * 5, - opacity: 0.48 + (index % 4) * 0.1, - width: index % 5 === 0 ? 2 : 1, -})); - const windLines = Array.from({ length: 7 }, (_, index) => ({ top: `${18 + index * 11}%`, delay: index * 0.22, @@ -26,14 +17,11 @@ const stars = Array.from({ length: 16 }, (_, index) => ({ export function WeatherEffects({ station, mood }: { station: SynopStation; mood: WeatherMood }) { const reduceMotion = useReducedMotion(); - const rainfall = station.rainfall ?? 0; - const isRaining = rainfall >= 0.1; - const visibleDrops = rainfall >= 5 ? rainDrops : rainfall >= 1 ? rainDrops.slice(0, 44) : rainDrops.slice(0, 30); const isWindy = (station.windSpeed ?? 0) >= 8; return (