Skip to content

Commit 4511d87

Browse files
committed
feat(Rectangle): add new componet
* Thanks to @alistairjcbrown * Closes #80
1 parent f60e61d commit 4511d87

File tree

4 files changed

+155
-0
lines changed

4 files changed

+155
-0
lines changed

src/Rectangle.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import {
2+
default as React,
3+
Component,
4+
} from "react";
5+
6+
import {
7+
default as RectangleCreator,
8+
rectangleDefaultPropTypes,
9+
rectangleControlledPropTypes,
10+
rectangleEventPropTypes
11+
} from "./creators/_RectangleCreator";
12+
13+
/*
14+
* Original author: @alistairjcbrown
15+
* Original PR: https://github.com/tomchentw/react-google-maps/pull/80
16+
*/
17+
export default class Rectangle extends Component {
18+
static propTypes = {
19+
// Uncontrolled default[props] - used only in componentDidMount
20+
...rectangleDefaultPropTypes,
21+
// Controlled [props] - used in componentDidMount/componentDidUpdate
22+
...rectangleControlledPropTypes,
23+
// Event [onEventName]
24+
...rectangleEventPropTypes,
25+
}
26+
27+
// Public APIs
28+
//
29+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Rectangle
30+
//
31+
// [].map.call($0.querySelectorAll("tr>td>code"), function(it){ return it.textContent; }).filter(function(it){ return it.match(/^get/) && !it.match(/^getMap/); })
32+
getBounds () { return this.state.rectangle.getBounds(); }
33+
34+
getDraggable () { return this.state.rectangle.getDraggable(); }
35+
36+
getEditable () { return this.state.rectangle.getEditable(); }
37+
38+
getVisible () { return this.state.rectangle.getVisible(); }
39+
// END - Public APIs
40+
//
41+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Rectangle
42+
43+
state = {
44+
}
45+
46+
componentDidMount () {
47+
const {mapHolderRef, ...rectangleProps} = this.props;
48+
const rectangle = RectangleCreator._createRectangle(mapHolderRef, rectangleProps);
49+
50+
this.setState({ rectangle });
51+
}
52+
53+
render () {
54+
if (this.state.rectangle) {
55+
return (
56+
<RectangleCreator rectangle={this.state.rectangle} {...this.props}>
57+
{this.props.children}
58+
</RectangleCreator>
59+
);
60+
} else {
61+
return (<noscript />);
62+
}
63+
}
64+
}

src/creators/RectangleCreator.js

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import {
2+
default as React,
3+
PropTypes,
4+
Component,
5+
Children,
6+
} from "react";
7+
8+
import {default as RectangleEventList} from "../eventLists/RectangleEventList";
9+
import {default as eventHandlerCreator} from "../utils/eventHandlerCreator";
10+
import {default as defaultPropsCreator} from "../utils/defaultPropsCreator";
11+
import {default as composeOptions} from "../utils/composeOptions";
12+
import {default as componentLifecycleDecorator} from "../utils/componentLifecycleDecorator";
13+
14+
import {default as GoogleMapHolder} from "./GoogleMapHolder";
15+
16+
export const rectangleControlledPropTypes = {
17+
// [].map.call($0.querySelectorAll("tr>td>code"), function(it){ return it.textContent; }).filter(function(it){ return it.match(/^set/) && !it.match(/^setMap/); })
18+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Rectangle
19+
bounds: PropTypes.any,
20+
draggable: PropTypes.bool,
21+
editable: PropTypes.bool,
22+
options: PropTypes.object,
23+
visible: PropTypes.bool,
24+
};
25+
26+
export const rectangleDefaultPropTypes = defaultPropsCreator(rectangleControlledPropTypes);
27+
28+
const rectangleUpdaters = {
29+
bounds (bounds, component) { component.getRectangle().setBounds(bounds); },
30+
draggable (draggable, component) { component.getRectangle().setDraggable(draggable); },
31+
editable (editable, component) { component.getRectangle().setEditable(editable); },
32+
options (options, component) { component.getRectangle().setOptions(options); },
33+
visible (visible, component) { component.getRectangle().setVisible(visible); },
34+
};
35+
36+
const {eventPropTypes, registerEvents} = eventHandlerCreator(RectangleEventList);
37+
38+
export const rectangleEventPropTypes = eventPropTypes;
39+
40+
@componentLifecycleDecorator({
41+
registerEvents,
42+
instanceMethodName: "getRectangle",
43+
updaters: rectangleUpdaters,
44+
})
45+
export default class RectangleCreator extends Component {
46+
47+
static propTypes = {
48+
mapHolderRef: PropTypes.instanceOf(GoogleMapHolder).isRequired,
49+
rectangle: PropTypes.object.isRequired,
50+
}
51+
52+
static _createRectangle (mapHolderRef, rectangleProps) {
53+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Rectangle
54+
const rectangle = new google.maps.Rectangle(composeOptions(rectangleProps, [
55+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#RectangleOptions
56+
"bounds",
57+
"draggable",
58+
"editable",
59+
"visible",
60+
]));
61+
62+
rectangle.setMap(mapHolderRef.getMap());
63+
64+
return rectangle;
65+
}
66+
67+
getRectangle () {
68+
return this.props.rectangle;
69+
}
70+
71+
render () {
72+
return (<noscript />);
73+
}
74+
}

src/eventLists/RectangleEventList.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Rectangle
2+
// [].map.call($0.querySelectorAll("tr>td>code"), function(it){ return it.textContent; })
3+
export default [
4+
"bounds_changed",
5+
"click",
6+
"dblclick",
7+
"drag",
8+
"dragend",
9+
"dragstart",
10+
"mousedown",
11+
"mousemove",
12+
"mouseout",
13+
"mouseover",
14+
"mouseup",
15+
"rightclick",
16+
];

src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ export {default as Marker} from "./Marker";
88
export {default as OverlayView} from "./OverlayView";
99
export {default as Polygon} from "./Polygon";
1010
export {default as Polyline} from "./Polyline";
11+
export {default as Rectangle} from "./Rectangle";

0 commit comments

Comments
 (0)