Skip to content

Commit e5f6943

Browse files
committed
feat: add Rectangle
1 parent c5885de commit e5f6943

7 files changed

Lines changed: 186 additions & 1 deletion

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Google map react componentize project
1212
- [x] InfoWindow
1313
- [x] Polyline
1414
- [x] Polygon
15-
- [ ] Rectangle
15+
- [x] Rectangle
1616
- [ ] Circle
1717
- [ ] AdvancedMarkerView
1818
- [ ] MarkerClusterer

src/components/Rectangle/index.tsx

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

src/components/Rectangle/type.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
export interface RectangleEvent {
2+
onBoundsChanged?: (rectangle: google.maps.Rectangle) => void;
3+
onClick?: (
4+
rectangle: google.maps.Rectangle,
5+
event: google.maps.PolyMouseEvent,
6+
) => void;
7+
onContextmenu?: (
8+
rectangle: google.maps.Rectangle,
9+
event: google.maps.PolyMouseEvent,
10+
) => void;
11+
onDblClick?: (
12+
rectangle: google.maps.Rectangle,
13+
event: google.maps.PolyMouseEvent,
14+
) => void;
15+
onDrag?: (
16+
rectangle: google.maps.Rectangle,
17+
event: google.maps.MapMouseEvent,
18+
) => void;
19+
onDragEnd?: (
20+
rectangle: google.maps.Rectangle,
21+
event: google.maps.MapMouseEvent,
22+
) => void;
23+
onDragStart?: (
24+
rectangle: google.maps.Rectangle,
25+
event: google.maps.MapMouseEvent,
26+
) => void;
27+
onMouseDown?: (
28+
rectangle: google.maps.Rectangle,
29+
event: google.maps.PolyMouseEvent,
30+
) => void;
31+
onMouseMove?: (
32+
rectangle: google.maps.Rectangle,
33+
event: google.maps.PolyMouseEvent,
34+
) => void;
35+
onMouseOut?: (
36+
rectangle: google.maps.Rectangle,
37+
event: google.maps.PolyMouseEvent,
38+
) => void;
39+
onMouseOver?: (
40+
rectangle: google.maps.Rectangle,
41+
event: google.maps.PolyMouseEvent,
42+
) => void;
43+
onMouseUp?: (
44+
rectangle: google.maps.Rectangle,
45+
event: google.maps.PolyMouseEvent,
46+
) => void;
47+
}
48+
49+
export interface RectangleProps
50+
extends Partial<Omit<google.maps.RectangleOptions, 'map'>>,
51+
RectangleEvent {}

src/components/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export * from './Polyline/index';
1414
export * from './Polyline/type';
1515
export * from './Polygon/index';
1616
export * from './Polygon/type';
17+
export * from './Rectangle/index';
18+
export * from './Rectangle/type';
1719
export * from './Provider/MapProvider';
1820
export * from './Provider/MarkerProvider';
1921
export * from './Provider/CustomMarkerProvider';
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { RectangleEvent } from 'src/components/Rectangle/type';
2+
3+
import { useMvcObjectEventEffect } from './useMvcObjectEventEffect';
4+
5+
export const useApplyRectangleEvent = (
6+
rectangle: google.maps.Rectangle | null,
7+
{
8+
onBoundsChanged,
9+
onClick,
10+
onContextmenu,
11+
onDblClick,
12+
onDrag,
13+
onDragEnd,
14+
onDragStart,
15+
onMouseDown,
16+
onMouseMove,
17+
onMouseOut,
18+
onMouseOver,
19+
onMouseUp,
20+
}: RectangleEvent,
21+
) => {
22+
useMvcObjectEventEffect(rectangle, 'bounds_changed', onBoundsChanged);
23+
useMvcObjectEventEffect(rectangle, 'click', onClick);
24+
useMvcObjectEventEffect(rectangle, 'contextmenu', onContextmenu);
25+
useMvcObjectEventEffect(rectangle, 'dblclick', onDblClick);
26+
useMvcObjectEventEffect(rectangle, 'drag', onDrag);
27+
useMvcObjectEventEffect(rectangle, 'dragend', onDragEnd);
28+
useMvcObjectEventEffect(rectangle, 'dragstart', onDragStart);
29+
useMvcObjectEventEffect(rectangle, 'mousedown', onMouseDown);
30+
useMvcObjectEventEffect(rectangle, 'mousemove', onMouseMove);
31+
useMvcObjectEventEffect(rectangle, 'mouseout', onMouseOut);
32+
useMvcObjectEventEffect(rectangle, 'mouseover', onMouseOver);
33+
useMvcObjectEventEffect(rectangle, 'mouseup', onMouseUp);
34+
};
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 { RectangleEvent, RectangleProps } from '../components/Rectangle/type';
4+
5+
export const useApplyRectangleOptions = (
6+
polyline: google.maps.Rectangle | null,
7+
{ bounds, ...options }: Omit<RectangleProps, keyof RectangleEvent>,
8+
) => {
9+
useEffect(() => {
10+
polyline?.setOptions(options);
11+
}, Object.values(options));
12+
13+
useEffect(() => {
14+
polyline?.setBounds(bounds ?? null);
15+
}, [bounds]);
16+
};

src/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
Marker,
44
Polyline,
55
Polygon,
6+
Rectangle,
67
CustomMarker,
78
InfoWindow,
89
GoogleMap,
@@ -16,6 +17,7 @@ import type {
1617
MarkerProps,
1718
PolylineProps,
1819
PolygonProps,
20+
RectangleProps,
1921
CustomMarkerProps,
2022
InfoWindowProps,
2123
GoogleMapProps,
@@ -35,6 +37,7 @@ export {
3537
Marker,
3638
Polyline,
3739
Polygon,
40+
Rectangle,
3841
CustomMarker,
3942
InfoWindow,
4043
GoogleMap,
@@ -53,6 +56,7 @@ export type {
5356
MarkerProps,
5457
PolylineProps,
5558
PolygonProps,
59+
RectangleProps,
5660
InfoWindowProps,
5761
CustomMarkerProps,
5862
GoogleMapProps,
@@ -71,6 +75,7 @@ export default {
7175
Marker,
7276
Polyline,
7377
Polygon,
78+
Rectangle,
7479
CustomMarker,
7580
InfoWindow,
7681
GoogleMap,

0 commit comments

Comments
 (0)