import { TileLayer, MapContainer, useMapEvents } from "react-leaflet"; import "leaflet/dist/leaflet.css"; import * as React from "react"; import { LayerProps, UtopiaMapProps } from "../../types" import "./UtopiaMap.css" import { LatLng } from "leaflet"; import MarkerClusterGroup from 'react-leaflet-cluster' import AddButton from "./Subcomponents/AddButton"; import { useState } from "react"; import { ItemFormPopupProps } from "./Subcomponents/ItemFormPopup"; import { ItemsProvider } from "./hooks/useItems"; import { TagsProvider } from "./hooks/useTags"; import { LayersProvider } from "./hooks/useLayers"; import { FilterProvider } from "./hooks/useFilter"; import { SearchControl } from "./Subcomponents/Controls/SearchControl"; import { PermissionsProvider } from "./hooks/usePermissions"; import { LeafletRefsProvider } from "./hooks/useLeafletRefs"; import { LayerControl } from "./Subcomponents/Controls/LayerControl"; import { QuestControl } from "./Subcomponents/Controls/QuestControl"; import { Control } from "./Subcomponents/Controls/Control"; import { Outlet } from "react-router-dom"; import { TagsControl } from "./Subcomponents/Controls/TagsControl"; export interface MapEventListenerProps { selectNewItemPosition: LayerProps | null, setSelectNewItemPosition: React.Dispatch, setItemFormPopup: React.Dispatch> } // for refreshing map on resize (needs to be implemented) const mapDivRef = React.createRef(); function UtopiaMap({ height = "500px", width = "100%", center = new LatLng(50.6, 9.5), zoom = 10, children } : UtopiaMapProps) { let meta = document.getElementsByTagName('meta') const [metaTags, setMetaTags] = useState>(meta); function MapEventListener(props: MapEventListenerProps) { useMapEvents({ click: (e) => { window.history.pushState({}, "", "/"); document.title = document.title.split("-")[0]; document.querySelector('meta[property="og:title"]')?.setAttribute("content", document.title); document.querySelector('meta[property="og:description"]')?.setAttribute("content", `${document.querySelector('meta[name="description"]')?.getAttribute("content")}`); meta = metaTags; console.log(e.latlng.lat + ',' + e.latlng.lng); if (props.selectNewItemPosition != null) { props.setItemFormPopup({ layer: props.selectNewItemPosition, position: e.latlng }) props.setSelectNewItemPosition(null) } }, }) return null } const [selectNewItemPosition, setSelectNewItemPosition] = useState(null); const [itemFormPopup, setItemFormPopup] = useState(null); const clusterRef = React.useRef(); return ( <>
{ React.Children.toArray(children).map((child) => React.isValidElement<{ setItemFormPopup: React.Dispatch>, itemFormPopup: ItemFormPopupProps | null, clusterRef: React.MutableRefObject }>(child) ? React.cloneElement(child, { setItemFormPopup: setItemFormPopup, itemFormPopup: itemFormPopup, clusterRef: clusterRef }) : child ) } {selectNewItemPosition != null &&
Select {selectNewItemPosition.name} position!
}
); } export { UtopiaMap };