January 15, 2026
Radar labeling corrected to reflect discrete frame nature
Link ↗Radar modal labels were updated to accurately represent RainViewer data as discrete observed snapshots rather than real-time streams.
What changed
- Replaced "Live" button with "Latest" to clarify it jumps to the most recent observed frame, not a live stream.
- Changed timestamp format from "Updated" to "Observed" to reflect that frames are static snapshots captured at specific times.
- Updated "Now" age label to "Latest" for frames less than 2 minutes old, removing false real-time implication.
- Refined legend disclaimer from vague "qualitative, not exact dBZ" to technically accurate "relative reflectivity (not calibrated dBZ)".
Copy-only changes. No data sources, animation behavior, or frame timing changed. Prevents user misinterpretation of discrete radar frames as continuous real-time feeds.
Radar modal lifecycle cleanup hardened
Link ↗Fixed React lifecycle edge case where rapid open/close of the radar modal could trigger console warnings about state updates on unmounted components.
What changed
- Added mounted guard to prevent async fetch continuations from calling setState after modal unmounts.
- Removed unnecessary state setters from cleanup function (component is unmounting, state updates are no-ops).
- Preserved all external cleanup: AbortController, Leaflet map removal, and ref clearing remain unchanged.
Internal cleanup only. No visual or behavioral changes. Eliminates console warnings without affecting radar functionality.
GPS loading state reliability improved for first-visit edge case
Link ↗Fixed rare first-visit edge case where manual GPS refresh could leave the loading indicator active indefinitely if reverse geocoding failed.
What changed
- Added .finally() handler to first-visit reverseGeocode call to guarantee loading state clears within bounded time (8-second timeout).
- Preserved fast-path behavior: when weather data already exists, loading clears after reverse geocode completes.
- Guard prevents clearing loading if main weather fetch has started (avoids race condition).
Affects only first-visit GPS flow when reverse geocoding fails (network error, timeout, or abort). Subsequent visits already had correct cleanup. Loading now always clears correctly.