Skip to content

Commit 2479b88

Browse files
committed
refactor(KmlLayer): rewrite with enhanceElement and cleaner interfaces
BREAKING CHANGE: Naming convention for event handlers has tweaked to follow React's convention. Before: ```js <KmlLayer onClick={_.noop} onDefaultviewportChanged={_.noop} onStatusChanged={_.noop} /> ``` After: ```js <KmlLayer onClick={_.noop} onDefaultViewportChanged={_.noop} onStatusChanged={_.noop} /> ```
1 parent da0ebc2 commit 2479b88

File tree

5 files changed

+98
-155
lines changed

5 files changed

+98
-155
lines changed

src/lib/KmlLayer.js

Lines changed: 92 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,119 @@
1+
/* global google */
2+
import _ from "lodash";
3+
14
import {
25
default as React,
3-
Component,
46
PropTypes,
57
} from "react";
68

79
import {
8-
default as canUseDOM,
9-
} from "can-use-dom";
10+
MAP,
11+
KML_LAYER,
12+
} from "./constants";
1013

1114
import {
12-
default as KmlLayerCreator,
13-
kmlLayerDefaultPropTypes,
14-
kmlLayerControlledPropTypes,
15-
kmlLayerEventPropTypes,
16-
} from "./creators/KmlLayerCreator";
17-
18-
import { default as GoogleMapHolder } from "./creators/GoogleMapHolder";
19-
20-
export default class KmlLayer extends Component {
21-
static propTypes = {
22-
// Uncontrolled default[props] - used only in componentDidMount
23-
...kmlLayerDefaultPropTypes,
24-
// Controlled [props] - used in componentDidMount/componentDidUpdate
25-
...kmlLayerControlledPropTypes,
26-
// Event [onEventName]
27-
...kmlLayerEventPropTypes,
28-
}
29-
30-
static contextTypes = {
31-
mapHolderRef: PropTypes.instanceOf(GoogleMapHolder),
32-
}
15+
addDefaultPrefixToPropTypes,
16+
collectUncontrolledAndControlledProps,
17+
default as enhanceElement,
18+
} from "./enhanceElement";
19+
20+
const controlledPropTypes = {
21+
// NOTICE!!!!!!
22+
//
23+
// Only expose those with getters & setters in the table as controlled props.
24+
//
25+
// [].map.call($0.querySelectorAll("tr>td>code", function(it){ return it.textContent; })
26+
// .filter(function(it){ return it.match(/^set/) && !it.match(/^setMap/); })
27+
//
28+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer
29+
defaultViewport: PropTypes.any,
30+
metadata: PropTypes.any,
31+
status: PropTypes.any,
32+
url: PropTypes.string,
33+
zIndex: PropTypes.number,
34+
};
35+
36+
const defaultUncontrolledPropTypes = addDefaultPrefixToPropTypes(controlledPropTypes);
37+
38+
const eventMap = {
39+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer
40+
// [].map.call($0.querySelectorAll("tr>td>code"), function(it){ return it.textContent; })
41+
onClick: `click`,
42+
43+
onDefaultViewportChanged: `defaultviewport_changed`,
44+
45+
onStatusChanged: `status_changed`,
46+
};
3347

48+
const publicMethodMap = {
3449
// Public APIs
3550
//
3651
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer
3752
//
3853
// [].map.call($0.querySelectorAll("tr>td>code"), function(it){ return it.textContent; })
3954
// .filter(function(it){ return it.match(/^get/) && !it.match(/Map$/); })
40-
getDefaultViewport() { return this.state.kmlLayer.getDefaultViewport(); }
55+
getDefaultViewport(kmlLayer) { return kmlLayer.getDefaultViewport(); },
4156

42-
getMetadata() { return this.state.kmlLayer.getMetadata(); }
57+
getMetadata(kmlLayer) { return kmlLayer.getMetadata(); },
4358

44-
getStatus() { return this.state.kmlLayer.getStatus(); }
59+
getStatus(kmlLayer) { return kmlLayer.getStatus(); },
4560

46-
getUrl() { return this.state.kmlLayer.getUrl(); }
61+
getUrl(kmlLayer) { return kmlLayer.getUrl(); },
4762

48-
getZIndex() { return this.state.marker.getZIndex(); }
63+
getZIndex(kmlLayer) { return kmlLayer.getZIndex(); },
4964
// END - Public APIs
50-
//
51-
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer
65+
};
5266

