@@ -10,14 +10,17 @@ import modelStyle from '../../model/style'
1010import MapboxGl from 'mapbox-gl'
1111import 'mapbox-gl/dist/mapbox-gl.css'
1212
13+ import constants from './constants'
1314import utilUrl from '../../utility/utilUrl'
1415
16+ import Dropdown from '../Dropdown'
1517import MapMapboxControls from './MapMapboxControls'
1618
1719class CustomControls {
20+ handleLocationToggle = null
1821 onAdd ( map ) {
1922 this . _container = document . createElement ( 'div' )
20- ReactDOM . render ( < MapMapboxControls map = { map } /> , this . _container )
23+ ReactDOM . render ( < MapMapboxControls handleLocationToggle = { this . handleLocationToggle } map = { map } /> , this . _container )
2124 return this . _container
2225 }
2326 onRemove ( ) {
@@ -110,8 +113,10 @@ class MapMapbox extends React.Component {
110113 hash :true
111114 } )
112115
116+ const Controls = new CustomControls ( { } )
117+ Controls . handleLocationToggle = this . handleLocationToggle
113118
114- map . addControl ( new CustomControls ( { } ) )
119+ map . addControl ( Controls )
115120
116121 map . addControl ( new MapboxGl . AttributionControl ( {
117122 compact : true
@@ -221,6 +226,7 @@ class MapMapbox extends React.Component {
221226 this . state = {
222227 debugLines : null ,
223228 mapLoaded : false ,
229+ locationShow : false ,
224230 }
225231
226232 this . container = null // node to put map in
@@ -238,6 +244,29 @@ class MapMapbox extends React.Component {
238244 modelMap . actions . setFocus ( { point} )
239245 }
240246
247+ handleLocationSelect = ( location ) => {
248+ this . map . flyTo ( {
249+ center : [ location . lng , location . lat ] ,
250+ zoom : location . zoom
251+ } )
252+ }
253+
254+ handleLocationClose = ( ) => {
255+ this . setState ( {
256+ locationShow :false
257+ } )
258+ }
259+
260+ handleLocationToggle = ( show ) => {
261+ const { locationShow} = this . state
262+
263+ if ( locationShow ) {
264+ this . setState ( { locationShow :false } )
265+ } else {
266+ this . setState ( { locationShow :true } )
267+ }
268+ }
269+
241270 handleMapError = ( error ) => {
242271 const { style} = this . props
243272
@@ -288,8 +317,31 @@ class MapMapbox extends React.Component {
288317 }
289318
290319 render ( ) {
320+ const { locationShow} = this . state
321+
291322 return (
292- < div id = "map" ref = { el => this . container = el } > </ div >
323+ < React . Fragment >
324+ < div id = "map" ref = { el => this . container = el } > </ div >
325+ < Dropdown handleClose = { ( ) => this . handleLocationClose ( ) } open = { locationShow } >
326+ { locationShow && (
327+ < div className = "drop-menu drop-menu-locations" >
328+ { constants . locations . map ( ( loc , i ) => {
329+
330+ const className = 'drop-item interactive'
331+ return (
332+ < div
333+ className = { className }
334+ onClick = { ( e ) => { this . handleLocationSelect ( loc ) } }
335+ key = { i } >
336+
337+ { loc . label }
338+ </ div >
339+ )
340+ } ) }
341+ </ div >
342+ ) }
343+ </ Dropdown >
344+ </ React . Fragment >
293345 )
294346 }
295347
0 commit comments