Skip to content

Commit 56a984b

Browse files
committed
feat: add Polygon
1 parent 6dd4ffc commit 56a984b

9 files changed

Lines changed: 153 additions & 2 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Google map react componentize project
1111
- [x] Controls
1212
- [x] InfoWindow
1313
- [x] Polyline
14-
- [ ] Polygon
14+
- [x] Polygon
1515
- [ ] Rectangle
1616
- [ ] Circle
1717
- [ ] AdvancedMarkerView

src/components/Polygon/index.tsx

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { forwardRef, useEffect, useState } from 'react';
2+
3+
import { PolygonProps } from './type';
4+
import { useApplyPolygonEvent } from '../../hooks/useApplyPolygonEvent';
5+
import { useApplyPolygonOptions } from '../../hooks/useApplyPolygonOptions';
6+
import { passRef } from '../../utils/passRef';
7+
import { useMapContext } from '../Provider/MapProvider';
8+
9+
export const Polygon = forwardRef<google.maps.Polygon, PolygonProps>(
10+
function Polygon(
11+
{
12+
clickable,
13+
draggable,
14+
editable,
15+
fillColor,
16+
fillOpacity,
17+
geodesic,
18+
paths,
19+
strokeColor,
20+
strokeOpacity,
21+
strokePosition,
22+
strokeWeight,
23+
visible,
24+
zIndex,
25+
...events
26+
},
27+
ref,
28+
) {
29+
const map = useMapContext();
30+
31+
const [Polygon, setPolygon] = useState<google.maps.Polygon | null>(null);
32+
33+
useEffect(() => {
34+
const Polygon = new google.maps.Polygon({
35+
map,
36+
clickable,
37+
draggable,
38+
editable,
39+
fillColor,
40+
fillOpacity,
41+
geodesic,
42+
paths,
43+
strokeColor,
44+
strokeOpacity,
45+
strokePosition,
46+
strokeWeight,
47+
visible,
48+
zIndex,
49+
});
50+
51+
setPolygon(Polygon);
52+
passRef(ref, Polygon);
53+
54+
return () => {
55+
Polygon.setMap(null);
56+
};
57+
}, []);
58+
59+
useApplyPolygonOptions(Polygon, {
60+
clickable,
61+
draggable,
62+
editable,
63+
fillColor,
64+
fillOpacity,
65+
geodesic,
66+
paths,
67+
strokeColor,
68+
strokeOpacity,
69+
strokePosition,
70+
strokeWeight,
71+
visible,
72+
zIndex,
73+
});
74+
useApplyPolygonEvent(Polygon, events);
75+
76+
return null;
77+
},
78+
);

src/components/Polygon/type.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export interface PolygonEvent {
2+
onClick?: (event: google.maps.PolyMouseEvent) => void;
3+
onContextmenu?: (event: google.maps.PolyMouseEvent) => void;
4+
onDblClick?: (event: google.maps.PolyMouseEvent) => void;
5+
onDrag?: (event: google.maps.MapMouseEvent) => void;
6+
onDragEnd?: (event: google.maps.MapMouseEvent) => void;
7+
onDragStart?: (event: google.maps.MapMouseEvent) => void;
8+
onMouseDown?: (event: google.maps.PolyMouseEvent) => void;
9+
onMouseMove?: (event: google.maps.PolyMouseEvent) => void;
10+
onMouseOut?: (event: google.maps.PolyMouseEvent) => void;
11+
onMouseOver?: (event: google.maps.PolyMouseEvent) => void;
12+
onMouseUp?: (event: google.maps.PolyMouseEvent) => void;
13+
}
14+
15+
export interface PolygonProps
16+
extends Partial<Omit<google.maps.PolygonOptions, 'map'>>,
17+
PolygonEvent {}

src/components/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export * from './Marker/index';
1212
export * from './Marker/type';
1313
export * from './Polyline/index';
1414
export * from './Polyline/type';
15+
export * from './Polygon/index';
16+
export * from './Polygon/type';
1517
export * from './Provider/MapProvider';
1618
export * from './Provider/MarkerProvider';
1719
export * from './Provider/CustomMarkerProvider';

src/hooks/useApplyPolygonEvent.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { PolygonEvent } from 'src/components/Polygon/type';
2+
3+
import { useMvcObjectEventEffect } from './useMvcObjectEventEffect';
4+
5+
export const useApplyPolygonEvent = (
6+
polygon: google.maps.Polygon | null,
7+
{
8+
onClick,
9+
onContextmenu,
10+
onDblClick,
11+
onDrag,
12+
onDragEnd,
13+
onDragStart,
14+
onMouseDown,
15+
onMouseMove,
16+
onMouseOut,
17+
onMouseOver,
18+
onMouseUp,
19+
}: PolygonEvent,
20+
) => {
21+
useMvcObjectEventEffect(polygon, 'click', onClick);
22+
useMvcObjectEventEffect(polygon, 'contextmenu', onContextmenu);
23+
useMvcObjectEventEffect(polygon, 'dblclick', onDblClick);
24+
useMvcObjectEventEffect(polygon, 'drag', onDrag);
25+
useMvcObjectEventEffect(polygon, 'dragend', onDragEnd);
26+
useMvcObjectEventEffect(polygon, 'dragstart', onDragStart);
27+
useMvcObjectEventEffect(polygon, 'mousedown', onMouseDown);
28+
useMvcObjectEventEffect(polygon, 'mousemove', onMouseMove);
29+
useMvcObjectEventEffect(polygon, 'mouseout', onMouseOut);
30+
useMvcObjectEventEffect(polygon, 'mouseover', onMouseOver);
31+
useMvcObjectEventEffect(polygon, 'mouseup', onMouseUp);
32+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { useEffect } from 'react';
2+
3+
import { PolygonEvent, PolygonProps } from '../components/Polygon/type';
4+
5+
export const useApplyPolygonOptions = (
6+
polyline: google.maps.Polygon | null,
7+
{ paths, ...options }: Omit<PolygonProps, keyof PolygonEvent>,
8+
) => {
9+
useEffect(() => {
10+
polyline?.setOptions(options);
11+
}, Object.values(options));
12+
13+
useEffect(() => {
14+
polyline?.setPaths(paths ?? []);
15+
}, [paths]);
16+
};

src/hooks/useApplyPolylineOptions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const useApplyPolylineOptions = (
1111
}, Object.values(options));
1212

1313
useEffect(() => {
14+
// console.log(path);
1415
polyline?.setPath(path ?? []);
1516
}, [path]);
1617
};

src/hooks/useMvcObjectEventEffect.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ export const useMvcObjectEventEffect = (
1313
const listener = tg.addListener(key, callback);
1414

1515
return () => google.maps.event.removeListener(listener);
16-
}, [callback]);
16+
}, [tg, callback]);

src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
Control,
33
Marker,
44
Polyline,
5+
Polygon,
56
CustomMarker,
67
InfoWindow,
78
GoogleMap,
@@ -14,6 +15,7 @@ import type {
1415
ControlProps,
1516
MarkerProps,
1617
PolylineProps,
18+
PolygonProps,
1719
CustomMarkerProps,
1820
InfoWindowProps,
1921
GoogleMapProps,
@@ -32,6 +34,7 @@ export {
3234
Control,
3335
Marker,
3436
Polyline,
37+
Polygon,
3538
CustomMarker,
3639
InfoWindow,
3740
GoogleMap,
@@ -49,6 +52,7 @@ export type {
4952
ControlProps,
5053
MarkerProps,
5154
PolylineProps,
55+
PolygonProps,
5256
InfoWindowProps,
5357
CustomMarkerProps,
5458
GoogleMapProps,
@@ -66,6 +70,7 @@ export default {
6670
Control,
6771
Marker,
6872
Polyline,
73+
Polygon,
6974
CustomMarker,
7075
InfoWindow,
7176
GoogleMap,

0 commit comments

Comments
 (0)