Skip to content

Commit 6841ce2

Browse files
author
David Emory
authored
Merge pull request #30 from opentripplanner/itinerary-refactor
Itinerary refactor
2 parents 3413bc7 + c1fe5bd commit 6841ce2

12 files changed

+174
-107
lines changed

Diff for: lib/components/narrative/access-leg.js renamed to lib/components/narrative/default/access-leg.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import Icon from './icon'
21
import React, {PropTypes, Component} from 'react'
32

4-
import { distanceString } from '../../util/distance'
5-
import { getStepInstructions } from '../../util/itinerary'
6-
import { formatDuration } from '../../util/time'
3+
import Icon from '../icon'
4+
import { distanceString } from '../../../util/distance'
5+
import { getStepInstructions } from '../../../util/itinerary'
6+
import { formatDuration } from '../../../util/time'
77

88
export default class AccessLeg extends Component {
99
static propTypes = {
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import React from 'react'
2+
3+
import NarrativeItinerary from '../narrative-itinerary'
4+
import ItinerarySummary from './itinerary-summary'
5+
import ItineraryDetails from './itinerary-details'
6+
import { formatDuration, formatTime } from '../../../util/time'
7+
8+
export default class DefaultItinerary extends NarrativeItinerary {
9+
render () {
10+
const {
11+
active,
12+
activeLeg,
13+
activeStep,
14+
expanded,
15+
index,
16+
itinerary,
17+
setActiveLeg,
18+
setActiveStep
19+
} = this.props
20+
return (
21+
<div className={`option itinerary${active ? ' active' : ''}`}>
22+
<button
23+
className='header'
24+
onClick={this._onHeaderClick}
25+
>
26+
<span className='title'>Itinerary {index + 1}</span>{' '}
27+
<span className='duration pull-right'>{formatDuration(itinerary.duration)}</span>{' '}
28+
<span className='arrivalTime'>{formatTime(itinerary.startTime)}{formatTime(itinerary.endTime)}</span>
29+
<ItinerarySummary itinerary={itinerary} />
30+
</button>
31+
{(active || expanded) &&
32+
<div className='body'>
33+
<ItineraryDetails
34+
itinerary={itinerary}
35+
activeLeg={activeLeg}
36+
activeStep={activeStep}
37+
setActiveLeg={setActiveLeg}
38+
setActiveStep={setActiveStep}
39+
/>
40+
</div>
41+
}
42+
</div>
43+
)
44+
}
45+
}

Diff for: lib/components/narrative/itinerary-details.js renamed to lib/components/narrative/default/itinerary-details.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'
22

33
import AccessLeg from './access-leg'
44
import TransitLeg from './transit-leg'
5-
import { isTransit } from '../../util/itinerary'
5+
import { isTransit } from '../../../util/itinerary'
66

77
export default class ItineraryDetails extends Component {
88
static propTypes = {

Diff for: lib/components/narrative/itinerary-summary.js renamed to lib/components/narrative/default/itinerary-summary.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import React, { Component, PropTypes } from 'react'
22
import { Label } from 'react-bootstrap'
33

4-
import ModeIcon from './mode-icon'
5-
import {isTransit} from '../../util/itinerary'
4+
import ModeIcon from '../mode-icon'
5+
import {isTransit} from '../../../util/itinerary'
66

77
export default class ItinerarySummary extends Component {
88
static propTypes = {

Diff for: lib/components/narrative/transit-leg.js renamed to lib/components/narrative/default/transit-leg.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import Icon from './icon'
1+
import Icon from '../icon'
22
import React, { Component, PropTypes } from 'react'
33
import { Label } from 'react-bootstrap'
44

5-
import ModeIcon from './mode-icon'
6-
import { getMapColor } from '../../util/itinerary'
7-
import { formatDuration } from '../../util/time'
5+
import ModeIcon from '../mode-icon'
6+
import { getMapColor } from '../../../util/itinerary'
7+
import { formatDuration } from '../../../util/time'
88

99
export default class TransitLeg extends Component {
1010
static propTypes = {

Diff for: lib/components/narrative/itinerary-carousel.js

+15-12
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import SwipeableViews from 'react-swipeable-views'
55

66
import { setActiveItinerary, setActiveLeg, setActiveStep } from '../../actions/narrative'
77
import Icon from './icon'
8-
import NarrativeItinerary from './narrative-itinerary'
8+
import DefaultItinerary from './default/default-itinerary'
99
import Loading from './loading'
1010
import { getActiveSearch } from '../../util/state'
1111

@@ -16,12 +16,17 @@ class ItineraryCarousel extends Component {
1616
pending: PropTypes.bool,
1717
activeItinerary: PropTypes.number,
1818
hideHeader: PropTypes.bool,
19+
itineraryClass: PropTypes.func,
1920
onExpand: PropTypes.func,
2021
setActiveItinerary: PropTypes.func,
2122
setActiveLeg: PropTypes.func,
2223
setActiveStep: PropTypes.func
2324
}
2425

26+
static defaultProps = {
27+
itineraryClass: DefaultItinerary
28+
}
29+
2530
_onItineraryClick = () => {
2631
const expanded = !this.state.expanded
2732
this.setState({expanded})
@@ -43,7 +48,7 @@ class ItineraryCarousel extends Component {
4348
}
4449

4550
render () {
46-
const { activeItinerary, itineraries, hideHeader, pending } = this.props
51+
const { activeItinerary, itineraries, itineraryClass, hideHeader, pending } = this.props
4752
if (pending) return <Loading />
4853
if (!itineraries) return null
4954

@@ -75,16 +80,14 @@ class ItineraryCarousel extends Component {
7580
onChangeIndex={this._onSwipe}
7681
>
7782
{itineraries.map((itinerary, index) => {
78-
return (
79-
<NarrativeItinerary
80-
itinerary={itinerary}
81-
index={index}
82-
key={index}
83-
expanded={this.state.expanded}
84-
onClick={this._onItineraryClick}
85-
{...this.props}
86-
/>
87-
)
83+
return React.createElement(itineraryClass, {
84+
itinerary,
85+
index,
86+
key: index,
87+
expanded: this.state.expanded,
88+
onClick: this._onItineraryClick,
89+
...this.props
90+
})
8891
})}
8992
</SwipeableViews>
9093
</div>

Diff for: lib/components/narrative/narrative-itineraries.js

+14-11
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,41 @@ import React, { Component, PropTypes } from 'react'
22
import { connect } from 'react-redux'
33

44
import { setActiveItinerary, setActiveLeg, setActiveStep } from '../../actions/narrative'
5-
import NarrativeItinerary from './narrative-itinerary'
5+
import DefaultItinerary from './default/default-itinerary'
66
import Loading from './loading'
77
import { getActiveSearch } from '../../util/state'
88

99
class NarrativeItineraries extends Component {
1010
static propTypes = {
1111
itineraries: PropTypes.array,
12+
itineraryClass: PropTypes.func,
1213
pending: PropTypes.bool,
1314
activeItinerary: PropTypes.number,
1415
setActiveItinerary: PropTypes.func,
1516
setActiveLeg: PropTypes.func,
1617
setActiveStep: PropTypes.func
1718
}
1819

20+
static defaultProps = {
21+
itineraryClass: DefaultItinerary
22+
}
23+
1924
render () {
20-
const { itineraries, pending, activeItinerary } = this.props
25+
const { itineraries, pending, activeItinerary, itineraryClass } = this.props
2126
if (pending) return <Loading />
2227
if (!itineraries) return null
2328

2429
return (
2530
<div className='options itinerary'>
2631
<div className='header'>We found {itineraries.length} itineraries:</div>
2732
{itineraries.map((itinerary, index) => {
28-
return (
29-
<NarrativeItinerary
30-
itinerary={itinerary}
31-
index={index}
32-
key={index}
33-
active={index === activeItinerary}
34-
{...this.props}
35-
/>
36-
)
33+
return React.createElement(itineraryClass, {
34+
itinerary,
35+
index,
36+
key: index,
37+
active: index === activeItinerary,
38+
...this.props
39+
})
3740
})}
3841
</div>
3942
)

Diff for: lib/components/narrative/narrative-itinerary.js

+3-40
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
import React, { Component, PropTypes } from 'react'
2-
// import Icon from './icon'
3-
4-
import ItinerarySummary from './itinerary-summary'
5-
import ItineraryDetails from './itinerary-details'
6-
import { formatDuration, formatTime } from '../../util/time'
1+
import { Component, PropTypes } from 'react'
72

83
export default class NarrativeItinerary extends Component {
94
static propTypes = {
@@ -13,6 +8,7 @@ export default class NarrativeItinerary extends Component {
138
expanded: PropTypes.bool,
149
index: PropTypes.number,
1510
itinerary: PropTypes.object,
11+
onClick: PropTypes.func,
1612
setActiveItinerary: PropTypes.func,
1713
setActiveLeg: PropTypes.func,
1814
setActiveStep: PropTypes.func
@@ -30,39 +26,6 @@ export default class NarrativeItinerary extends Component {
3026
}
3127

3228
render () {
33-
const {
34-
active,
35-
activeLeg,
36-
activeStep,
37-
expanded,
38-
index,
39-
itinerary,
40-
setActiveLeg,
41-
setActiveStep
42-
} = this.props
43-
return (
44-
<div className={`option itinerary${active ? ' active' : ''}`}>
45-
<button
46-
className='header'
47-
onClick={this._onHeaderClick}
48-
>
49-
<span className='title'>Itinerary {index + 1}</span>{' '}
50-
<span className='duration pull-right'>{formatDuration(itinerary.duration)}</span>{' '}
51-
<span className='arrivalTime'>{formatTime(itinerary.startTime)}{formatTime(itinerary.endTime)}</span>
52-
<ItinerarySummary itinerary={itinerary} />
53-
</button>
54-
{(active || expanded) &&
55-
<div className='body'>
56-
<ItineraryDetails
57-
itinerary={itinerary}
58-
activeLeg={activeLeg}
59-
activeStep={activeStep}
60-
setActiveLeg={setActiveLeg}
61-
setActiveStep={setActiveStep}
62-
/>
63-
</div>
64-
}
65-
</div>
66-
)
29+
throw new Error('render() called on abstract class NarrativeItinerary')
6730
}
6831
}

0 commit comments

Comments
 (0)