diff --git a/src/lib/Circle.js b/src/lib/Circle.js deleted file mode 100644 index 97d6cd81..00000000 --- a/src/lib/Circle.js +++ /dev/null @@ -1,144 +0,0 @@ -/* global google */ -import _ from "lodash"; - -import PropTypes from "prop-types"; - -import createReactClass from "create-react-class"; - -import { - MAP, - CIRCLE, -} from "./constants"; - -import { - addDefaultPrefixToPropTypes, - collectUncontrolledAndControlledProps, - default as enhanceElement, -} from "./enhanceElement"; - -const controlledPropTypes = { - // NOTICE!!!!!! - // - // 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; }) - onCenterChanged: `center_changed`, - - onClick: `click`, - - onDblClick: `dblclick`, - - onDrag: `drag`, - - onDragEnd: `dragend`, - - onDragStart: `dragstart`, - - 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(); }, - - getCenter(circle) { return circle.getCenter(); }, - - getDraggable(circle) { return circle.getDraggable(); }, - - getEditable(circle) { return circle.getEditable(); }, - - getMap(circle) { return circle.getMap(); }, - - 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( - createReactClass, - 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; - }, -}); diff --git a/src/macros/Circle.jsx b/src/macros/Circle.jsx new file mode 100644 index 00000000..32bb4483 --- /dev/null +++ b/src/macros/Circle.jsx @@ -0,0 +1,85 @@ +/* global google */ +import React from "react" +import PropTypes from "prop-types" + +import { + construct, + componentDidMount, + componentDidUpdate, + componentWillUnmount, +} from "../utils/MapChildHelper" + +import { MAP, CIRCLE } from "../constants" + +export const __jscodeshiftPlaceholder__ = `{ + "eventMapOverrides": { + "onDblClick": "dblclick", + "onDragEnd": "dragend", + "onDragStart": "dragstart", + "onMouseDown": "mousedown", + "onMouseMove": "mousemove", + "onMouseOut": "mouseout", + "onMouseOver": "mouseover", + "onMouseUp": "mouseup", + "onRightClick": "rightclick" + }, + "getInstanceFromComponent": "this.state[CIRCLE]" +}` + +/** + * @url https://developers.google.com/maps/documentation/javascript/3.exp/reference#Circle + */ +export class Circle extends React.PureComponent { + static propTypes = { + __jscodeshiftPlaceholder__: null, + } + + static contextTypes = { + [MAP]: PropTypes.object, + } + + /* + * @url https://developers.google.com/maps/documentation/javascript/3.exp/reference#Circle + */ + constructor(props, context) { + super(props, context) + const circle = new google.maps.Circle() + construct(Circle.propTypes, updaterMap, this.props, circle) + circle.setMap(this.context[MAP]) + this.state = { + [CIRCLE]: circle, + } + } + + componentDidMount() { + componentDidMount(this, this.state[CIRCLE], eventMap) + } + + componentDidUpdate(prevProps) { + componentDidUpdate( + this, + this.state[CIRCLE], + eventMap, + updaterMap, + prevProps + ) + } + + componentWillUnmount() { + componentWillUnmount(this) + const circle = this.state[CIRCLE] + if (circle) { + circle.setMap(null) + } + } + + render() { + return false + } +} + +export default Circle + +const eventMap = {} + +const updaterMap = {}