Skip to content

Commit 746af8d

Browse files
committed
feat(KmlLayer): add new KmlLayer component
1 parent da3fe62 commit 746af8d

File tree

4 files changed

+162
-0
lines changed

4 files changed

+162
-0
lines changed

src/KmlLayer.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import {
2+
default as React,
3+
Component,
4+
} from "react";
5+
6+
import {
7+
default as canUseDOM,
8+
} from "can-use-dom";
9+
10+
import {
11+
default as KmlLayerCreator,
12+
kmlLayerDefaultPropTypes,
13+
kmlLayerControlledPropTypes,
14+
kmlLayerEventPropTypes,
15+
} from "./creators/KmlLayerCreator";
16+
17+
export default class KmlLayer extends Component {
18+
static propTypes = {
19+
// Uncontrolled default[props] - used only in componentDidMount
20+
...kmlLayerDefaultPropTypes,
21+
// Controlled [props] - used in componentDidMount/componentDidUpdate
22+
...kmlLayerControlledPropTypes,
23+
// Event [onEventName]
24+
...kmlLayerEventPropTypes,
25+
}
26+
27+
// Public APIs
28+
//
29+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer
30+
//
31+
// [].map.call($0.querySelectorAll("tr>td>code"), function(it){ return it.textContent; }).filter(function(it){ return it.match(/^get/) && !it.match(/Map$/); })
32+
getDefaultViewport() { return this.state.kmlLayer.getDefaultViewport(); }
33+
34+
getMetadata() { return this.state.kmlLayer.getMetadata(); }
35+
36+
getStatus() { return this.state.kmlLayer.getStatus(); }
37+
38+
getUrl() { return this.state.kmlLayer.getUrl(); }
39+
40+
getZIndex() { return this.state.marker.getZIndex(); }
41+
// END - Public APIs
42+
//
43+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer
44+
45+
state = {
46+
}
47+
48+
componentWillMount() {
49+
if (!canUseDOM) {
50+
return;
51+
}
52+
const kmlLayer = KmlLayerCreator._createKmlLayer(this.props);
53+
54+
this.setState({ kmlLayer });
55+
}
56+
57+
render() {
58+
if (this.state.kmlLayer) {
59+
return (
60+
<KmlLayerCreator kmlLayer={this.state.kmlLayer} {...this.props}>
61+
{this.props.children}
62+
</KmlLayerCreator>
63+
);
64+
} else {
65+
return (<noscript />);
66+
}
67+
}
68+
}

src/creators/KmlLayerCreator.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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+
}

src/eventLists/KmlLayerEventList.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer
2+
// [].map.call($0.querySelectorAll("tr>td>code"), function(it){ return it.textContent; })
3+
export default [
4+
`click`,
5+
`defaultviewport_changed`,
6+
`status_changed`,
7+
];

src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export { default as Circle } from "./Circle";
55
export { default as DirectionsRenderer } from "./DirectionsRenderer";
66
export { default as DrawingManager } from "./DrawingManager";
77
export { default as InfoWindow } from "./InfoWindow";
8+
export { default as KmlLayer } from "./KmlLayer";
89
export { default as Marker } from "./Marker";
910
export { default as OverlayView } from "./OverlayView";
1011
export { default as Polygon } from "./Polygon";

0 commit comments

Comments
 (0)