forked from google-map-react/google-map-react
-
Notifications
You must be signed in to change notification settings - Fork 0
/
GMap.js
108 lines (102 loc) · 2.64 KB
/
GMap.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import React from 'react';
import PropTypes from 'prop-types';
import {
compose,
defaultProps,
withHandlers,
withState,
withContext,
withProps,
withPropsOnChange,
} from 'recompose';
import { createSelector } from 'reselect';
import { susolvkaCoords, generateMarkers } from './data/fakeData';
import SimpleMarker from './markers/SimpleMarker';
import GoogleMapReact from '../src';
import ptInBounds from './utils/ptInBounds';
import withStateSelector from './utils/withStateSelector';
export const gMap = (
{
style,
hoverDistance,
options,
mapParams: { center, zoom },
onChange,
onChildMouseEnter,
onChildMouseLeave,
markers,
draggable, // hoveredMarkerId,
}
) => (
<GoogleMapReact
bootstrapURLKeys={{
key: 'AIzaSyC-BebC7ChnHPzxQm7DAHYFMCqR5H3Jlps',
}}
style={style}
options={options}
draggable={draggable}
hoverDistance={hoverDistance}
zoom={zoom}
center={center}
onChange={onChange}
onChildMouseEnter={onChildMouseEnter}
onChildMouseLeave={onChildMouseLeave}
>
{markers}
</GoogleMapReact>
);
export const gMapHOC = compose(
defaultProps({
clusterRadius: 60,
hoverDistance: 30,
options: {
minZoom: 3,
maxZoom: 15,
},
style: {
position: 'relative',
margin: 0,
padding: 0,
flex: 1,
},
}),
withContext({ hello: PropTypes.string }, () => ({ hello: 'world' })),
// withState so you could change markers if you want
withStateSelector('markers', 'setMarkers', () =>
createSelector(
({ route: { markersCount = 20 } }) => markersCount,
markersCount => generateMarkers(markersCount)
)),
withState('hoveredMarkerId', 'setHoveredMarkerId', -1),
withState('mapParams', 'setMapParams', { center: susolvkaCoords, zoom: 6 }),
// describe events
withHandlers({
onChange: ({ setMapParams }) =>
({ center, zoom, bounds }) => {
setMapParams({ center, zoom, bounds });
},
onChildMouseEnter: ({ setHoveredMarkerId }) =>
(hoverKey, { id }) => {
setHoveredMarkerId(id);
},
onChildMouseLeave: ({ setHoveredMarkerId }) =>
() => {
setHoveredMarkerId(-1);
},
}),
withPropsOnChange(['markers', 'mapParams'], ({
markers,
mapParams: { bounds },
}) => ({
markers: bounds ? markers.filter(m => ptInBounds(bounds, m)) : [],
})),
withProps(({ hoveredMarkerId }) => ({
draggable: hoveredMarkerId === -1,
})),
withPropsOnChange(['markers'], ({ markers }) => ({
markers: markers.map(({ ...markerProps, id }) => (
<SimpleMarker key={id} id={id} {...markerProps} />
)),
}))
);
export default gMapHOC(gMap);