Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
45a2a51
refactor(package.json): drop react@^0.14 support
tomchentw Oct 2, 2016
2df62c7
feat(package.json): add "react-display-name" to dependencies
tomchentw Aug 4, 2016
f61724c
feat(withGoogleMap): provide HOC for initialize `google.maps.Map` ins…
tomchentw Jul 15, 2016
14d9273
feat(async/withScriptjs): provide HOC for loading `googleMapURL` with…
tomchentw Jul 15, 2016
2656569
feat(enhanceElement): utility for generating Google Maps Components
tomchentw Jul 15, 2016
27bbb7b
refactor(_Skeleton): rewrite with enhanceElement and cleaner interfaces
tomchentw Jul 15, 2016
4b22e42
refactor(GoogleMap): rewrite with enhanceElement and cleaner interfaces
tomchentw Jul 15, 2016
c06aff2
refactor(Marker): rewrite with enhanceElement and cleaner interfaces
tomchentw Jul 15, 2016
ea39062
refactor(Rectangle): rewrite with enhanceElement and cleaner interfaces
tomchentw Jul 15, 2016
5603319
refactor(Polyline): rewrite with enhanceElement and cleaner interfaces
tomchentw Jul 15, 2016
1e20d70
refactor(Polygon): rewrite with enhanceElement and cleaner interfaces
tomchentw Jul 15, 2016
da0ebc2
refactor(Circle): rewrite with enhanceElement and cleaner interfaces
tomchentw Jul 15, 2016
2479b88
refactor(KmlLayer): rewrite with enhanceElement and cleaner interfaces
tomchentw Jul 15, 2016
2203188
refactor(DirectionsRenderer): rewrite with enhanceElement and cleaner…
tomchentw Jul 15, 2016
0694d56
refactor(HeatmapLayer): rewrite with enhanceElement and cleaner inter…
tomchentw Sep 30, 2016
fc1c25c
refactor(InfoWindow): rewrite with enhanceElement and cleaner interfaces
tomchentw Jul 15, 2016
7d28f2f
refactor(OverlayView): rewrite with enhanceElement and cleaner interf…
tomchentw Jul 15, 2016
3226508
refactor(DrawingManager): move to drawing/DrawingManager
tomchentw Oct 4, 2016
1b6a937
refactor(drawing/DrawingManager): rewrite with enhanceElement and cle…
tomchentw Oct 4, 2016
cf5a1cb
refactor(SearchBox): move to places/SearchBox
tomchentw Oct 4, 2016
bc97f61
refactor(places/SearchBox): rewrite with enhanceElement and cleaner i…
tomchentw Oct 4, 2016
f1032f4
refactor(addons/MarkerClusterer): rewrite with enhanceElement and cle…
tomchentw Jul 15, 2016
06f2e9b
refactor(addons/InfoBox): rewrite with enhanceElement and cleaner int…
tomchentw Jul 15, 2016
1619970
refactor(utils): remove legacy utils
tomchentw Oct 4, 2016
3163a99
test(index): update exported test case
tomchentw Oct 2, 2016
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,14 @@
"prismjs": "^1.5.1",
"raf": "^3.3.0",
"raw-loader": "^0.5.1",
"react": "^0.14.0",
"react-addons-pure-render-mixin": "^0.14.0",
"react-addons-update": "^0.14.0",
"react-bootstrap": "^0.28.0",
"react-dom": "^0.14.0",
"react": "^15.0.0",
"react-addons-update": "^15.0.0",
"react-bootstrap": "^0.30.3",
"react-dom": "^15.0.0",
"react-github-fork-ribbon": "^0.4.4",
"react-helmet": "^3.1.0",
"react-icons": "^2.2.1",
"react-prism": "^3.0.0",
"react-prism": "^4.0.0",
"react-router": "^2.8.1",
"react-router-bootstrap": "^0.23.1",
"react-scripts": "0.6.1",
Expand All @@ -111,12 +110,13 @@
"invariant": "^2.2.1",
"lodash": "^4.16.2",
"marker-clusterer-plus": "^2.1.4",
"react-display-name": "^0.2.0",
"react-prop-types-element-of-type": "^2.2.0",
"scriptjs": "^2.5.8",
"warning": "^3.0.0"
},
"peerDependencies": {
"react": "^0.14.0 || ^15.0.0",
"react-dom": "^0.14.0 || ^15.0.0"
"react": "^15.0.0",
"react-dom": "^15.0.0"
}
}
178 changes: 119 additions & 59 deletions src/lib/Circle.js
Original file line number Diff line number Diff line change
@@ -1,85 +1,145 @@
/* global google */
import _ from "lodash";

import {
default as React,
Component,
PropTypes,
} from "react";

import {
default as canUseDOM,
} from "can-use-dom";
MAP,
CIRCLE,
} from "./constants";