53-
state = {
54-
}
67+
const controlledPropUpdaterMap = {
68+
defaultViewport(kmlLayer, defaultViewport) { kmlLayer.setDefaultViewport(defaultViewport); },
69+
metadata(kmlLayer, metadata) { kmlLayer.setMetadata(metadata); },
70+
status(kmlLayer, status) { kmlLayer.setStatus(status); },
71+
url(kmlLayer, url) { kmlLayer.setUrl(url); },
72+
zIndex(kmlLayer, zIndex) { kmlLayer.setZIndex(zIndex); },
73+
};
5574

56-
componentWillMount() {
57-
const { mapHolderRef } = this.context;
75+
function getInstanceFromComponent(component) {
76+
return component.state[KML_LAYER];
77+
}
5878

59-
if (!canUseDOM) {
60-
return;
61-
}
62-
const kmlLayer = KmlLayerCreator._createKmlLayer({
63-
...this.props,
64-
mapHolderRef,
79+
export default _.flowRight(
80+
React.createClass,
81+
enhanceElement(getInstanceFromComponent, publicMethodMap, eventMap, controlledPropUpdaterMap),
82+
)({
83+
displayName: `KmlLayer`,
84+
85+
propTypes: {
86+
...controlledPropTypes,
87+
...defaultUncontrolledPropTypes,
88+
},
89+
90+
contextTypes: {
91+
[MAP]: PropTypes.object,
92+
},
93+
94+
getInitialState() {
95+
// https://developers.google.com/maps/documentation/javascript/3.exp/reference#KmlLayer
96+
const kmlLayer = new google.maps.KmlLayer({
97+
map: this.context[MAP],
98+
...collectUncontrolledAndControlledProps(
99+
defaultUncontrolledPropTypes,
100+
controlledPropTypes,
101+
this.props
102+
),
65103
});
104+
return {
105+
[KML_LAYER]: kmlLayer,
106+
};
107+
},
66108

67-
this.setState({ kmlLayer });
68-
}
109+
componentWillUnmount() {
110+
const kmlLayer = getInstanceFromComponent(this);
111+
if (kmlLayer) {
112+
kmlLayer.setMap(null);
113+
}
114+
},
69115

70116
render() {
71-
const { mapHolderRef } = this.context;
72-
if (this.state.kmlLayer) {
73-
return (
74-
<KmlLayerCreator mapHolderRef={mapHolderRef} kmlLayer={this.state.kmlLayer} {...this.props}>
75-
{this.props.children}
76-
</KmlLayerCreator>
77-
);
78-
} else {
79-
return (<noscript />);
80-
}
81-
}
82-
}
117+
return false;
118+
},
119+
});

src/lib/constants.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ export const POLYLINE = `__SECRET_POLYLINE_DO_NOT_USE_OR_YOU_WILL_BE_FIRED`;
1111
export const POLYGON = `__SECRET_POLYGON_DO_NOT_USE_OR_YOU_WILL_BE_FIRED`;
1212

1313
export const CIRCLE = `__SECRET_CIRCLE_DO_NOT_USE_OR_YOU_WILL_BE_FIRED`;
14+
15+
export const KML_LAYER = `__SECRET_KML_LAYER_DO_NOT_USE_OR_YOU_WILL_BE_FIRED`;

src/lib/creators/KmlLayerCreator.js

Lines changed: 0 additions & 93 deletions
This file was deleted.

src/lib/eventLists/KmlLayerEventList.js

Lines changed: 0 additions & 7 deletions
This file was deleted.

src/lib/index.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@ export {
2525
export {
2626
default as Circle,
2727
} from "./Circle";
28+
29+
export {
30+
default as KmlLayer,
31+
} from "./KmlLayer";

0 commit comments

Comments
 (0)