|
| 1 | +import { |
| 2 | + default as React, |
| 3 | + PropTypes, |
| 4 | + Component, |
| 5 | + Children, |
| 6 | +} from "react"; |
| 7 | + |
| 8 | +import { default as KmlLayerEventList } from "../eventLists/KmlLayerEventList"; |
| 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 kmlLayerControlledPropTypes = { |
| 17 | +// NOTICE!!!!!! |
| 18 | +// |
| 19 | +// Only expose those with getters & setters in the table as controlled props. |
| 20 | +// |
| 21 | +// [].map.call($0.querySelectorAll("tr>td>code", function(it){ return it.textContent; }).filter(function(it){ return it.match(/^set/) && !it.match(/^setMap/); }) |
| 22 | +// |
| 23 | +// https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer |
| 24 | + defaultViewport: PropTypes.any, |
| 25 | + metadata: PropTypes.any, |
| 26 | + status: PropTypes.any, |
| 27 | + url: PropTypes.string, |
| 28 | + zIndex: PropTypes.number, |
| 29 | +}; |
| 30 | + |
| 31 | +export const kmlLayerDefaultPropTypes = defaultPropsCreator(kmlLayerControlledPropTypes); |
| 32 | + |
| 33 | +const kmlLayerUpdaters = { |
| 34 | + defaultViewport(defaultViewport, component) { component.getKmlLayer().setDefaultViewport(defaultViewport); }, |
| 35 | + metadata(metadata, component) { component.getKmlLayer().setMetadata(metadata); }, |
| 36 | + status(status, component) { component.getKmlLayer().setStatus(status); }, |
| 37 | + url(url, component) { component.getKmlLayer().setUrl(url); }, |
| 38 | + zIndex(zIndex, component) { component.getKmlLayer().setZIndex(zIndex); }, |
| 39 | +}; |
| 40 | + |
| 41 | +const { eventPropTypes, registerEvents } = eventHandlerCreator(KmlLayerEventList); |
| 42 | + |
| 43 | +export const kmlLayerEventPropTypes = eventPropTypes; |
| 44 | + |
| 45 | +@componentLifecycleDecorator({ |
| 46 | + registerEvents, |
| 47 | + instanceMethodName: `getKmlLayer`, |
| 48 | + updaters: kmlLayerUpdaters, |
| 49 | +}) |
| 50 | +export default class KmlLayerCreator extends Component { |
| 51 | + |
| 52 | + static propTypes = { |
| 53 | + mapHolderRef: PropTypes.instanceOf(GoogleMapHolder).isRequired, |
| 54 | + kmlLayer: PropTypes.object.isRequired, |
| 55 | + } |
| 56 | + |
| 57 | + static _createKmlLayer(kmlLayerProps) { |
| 58 | + const { mapHolderRef } = kmlLayerProps; |
| 59 | + // https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer |
| 60 | + const kmlLayer = new google.maps.KmlLayer(composeOptions(kmlLayerProps, kmlLayerControlledPropTypes)); |
| 61 | + |
| 62 | + kmlLayer.setMap(mapHolderRef.getMap()); |
| 63 | + |
| 64 | + return kmlLayer; |
| 65 | + } |
| 66 | + |
| 67 | + getKmlLayer() { |
| 68 | + return this.props.kmlLayer; |
| 69 | + } |
| 70 | + |
| 71 | + render() { |
| 72 | + const { mapHolderRef, children } = this.props; |
| 73 | + |
| 74 | + if (Children.count(children) > 0) { |
| 75 | + return ( |
| 76 | + <div>{Children.map(children, childElement => |
| 77 | + childElement && React.cloneElement(childElement, { |
| 78 | + mapHolderRef, |
| 79 | + }) |
| 80 | + )}</div> |
| 81 | + ); |
| 82 | + } else { |
| 83 | + return (<noscript />); |
| 84 | + } |
| 85 | + } |
| 86 | +} |
0 commit comments