Skip to content

Instantly share code, notes, and snippets.

@paveltretyakovru
Last active August 5, 2021 18:54
Show Gist options
  • Save paveltretyakovru/4534b632d9cf5b9d714837734870a04b to your computer and use it in GitHub Desktop.
Save paveltretyakovru/4534b632d9cf5b9d714837734870a04b to your computer and use it in GitHub Desktop.
React Mapbox-GL draggable marker component
import MapboxGL from 'mapbox-gl';
import React, { useEffect, useRef, useState, MutableRefObject } from 'react';
type CoordinatesType = [number, number];
interface DraggableMarkerProps {
coordinates: CoordinatesType;
map?: MapboxGL.Map;
children?: any;
}
export const DraggableMarkerComponent = ({ coordinates, map, children }: DraggableMarkerProps) => {
const element = useRef() as MutableRefObject<HTMLDivElement>;
const [marker, setMarker] = useState<MapboxGL.Marker>();
useEffect(() => {
if (marker && map) {
marker.setLngLat(coordinates).addTo(map);
}
return () => {
if (marker) {
marker.remove();
}
}
}, [marker, map]);
useEffect(() => {
if (element.current !== null && map) {
setMarker(new MapboxGL.Marker({
draggable: true, element: element.current
}));
}
}, [element, map]);
return (<div ref={element}>{children}</div>);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment