1
1
import lonlat from '@conveyal/lonlat'
2
+ import {
3
+ decrementFetches ,
4
+ incrementFetches
5
+ } from '@conveyal/woonerf/fetch'
2
6
import Browsochrones from 'browsochrones'
3
7
import fetch from 'isomorphic-fetch'
4
8
5
9
import { getAsObject as getHash } from '../utils/hash'
6
10
import { geocode } from '../utils/mapbox-geocoder'
7
11
import messages from '../utils/messages'
8
12
9
- import { addActionLogItem , setBrowsochronesInstances , setDestination , updateOrigin } from '../actions'
13
+ import {
14
+ addActionLogItem ,
15
+ fetchAllBrowsochrones ,
16
+ setAccessibilityFor ,
17
+ setBrowsochronesInstances ,
18
+ setEnd ,
19
+ setEndLabel ,
20
+ setStart ,
21
+ setStartLabel
22
+ } from '../actions'
10
23
11
- export default async function initialize ( {
24
+ export default function initialize ( {
12
25
browsochrones,
13
26
geocoder,
14
27
map
15
28
} ) {
16
- const actions = [ ]
17
- const { grids, gridsUrl, origins} = browsochrones
18
- const fetchGrids = grids . map ( async ( name ) => {
29
+ const { origins} = browsochrones
30
+ const qs = getHash ( )
31
+ return [
32
+ incrementFetches ( ) ,
33
+ setStartLabel ( qs . start ) , // may not exist
34
+ setEndLabel ( qs . end ) , // may not exist
35
+ ...browsochrones . origins
36
+ . map ( ( _ , index ) =>
37
+ setAccessibilityFor ( { accessibility : - 1 , index} ) ) ,
38
+ geocodeQs ( { geocoder, qs} )
39
+ . then ( ( [ start , end ] ) => {
40
+ const actions = [ ]
41
+ if ( start ) actions . push ( setStart ( start ) )
42
+ if ( end ) actions . push ( setEnd ( end ) )
43
+ actions . push ( fetchGrids ( browsochrones )
44
+ . then ( ( grids ) => loadAllOrigins ( { grids, origins} ) )
45
+ . then ( ( instances ) => [
46
+ setBrowsochronesInstances ( instances ) ,
47
+ start && fetchAllBrowsochrones ( {
48
+ browsochronesInstances : instances ,
49
+ endLatlng : end && end . latlng ,
50
+ latlng : start . latlng ,
51
+ zoom : map . zoom
52
+ } ) ,
53
+ addActionLogItem ( messages . Strings . ApplicationReady ) ,
54
+ decrementFetches ( )
55
+ ] )
56
+ )
57
+ return actions
58
+ } )
59
+ ]
60
+ }
61
+
62
+ function geocodeQs ( {
63
+ geocoder,
64
+ qs
65
+ } ) {
66
+ return Promise
67
+ . all ( [ 'start' , 'end' ]
68
+ . map ( async ( p ) => {
69
+ if ( qs [ p ] ) {
70
+ const results = await geocode ( {
71
+ boundary : geocoder . boundary ,
72
+ focusLatlng : geocoder . focusLatlng ,
73
+ text : qs [ p ]
74
+ } )
75
+ if ( results . features . length > 0 ) {
76
+ return {
77
+ label : results . features [ 0 ] . place_name ,
78
+ latlng : lonlat ( results . features [ 0 ] . geometry . coordinates )
79
+ }
80
+ }
81
+ }
82
+ } ) )
83
+ }
84
+
85
+ function fetchGrids ( {
86
+ grids,
87
+ gridsUrl
88
+ } ) {
89
+ return Promise . all ( grids . map ( async ( name ) => {
19
90
const res = await fetch ( `${ gridsUrl } /${ name } .grid` )
20
91
const grid = await res . arrayBuffer ( )
21
92
grid . name = name
22
93
return grid
23
- } )
24
- const fetchedGrids = await Promise . all ( fetchGrids )
25
-
26
- const instances = await Promise . all ( origins . map ( ( origin ) => load ( origin , fetchedGrids ) ) )
27
- actions . push ( setBrowsochronesInstances ( instances ) )
28
-
29
- const qs = getHash ( )
30
- if ( qs . start ) {
31
- actions . push ( ...( await loadFromQueryString ( {
32
- instances,
33
- geocoder,
34
- map,
35
- qs
36
- } ) ) )
37
- }
94
+ } ) )
95
+ }
38
96
39
- return [ ...actions , addActionLogItem ( messages . Strings . ApplicationReady ) ]
97
+ function loadAllOrigins ( {
98
+ grids,
99
+ origins
100
+ } ) {
101
+ return Promise . all ( origins . map ( ( origin ) => load ( origin , grids ) ) )
40
102
}
41
103
42
104
async function load ( url , grids ) {
@@ -57,38 +119,3 @@ async function load (url, grids) {
57
119
58
120
return bs
59
121
}
60
-
61
- async function loadFromQueryString ( {
62
- instances,
63
- geocoder,
64
- map,
65
- qs
66
- } ) {
67
- try {
68
- const [ startResults , endResults ] = await Promise . all ( [ 'start' , 'end' ]
69
- . filter ( ( d ) => ! ! qs [ d ] )
70
- . map ( ( d ) => geocode ( {
71
- boundary : geocoder . boundary ,
72
- focusLatlng : geocoder . focusLatlng ,
73
- text : qs [ d ]
74
- } ) ) )
75
- if ( startResults . features . length > 0 ) {
76
- const destination = endResults && endResults . features . length > 0
77
- ? { latlng : lonlat ( endResults . features [ 0 ] . geometry . coordinates ) , label : endResults . features [ 0 ] . place_name }
78
- : { }
79
- return [
80
- updateOrigin ( {
81
- browsochronesInstances : instances ,
82
- label : startResults . features [ 0 ] . place_name ,
83
- destinationLatlng : destination . latlng ,
84
- latlng : lonlat ( startResults . features [ 0 ] . geometry . coordinates ) ,
85
- zoom : map . zoom
86
- } ) ,
87
- setDestination ( destination )
88
- ]
89
- }
90
- } catch ( e ) {
91
- console . error ( e )
92
- return [ ]
93
- }
94
- }
0 commit comments