Skip to content

Commit 3de8c18

Browse files
committed
feat(narrative): add toggle between realtime and non-realtime itineraries
1 parent 2c81069 commit 3de8c18

File tree

4 files changed

+35
-12
lines changed

4 files changed

+35
-12
lines changed

lib/actions/narrative.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ import { createAction } from 'redux-actions'
33
export const setActiveItinerary = createAction('SET_ACTIVE_ITINERARY')
44
export const setActiveLeg = createAction('SET_ACTIVE_LEG')
55
export const setActiveStep = createAction('SET_ACTIVE_STEP')
6+
export const setUseRealtimeResponse = createAction('SET_USE_REALTIME_RESPONSE')

lib/components/narrative/narrative-itineraries.js

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'
22
import { connect } from 'react-redux'
33
import { Button } from 'react-bootstrap'
44

5-
import { setActiveItinerary, setActiveLeg, setActiveStep } from '../../actions/narrative'
5+
import { setActiveItinerary, setActiveLeg, setActiveStep, setUseRealtimeResponse } from '../../actions/narrative'
66
import DefaultItinerary from './default/default-itinerary'
77
import { getActiveSearch } from '../../util/state'
88
import { formatDuration } from '../../util/time'
@@ -15,29 +15,35 @@ class NarrativeItineraries extends Component {
1515
activeItinerary: PropTypes.number,
1616
setActiveItinerary: PropTypes.func,
1717
setActiveLeg: PropTypes.func,
18-
setActiveStep: PropTypes.func
18+
setActiveStep: PropTypes.func,
19+
setUseRealtimeResponse: PropTypes.func,
20+
useRealtime: PropTypes.bool
1921
}
2022

2123
static defaultProps = {
2224
itineraryClass: DefaultItinerary
2325
}
2426

25-
_handleDefaultItineraryClick = (e) => {
26-
// TODO figure out what this button is supposed to do
27+
_toggleRealtimeItineraryClick = (e) => {
28+
const {setUseRealtimeResponse, useRealtime} = this.props
29+
setUseRealtimeResponse({useRealtime: !useRealtime})
2730
}
2831

2932
render () {
3033
const {
3134
activeItinerary,
3235
itineraries,
3336
itineraryClass,
34-
realtimeEffects
37+
realtimeEffects,
38+
useRealtime
3539
} = this.props
3640
if (!itineraries) return null
3741

3842
return (
3943
<div className='options itinerary'>
40-
<div className='header'>We found {itineraries.length} itineraries:</div>
44+
<div className='header'>
45+
We found {itineraries.length}{!useRealtime && ` non-realtime `} itineraries:
46+
</div>
4147

4248
{realtimeEffects.isAffectedByRealtimeData &&
4349
<div className='realtime-alert'>
@@ -63,9 +69,9 @@ class NarrativeItineraries extends Component {
6369
<Button
6470
bsSize='xsmall'
6571
bsStyle='danger'
66-
onClick={this._handleDefaultItineraryClick}
72+
onClick={this._toggleRealtimeItineraryClick}
6773
>
68-
View Default Itinerary
74+
View {useRealtime ? `Default` : `Realtime`} Itinerary
6975
</Button>
7076
</div>
7177
</div>
@@ -107,8 +113,10 @@ const mapStateToProps = (state, ownProps) => {
107113
nonRealtimeItineraries &&
108114
itineraries[0].duration !== nonRealtimeItineraries[0].duration
109115
)
116+
const useRealtime = state.otp.useRealtime
110117
return {
111-
itineraries,
118+
// swap out realtime itineraries with non-realtime depending on boolean
119+
itineraries: useRealtime ? itineraries : nonRealtimeItineraries,
112120
nonRealtimeItineraries,
113121
pending,
114122
realtimeEffects: {
@@ -122,7 +130,8 @@ const mapStateToProps = (state, ownProps) => {
122130
},
123131
activeItinerary: activeSearch && activeSearch.activeItinerary,
124132
activeLeg: activeSearch && activeSearch.activeLeg,
125-
activeStep: activeSearch && activeSearch.activeStep
133+
activeStep: activeSearch && activeSearch.activeStep,
134+
useRealtime
126135
}
127136
}
128137

@@ -136,6 +145,9 @@ const mapDispatchToProps = (dispatch, ownProps) => {
136145
},
137146
setActiveStep: (index, step) => {
138147
dispatch(setActiveStep({index, step}))
148+
},
149+
setUseRealtimeResponse: ({useRealtime}) => {
150+
dispatch(setUseRealtimeResponse({useRealtime}))
139151
}
140152
}
141153
}

lib/reducers/create-otp-reducer.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ function createOtpReducer (config, initialQuery) {
3434
transitIndex: {
3535
stops: {}
3636
},
37+
useRealtime: true,
3738
activeSearchId: 0,
3839
overlay: {
3940
bikeRental: {
@@ -108,6 +109,10 @@ function createOtpReducer (config, initialQuery) {
108109
}
109110
}
110111
})
112+
case 'SET_USE_REALTIME_RESPONSE':
113+
return update(state, {
114+
useRealtime: {$set: action.payload.useRealtime}
115+
})
111116
case 'SET_ACTIVE_ITINERARY':
112117
if (state.activeSearchId !== null) {
113118
return update(state, { searches: { [state.activeSearchId]: {

lib/util/state.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,13 @@ export function getActiveSearch (otpState) {
2222

2323
function getActiveItinerary (otpState) {
2424
const search = getActiveSearch(otpState)
25-
if (!search || !search.response || !search.response.plan) return null
26-
const plan = search.response.plan
25+
const {useRealtime} = otpState
26+
// set response to use depending on useRealtime
27+
const response = !search
28+
? null
29+
: useRealtime ? search.response : search.nonRealtimeResponse
30+
if (!response || !response.plan) return null
31+
const plan = response.plan
2732
return plan.itineraries.length > search.activeItinerary && search.activeItinerary >= 0
2833
? plan.itineraries[search.activeItinerary]
2934
: null

0 commit comments

Comments
 (0)