import { useMapStore } from "_store/mapStore"; import { Marker as LMarker } from "leaflet"; import { Fragment, useEffect, useRef } from "react"; import { Marker, Polygon, Popup } from "react-leaflet"; import L from "leaflet"; import { useQuery } from "@tanstack/react-query"; import { getMissionsAPI } from "querys/missions"; import { OSMWay } from "@repo/db"; export const SearchElements = () => { const { searchElements, searchPopup, setSearchPopup, setContextMenu, openMissionMarker, } = useMapStore(); const missions = useQuery({ queryKey: ["missions"], queryFn: () => getMissionsAPI({ OR: [ { state: "draft", }, { state: "running", }, ], }), }); const poppupRef = useRef(null); const searchPopupElement = searchElements.find( (element) => element.wayID === searchPopup?.elementId, ); const SearchElement = ({ element, isActive = false, }: { element: (typeof searchElements)[1]; isActive?: boolean; }) => { const ref = useRef(null); useEffect(() => { if (ref.current) { ref.current.on("click", () => { const center = ref.current?.getBounds().getCenter(); if (center && searchPopup?.elementId !== element.wayID) { setSearchPopup({ lat: center.lat, lng: center.lng, elementId: element.wayID, }); } else { setSearchPopup(null); } setContextMenu(null); }); } }, []); if (!element.nodes) return null; return ( [node.lat, node.lon])} color={ searchPopup?.elementId === element.wayID || isActive ? "#ff4500" : "#46b7a3" } ref={ref} /> ); }; const SearchElementPopup = ({ element, }: { element: (typeof searchElements)[1]; }) => { if (!searchPopup) return null; return (

{element.tags?.building === "yes" ? "Gebäude" : element.tags?.building} {!element.tags?.building && "unbekannt"}

{element.tags?.["addr:street"]} {element.tags?.["addr:housenumber"]}

{element.tags?.["addr:suburb"]} {element.tags?.["addr:postcode"]}

); }; return ( <> {openMissionMarker.map(({ id }) => { const mission = missions.data?.find((m) => m.id === id); if (!mission) return null; return ( {(mission.addressOSMways as (OSMWay | null)[]) .filter((element): element is OSMWay => element !== null) .map((element: OSMWay, i) => ( ))} ); })} {searchElements.map((element, i) => { if ( missions.data?.some( (mission) => (mission.addressOSMways as (OSMWay | null)[]) .filter((e): e is OSMWay => e !== null) .some((e) => e.wayID === element.wayID) && openMissionMarker.some((m) => m.id === mission.id), ) ) return null; return ( ); })} {searchPopup && ( {!searchPopupElement && (
)}
)} {searchPopupElement && ( )} ); };