import { useEffect, useState, useRef, useMemo, useCallback } from "react"; import { MapContainer, TileLayer, Marker, Popup, Circle } from "react-leaflet"; import { RoundToFixDecimals } from "lib/utils"; import { supabase } from "lib/api"; import TextLog from "components/TextLog"; function DraggableMarker({ initialPos, addCircle }) { const [position, setPosition] = useState(initialPos); const markerRef = useRef(null); const eventHandlers = useMemo( () => ({ dragend() { const marker = markerRef.current; const pos = marker.getLatLng(); if (addCircle) addCircle(pos); if (marker) setPosition(pos); }, }), [addCircle] ); return ( {`lat: ${position.lat}`}
{`long: ${position.lng}`}
); } function MapInput({ clientRef, center, zoom }) { const [log, setLog] = useState(undefined); const [circles, setCircles] = useState([]); useEffect(() => { let newLog = `Ref: ${clientRef}\nReady to send location...`; newLog += circles.map((item) => { return `\nsent lat=${RoundToFixDecimals( item.lat )} long=${RoundToFixDecimals(item.lng)}`; }); setLog(newLog); }, [circles, clientRef]); const onAddCircle = useCallback( async (pos) => { setCircles([...circles, pos]); // insert new location await supabase .from("locations") .insert([ { latitude: pos.lat, longitude: pos.lng, user_id: clientRef }, ]); }, [setCircles, circles, supabase, clientRef] ); function renderCircles() { return circles.map((item, index) => ( )); } return (
{renderCircles()}
); } export default MapInput;