Spaces:
Sleeping
Sleeping
| import { useEffect } from "react"; | |
| import { useMap } from "@vis.gl/react-google-maps"; | |
| import type { FC, SelectMeta } from "../../../lib/types"; | |
| import { sevColor } from "../../../lib/utils"; | |
| export default function NWSDataLayer({ | |
| nws, | |
| onSelect, | |
| }: { | |
| nws: FC | null; | |
| onSelect: (ll: [number, number], meta: SelectMeta) => void; | |
| }) { | |
| const map = useMap(); | |
| useEffect(() => { | |
| if (!map) return; | |
| map.data.forEach((f) => map.data.remove(f)); | |
| if (nws?.features?.length) { | |
| map.data.addGeoJson(nws as any); | |
| map.data.setStyle((f) => { | |
| const sev = (f.getProperty("severity") || "Unknown") as string; | |
| const color = sevColor(sev); | |
| return { | |
| strokeColor: color, | |
| strokeWeight: 1.2, | |
| fillColor: color, | |
| fillOpacity: 0.18, | |
| }; | |
| }); | |
| const clickListener = map.data.addListener( | |
| "click", | |
| (e: google.maps.Data.MouseEvent) => { | |
| const p: any = e.feature; | |
| const title = | |
| (p.getProperty && p.getProperty("event")) || "NWS Alert"; | |
| const sev = (p.getProperty && p.getProperty("severity")) || "Unknown"; | |
| const src = | |
| (p.getProperty && (p.getProperty("@id") || p.getProperty("id"))) || | |
| ""; | |
| if (e.latLng) { | |
| onSelect([e.latLng.lat(), e.latLng.lng()], { | |
| kind: "nws", | |
| title, | |
| severity: sev, | |
| sourceUrl: src || undefined, | |
| confidence: 1, | |
| emoji: "⚠️", | |
| raw: p?.g ?? p, | |
| }); | |
| } | |
| } | |
| ); | |
| return () => { | |
| google.maps.event.removeListener(clickListener); | |
| map.data.forEach((f) => map.data.remove(f)); | |
| }; | |
| } | |
| }, [map, nws, onSelect]); | |
| return null; | |
| } | |