90 lines
2.5 KiB
JavaScript

import * as React from 'react';
import {useState, useRef, useCallback} from 'react';
import {render} from 'react-dom';
import MapGL from 'react-map-gl';
import {Editor, DrawPolygonMode, EditingMode} from 'react-map-gl-draw';
import ControlPanel from './control-panel';
import {getFeatureStyle, getEditHandleStyle} from './style';
const TOKEN = ''; // Set your mapbox token here
export default function App() {
const [viewport, setViewport] = useState({
longitude: -91.874,
latitude: 42.76,
zoom: 12
});
const [mode, setMode] = useState(null);
const [selectedFeatureIndex, setSelectedFeatureIndex] = useState(null);
const editorRef = useRef(null);
const onSelect = useCallback(options => {
setSelectedFeatureIndex(options && options.selectedFeatureIndex);
}, []);
const onDelete = useCallback(() => {
if (selectedFeatureIndex !== null && selectedFeatureIndex >= 0) {
editorRef.current.deleteFeatures(selectedFeatureIndex);
}
}, [selectedFeatureIndex]);
const onUpdate = useCallback(({editType}) => {
if (editType === 'addFeature') {
setMode(new EditingMode());
}
}, []);
const drawTools = (
<div className="mapboxgl-ctrl-top-left">
<div className="mapboxgl-ctrl-group mapboxgl-ctrl">
<button
className="mapbox-gl-draw_ctrl-draw-btn mapbox-gl-draw_polygon"
title="Polygon tool (p)"
onClick={() => setMode(new DrawPolygonMode())}
/>
<button
className="mapbox-gl-draw_ctrl-draw-btn mapbox-gl-draw_trash"
title="Delete"
onClick={onDelete}
/>
</div>
</div>
);
const features = editorRef.current && editorRef.current.getFeatures();
const selectedFeature =
features && (features[selectedFeatureIndex] || features[features.length - 1]);
return (
<>
<MapGL
{...viewport}
width="100%"
height="100%"
mapStyle="mapbox://styles/mapbox/satellite-v9"
mapboxApiAccessToken={TOKEN}
onViewportChange={setViewport}
>
<Editor
ref={editorRef}
style={{width: '100%', height: '100%'}}
clickRadius={12}
mode={mode}
onSelect={onSelect}
onUpdate={onUpdate}
editHandleShape={'circle'}
featureStyle={getFeatureStyle}
editHandleStyle={getEditHandleStyle}
/>
{drawTools}
</MapGL>
<ControlPanel polygon={selectedFeature} />
</>
);
}
export function renderToDom(container) {
render(<App />, container);
}