Skip to content

Commit 9bd33a0

Browse files
Update and rename useLeafletEditable.js to useLeafletEditable.ts
1 parent ae716f0 commit 9bd33a0

File tree

2 files changed

+200
-123
lines changed

2 files changed

+200
-123
lines changed

leaflet-editable-hook/src/hooks/useLeafletEditable.js

Lines changed: 0 additions & 123 deletions
This file was deleted.
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
import { useMemo, useCallback, useEffect } from "react";
2+
import {
3+
Polyline,
4+
Marker,
5+
Polygon,
6+
Circle,
7+
Rectangle,
8+
CircleMarker,
9+
LayerEvent,
10+
LeafletMouseEvent,
11+
} from "leaflet";
12+
import { useMap } from "react-leaflet";
13+
14+
const eventHandlers = Object.freeze({
15+
onCreated: "editable:created",
16+
onEnable: "editable:enable",
17+
onDisable: "editable:disable",
18+
onEditing: "editable:editing",
19+
onDragStart: "editable:dragstart",
20+
onDrag: "editable:drag",
21+
onDragEnd: "editable:dragend",
22+
onDrawingStart: "editable:drawing:start",
23+
onDrawingEnd: "editable:drawing:end",
24+
onDrawingCancel: "editable:drawing:cancel",
25+
onDrawingCommit: "editable:drawing:commit",
26+
onDrawingMousedown: "editable:drawing:mousedown",
27+
onDrawingMouseup: "editable:drawing:mouseup",
28+
onDrawingClick: "editable:drawing:click",
29+
onDrawingMove: "editable:drawing:move",
30+
onDrawingClicked: "editable:drawing:clicked",
31+
onVertexNew: "editable:vertex:new",
32+
onVertexClick: "editable:vertex:click",
33+
onVertexClicked: "editable:vertex:clicked",
34+
onVertexRawclick: "editable:vertex:rawclick",
35+
onVertexDeleted: "editable:vertex:deleted",
36+
onVertexCtrlclick: "editable:vertex:ctrlclick",
37+
onVertexShiftclick: "editable:vertex:shiftclick",
38+
onVertexMetakeyclick: "editable:vertex:metakeyclick",
39+
onVertexAltclick: "editable:vertex:altclick",
40+
onVertexContextmenu: "editable:vertex:contextmenu",
41+
onVertexMousedown: "editable:vertex:mousedown",
42+
onVertexDrag: "editable:vertex:drag",
43+
onVertexDragstart: "editable:vertex:dragstart",
44+
onVertexDragend: "editable:vertex:dragend",
45+
onMiddlemarkerMousedown: "editable:middlemarker:mousedown",
46+
onShapeNew: "editable:shape:new",
47+
onShapeDelete: "editable:shape:delete",
48+
onShapeDeleted: "editable:shape:deleted",
49+
});
50+
51+
// Define the types for the events object
52+
type LeafletEditableEventHandlers = {
53+
onCreated?: (e: LayerEvent) => void;
54+
onEnable?: (e: LayerEvent) => void;
55+
onDisable?: (e: LayerEvent) => void;
56+
onEditing?: (e: LayerEvent) => void;
57+
onDragStart?: (e: LayerEvent) => void;
58+
onDrag?: (e: LayerEvent) => void;
59+
onDragEnd?: (e: LayerEvent) => void;
60+
onDrawingStart?: (e: LayerEvent) => void;
61+
onDrawingEnd?: (e: LayerEvent) => void;
62+
onDrawingCancel?: (e: LayerEvent) => void;
63+
onDrawingCommit?: (e: LayerEvent) => void;
64+
onDrawingMousedown?: (e: LayerEvent) => void;
65+
onDrawingMouseup?: (e: LayerEvent) => void;
66+
onDrawingClick?: (e: LayerEvent) => void;
67+
onDrawingMove?: (e: LayerEvent) => void;
68+
onDrawingClicked?: (e: LayerEvent) => void;
69+
onVertexNew?: (e: LayerEvent) => void;
70+
onVertexClick?: (e: LayerEvent) => void;
71+
onVertexClicked?: (e: LayerEvent) => void;
72+
onVertexRawclick?: (e: LayerEvent) => void;
73+
onVertexDeleted?: (e: LayerEvent) => void;
74+
onVertexCtrlclick?: (e: LayerEvent) => void;
75+
onVertexShiftclick?: (e: LayerEvent) => void;
76+
onVertexMetakeyclick?: (e: LayerEvent) => void;
77+
onVertexAltclick?: (e: LayerEvent) => void;
78+
onVertexContextmenu?: (e: LayerEvent) => void;
79+
onVertexMousedown?: (e: LayerEvent) => void;
80+
onVertexDrag?: (e: LayerEvent) => void;
81+
onVertexDragstart?: (e: LayerEvent) => void;
82+
onVertexDragend?: (e: LayerEvent) => void;
83+
onMiddlemarkerMousedown?: (e: LayerEvent) => void;
84+
onShapeNew?: (e: LayerEvent) => void;
85+
onShapeDelete?: (e: LayerEvent) => void;
86+
onShapeDeleted?: (e: LayerEvent) => void;
87+
};
88+
89+
interface UseLeafletEditableOptions {
90+
events: LeafletEditableEventHandlers;
91+
}
92+
93+
function useLeafletEditable({ events }: UseLeafletEditableOptions) {
94+
const map = useMap();
95+
96+
useEffect(() => {
97+
const keys = Object.keys(eventHandlers) as Array<
98+
keyof typeof eventHandlers
99+
>;
100+
keys.forEach((key) => {
101+
const handler = events[key];
102+
if (handler) {
103+
map.on(eventHandlers[key], handler);
104+
}
105+
});
106+
107+
return () => {
108+
keys.forEach((key) => {
109+
const handler = events[key];
110+
if (handler) {
111+
map.off(eventHandlers[key], handler);
112+
}
113+
});
114+
};
115+
}, [map, events]);
116+
const drawing = useMemo(() => map.editTools.drawing(), [map]);
117+
118+
const stopDrawing = useCallback(() => map.editTools.stopDrawing(), [map]);
119+
120+
const commitDrawing = useCallback(
121+
(e: LeafletMouseEvent) => map.editTools.commitDrawing(e),
122+
[map],
123+
);
124+
125+
const startPolyline = useCallback(
126+
(latlng, options) => map.editTools.startPolyline(latlng, options),
127+
[map],
128+
);
129+
130+
const startPolygon = useCallback(
131+
(latlng, options) => map.editTools.startPolygon(latlng, options),
132+
[map],
133+
);
134+
135+
const startMarker = useCallback(
136+
(latlng, options) => map.editTools.startMarker(latlng, options),
137+
[map],
138+
);
139+
140+
const startRectangle = useCallback(
141+
(latlng, options) => map.editTools.startRectangle(latlng, options),
142+
[map],
143+
);
144+
145+
const startCircle = useCallback(
146+
(latlng, options) => map.editTools.startCircle(latlng, options),
147+
[map],
148+
);
149+
150+
const clearAll = useCallback(() => map.editTools.clearLayers(), [map]);
151+
152+
// BaseEditor related methods
153+
const enableEditing = useCallback(
154+
(feature: L.Layer) => {
155+
if (
156+
feature instanceof Marker ||
157+
feature instanceof Polyline ||
158+
feature instanceof Polygon ||
159+
feature instanceof Rectangle ||
160+
feature instanceof Circle ||
161+
feature instanceof CircleMarker
162+
) {
163+
//console.log(feature);
164+
feature.enableEdit();
165+
}
166+
},
167+
[map],
168+
);
169+
170+
const disableEditing = useCallback(
171+
(feature: L.Layer) => {
172+
if (
173+
feature instanceof Marker ||
174+
feature instanceof Polyline ||
175+
feature instanceof Polygon ||
176+
feature instanceof Rectangle ||
177+
feature instanceof Circle
178+
) {
179+
feature.disableEdit();
180+
}
181+
},
182+
[map],
183+
);
184+
185+
return {
186+
drawing,
187+
stopDrawing,
188+
commitDrawing,
189+
startPolyline,
190+
startPolygon,
191+
startMarker,
192+
startRectangle,
193+
startCircle,
194+
clearAll,
195+
enableEditing,
196+
disableEditing,
197+
};
198+
}
199+
200+
export default useLeafletEditable;

0 commit comments

Comments
 (0)