Files
var-monorepo/apps/dispatch/app/(dispatch)/_components/map/SearchElements.tsx
2025-04-08 09:16:00 -07:00

75 lines
1.7 KiB
TypeScript

import { useMapStore } from "_store/mapStore";
import { Marker as LMarker } from "leaflet";
import { Ref, use, useEffect, useRef } from "react";
import { Marker, Polygon, Polyline, Popup } from "react-leaflet";
import L from "leaflet";
export const SearchElements = () => {
const { searchElements, searchPopup, setSearchPopup } = useMapStore();
const poppupRef = useRef<LMarker>(null);
useEffect(() => {
if (searchPopup?.isOpen) {
poppupRef.current?.openPopup();
} else {
poppupRef.current?.closePopup();
}
}, [searchPopup]);
const SearchElement = ({
element,
}: {
element: (typeof searchElements)[1];
}) => {
const ref = useRef<any>(null);
useEffect(() => {
if (ref.current) {
console.log(ref.current);
ref.current.on("click", () => {
console.log("click");
const center = ref.current.getBounds().getCenter();
setSearchPopup({
isOpen: true,
lat: center.lat,
lng: center.lng,
elementId: element.id,
});
console.log(element);
});
}
}, []);
return (
<Polygon
key={element.id}
positions={element.nodes.map((node) => [node.lat, node.lon])}
color="#46b7a3"
ref={ref}
/>
);
};
return (
<>
{searchElements.map((element) => {
return <SearchElement key={element.id} element={element} />;
})}
{searchPopup && (
<Marker
position={[searchPopup.lat, searchPopup.lng]}
ref={poppupRef}
icon={new L.DivIcon()}
opacity={0}
>
<Popup>
<div className="absolute z-1000 opacity-100 pointer-events-auto w-[500px] text-white">
<div className="bg-red-600 w-7 h-6">test</div>
</div>
</Popup>
</Marker>
)}
</>
);
};