import {
default as CircleCreator,
circleDefaultPropTypes,
circleControlledPropTypes,
circleEventPropTypes,
} from "./creators/CircleCreator";

import { default as GoogleMapHolder } from "./creators/GoogleMapHolder";

export default class Circle extends Component {
static propTypes = {
// Uncontrolled default[props] - used only in componentDidMount
...circleDefaultPropTypes,
// Controlled [props] - used in componentDidMount/componentDidUpdate
...circleControlledPropTypes,
// Event [onEventName]
...circleEventPropTypes,
}

static contextTypes = {
mapHolderRef: PropTypes.instanceOf(GoogleMapHolder),
}
addDefaultPrefixToPropTypes,
collectUncontrolledAndControlledProps,
default as enhanceElement,
} from "./enhanceElement";

// Public APIs
const controlledPropTypes = {
// NOTICE!!!!!!
//
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Circle
// Only expose those with getters & setters in the table as controlled props.
//
// [].map.call($0.querySelectorAll("tr>td>code", function(it){ return it.textContent; })
// .filter(function(it){ return it.match(/^set/) && !it.match(/^setMap/); })
//
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Circle
center: PropTypes.any,
draggable: PropTypes.bool,
editable: PropTypes.bool,
options: PropTypes.object,
radius: PropTypes.number,
visible: PropTypes.bool,
};

const defaultUncontrolledPropTypes = addDefaultPrefixToPropTypes(controlledPropTypes);

const eventMap = {
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Circle
// [].map.call($0.querySelectorAll("tr>td>code"), function(it){ return it.textContent; })
// .filter(function(it){ return it.match(/^get/) && !it.match(/^getMap/); })
getBounds() { return this.state.circle.getBounds(); }
onCenterChanged: `center_changed`,

getCenter() { return this.state.circle.getCenter(); }
onClick: `click`,

getDraggable() { return this.state.circle.getDraggable(); }
onDblClick: `dblclick`,

getEditable() { return this.state.circle.getEditable(); }
onDrag: `drag`,

getMap() { return this.state.circle.getMap(); }
onDragEnd: `dragend`,

getRadius() { return this.state.circle.getRadius(); }
onDragStart: `dragstart`,

getVisible() { return this.state.circle.getVisible(); }
// END - Public APIs
onMouseDown: `mousedown`,

onMouseMove: `mousemove`,

onMouseOut: `mouseout`,

onMouseOver: `mouseover`,

onMouseUp: `mouseup`,

onRadiusChanged: `radius_changed`,

onRightClick: `rightclick`,
};

const publicMethodMap = {
// Public APIs
//
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Circle
//
// [].map.call($0.querySelectorAll("tr>td>code"), function(it){ return it.textContent; })
// .filter(function(it){ return it.match(/^get/) && !it.match(/Map$/); })
getBounds(circle) { return circle.getBounds(); },

state = {
}
getCenter(circle) { return circle.getCenter(); },

componentWillMount() {
const { mapHolderRef } = this.context;
getDraggable(circle) { return circle.getDraggable(); },

if (!canUseDOM) {
return;
}
const circle = CircleCreator._createCircle({
...this.props,
mapHolderRef,
});
getEditable(circle) { return circle.getEditable(); },

this.setState({ circle });
}
getMap(circle) { return circle.getMap(); },

render() {
if (this.state.circle) {
return (
<CircleCreator circle={this.state.circle} {...this.props}>
{this.props.children}
</CircleCreator>
);
} else {
return (<noscript />);
}
}
getRadius(circle) { return circle.getRadius(); },

getVisible(circle) { return circle.getVisible(); },
// END - Public APIs
};

const controlledPropUpdaterMap = {
center(circle, center) { circle.setCenter(center); },
draggable(circle, draggable) { circle.setDraggable(draggable); },
editable(circle, editable) { circle.setEditable(editable); },
options(circle, options) { circle.setOptions(options); },
radius(circle, radius) { circle.setRadius(radius); },
visible(circle, visible) { circle.setVisible(visible); },
};

function getInstanceFromComponent(component) {
return component.state[CIRCLE];
}

export default _.flowRight(
React.createClass,
enhanceElement(getInstanceFromComponent, publicMethodMap, eventMap, controlledPropUpdaterMap),
)({
displayName: `Circle`,

propTypes: {
...controlledPropTypes,
...defaultUncontrolledPropTypes,
},

contextTypes: {
[MAP]: PropTypes.object,
},

getInitialState() {
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#Circle
const circle = new google.maps.Circle({
map: this.context[MAP],
...collectUncontrolledAndControlledProps(
defaultUncontrolledPropTypes,
controlledPropTypes,
this.props
),
});
return {
[CIRCLE]: circle,
};
},

componentWillUnmount() {
const circle = getInstanceFromComponent(this);
if (circle) {
circle.setMap(null);
}
},

render() {
return false;
},
});
Loading