diff --git a/__tests__/reducers/__snapshots__/create-otp-reducer.js.snap b/__tests__/reducers/__snapshots__/create-otp-reducer.js.snap index 93507dd74..69365bedb 100644 --- a/__tests__/reducers/__snapshots__/create-otp-reducer.js.snap +++ b/__tests__/reducers/__snapshots__/create-otp-reducer.js.snap @@ -50,7 +50,7 @@ Object { "filter": "ALL", "sort": Object { "direction": "ASC", - "type": "BEST", + "type": null, }, }, "location": Object { diff --git a/lib/actions/user.js b/lib/actions/user.js index 61c43ffd7..4eb46f5a7 100644 --- a/lib/actions/user.js +++ b/lib/actions/user.js @@ -1,5 +1,6 @@ import { createAction } from 'redux-actions' +import { routeTo } from './ui' import { addTrip, addUser, @@ -40,7 +41,7 @@ export function fetchUserMonitoredTrips (accessToken) { if (otpMiddleware) { const { data: trips, status: fetchStatus } = await getTrips(otpMiddleware, accessToken) if (fetchStatus === 'success') { - dispatch(setCurrentUserMonitoredTrips(trips)) + dispatch(setCurrentUserMonitoredTrips(trips.data)) } } } @@ -154,6 +155,9 @@ export function createOrUpdateUserMonitoredTrip (tripData, isNew, silentOnSucces // Reload user's monitored trips after add/update. await dispatch(fetchUserMonitoredTrips(accessToken)) + + // Finally, navigate to the saved trips page. + dispatch(routeTo('/savedtrips')) } else { alert(`An error was encountered:\n${JSON.stringify(result)}`) } diff --git a/lib/components/form/error-message.js b/lib/components/form/error-message.js index 9dd6a9e61..9a9cb8cf1 100644 --- a/lib/components/form/error-message.js +++ b/lib/components/form/error-message.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import { connect } from 'react-redux' import TripTools from '../narrative/trip-tools' -import { getActiveSearch } from '../../util/state' +import { getActiveErrors } from '../../util/state' class ErrorMessage extends Component { static propTypes = { @@ -45,9 +45,8 @@ class ErrorMessage extends Component { // connect to the redux store const mapStateToProps = (state, ownProps) => { - const activeSearch = getActiveSearch(state.otp) return { - error: activeSearch && activeSearch.response && activeSearch.response.error, + error: getActiveErrors(state.otp)[0], currentQuery: state.otp.currentQuery, errorMessages: state.otp.config.errorMessages } diff --git a/lib/components/mobile/results-screen.js b/lib/components/mobile/results-screen.js index ef3290e77..c5b8448d5 100644 --- a/lib/components/mobile/results-screen.js +++ b/lib/components/mobile/results-screen.js @@ -16,7 +16,12 @@ import MobileNavigationBar from './navigation-bar' import { MobileScreens, setMobileScreen } from '../../actions/ui' import { setUseRealtimeResponse } from '../../actions/narrative' import { clearActiveSearch } from '../../actions/form' -import { getActiveItineraries, getActiveSearch, getRealtimeEffects } from '../../util/state' +import { + getActiveErrors, + getActiveItineraries, + getActiveSearch, + getRealtimeEffects +} from '../../util/state' const LocationContainer = styled.div` font-weight: 300; @@ -239,7 +244,7 @@ const mapStateToProps = (state, ownProps) => { return { query: state.otp.currentQuery, realtimeEffects, - error: response && response.error, + error: getActiveErrors(state.otp)[0], resultCount: response ? activeSearch.query.routingType === 'ITINERARY' diff --git a/lib/components/narrative/narrative-routing-results.js b/lib/components/narrative/narrative-routing-results.js index a3dcd9e4b..294080dfd 100644 --- a/lib/components/narrative/narrative-routing-results.js +++ b/lib/components/narrative/narrative-routing-results.js @@ -6,7 +6,11 @@ import Loading from './loading' import TabbedItineraries from './tabbed-itineraries' import ErrorMessage from '../form/error-message' -import { getActiveSearch, getActiveItineraries } from '../../util/state' +import { + getActiveErrors, + getActiveItineraries, + getActiveSearch +} from '../../util/state' import { setMainPanelContent } from '../../actions/ui' class NarrativeRoutingResults extends Component { @@ -47,7 +51,7 @@ const mapStateToProps = (state, ownProps) => { const pending = activeSearch ? Boolean(activeSearch.pending) : false return { mainPanelContent: state.otp.ui.mainPanelContent, - error: activeSearch && activeSearch.response && activeSearch.response.error, + error: getActiveErrors(state.otp)[0], itineraries: getActiveItineraries(state.otp), pending, routingType: activeSearch && activeSearch.query.routingType diff --git a/lib/components/user/existing-account-display.js b/lib/components/user/existing-account-display.js index 0513914f4..7aaed3284 100644 --- a/lib/components/user/existing-account-display.js +++ b/lib/components/user/existing-account-display.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react' +import React from 'react' import LinkButton from './link-button' import StackedPaneDisplay from './stacked-pane-display' @@ -6,38 +6,41 @@ import StackedPaneDisplay from './stacked-pane-display' /** * This component handles the existing account display. */ -class ExistingAccountDisplay extends Component { - render () { - const { onCancel, onComplete, panes } = this.props - const paneSequence = [ - { - pane: () =>