forked from opentripplanner/otp-react-redux
-
Notifications
You must be signed in to change notification settings - Fork 0
/
example.js
165 lines (153 loc) · 5.07 KB
/
example.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// import this polyfill in order to make webapp compatible with IE 11
import 'es6-math'
import {ClassicLegIcon, ClassicModeIcon} from '@opentripplanner/icons'
import { createHashHistory } from 'history'
import { connectRouter, routerMiddleware } from 'connected-react-router'
import React from 'react'
import { render } from 'react-dom'
import { createStore, combineReducers, applyMiddleware, compose } from 'redux'
import { Provider } from 'react-redux'
import thunk from 'redux-thunk'
import createLogger from 'redux-logger'
// import OTP-RR components
import {
BatchResultsScreen,
BatchRoutingPanel,
BatchSearchScreen,
CallTakerControls,
CallTakerPanel,
CallTakerWindows,
DefaultItinerary,
DefaultMainPanel,
FieldTripWindows,
MobileResultsScreen,
MobileSearchScreen,
ResponsiveWebapp,
createCallTakerReducer,
createOtpReducer,
createUserReducer,
otpUtils
} from './lib'
// load the OTP configuration
import otpConfig from './config.yml'
const isBatchRoutingEnabled = otpUtils.itinerary.isBatchRoutingEnabled(
otpConfig
)
const isCallTakerModuleEnabled = !!otpConfig.datastoreUrl
// Set useCustomIcons to true to override classic icons with the exports from
// custom-icons.js
const useCustomIcons = false
// Define icon sets for modes.
let MyLegIcon = ClassicLegIcon
let MyModeIcon = ClassicModeIcon
if (useCustomIcons) {
const CustomIcons = require('./custom-icons')
MyLegIcon = CustomIcons.CustomLegIcon
MyModeIcon = CustomIcons.CustomModeIcon
}
// Stubs for terms of service/storage for development purposes only.
// They are required if otpConfig.persistence.strategy === 'otp_middleware'
// (otherwise, a "Content not found" box will be shown).
// These components should be placed in their own files with appropriate content.
const TermsOfService = () => (
<>
<h1>Terms of Service</h1>
<p>Content for terms of service.</p>
</>
)
const TermsOfStorage = () => (
<>
<h1>Terms of Storage</h1>
<p>Content for terms of storage.</p>
</>
)
// define some application-wide components that should be used in
// various places. The following components can be provided here:
// - defaultMobileTitle (required)
// - ItineraryBody (required)
// - ItineraryFooter (optional)
// - LegIcon (required)
// - MainControls (optional)
// - MainPanel (required)
// - MapWindows (optional)
// - MobileResultsScreen (required)
// - MobileSearchScreen (required)
// - ModeIcon (required)
// - TermsOfService (required if otpConfig.persistence.strategy === 'otp_middleware')
// - TermsOfStorage (required if otpConfig.persistence.strategy === 'otp_middleware')
const components = {
defaultMobileTitle: () => <div className='navbar-title'>OpenTripPlanner</div>,
ItineraryBody: DefaultItinerary,
LegIcon: MyLegIcon,
MainControls: isCallTakerModuleEnabled ? CallTakerControls : null,
MainPanel: isCallTakerModuleEnabled
? CallTakerPanel
: isBatchRoutingEnabled
? BatchRoutingPanel
: DefaultMainPanel,
MapWindows: isCallTakerModuleEnabled
? () => <>
<CallTakerWindows />
<FieldTripWindows />
</>
: null,
MobileResultsScreen: isBatchRoutingEnabled
? BatchResultsScreen
: MobileResultsScreen,
MobileSearchScreen: isBatchRoutingEnabled
? BatchSearchScreen
: MobileSearchScreen,
ModeIcon: MyModeIcon,
TermsOfService,
TermsOfStorage
}
const history = createHashHistory()
const middleware = [
thunk,
routerMiddleware(history) // for dispatching history actions
]
// check if app is being run in development mode. If so, enable redux-logger
if (process.env.NODE_ENV === 'development') {
middleware.push(createLogger())
}
// set up the Redux store
const store = createStore(
combineReducers({
callTaker: createCallTakerReducer(),
otp: createOtpReducer(otpConfig),
user: createUserReducer(),
router: connectRouter(history)
}),
compose(applyMiddleware(...middleware))
)
// render the app
render(
(
<Provider store={store}>
{/**
* Note: the ResponsiveWebapp creates a React context provider
* (./util/contexts#ComponentContext to be specific) to supply custom
* components to various other subcomponents throughout otp-react-redux. If
* the ResponsiveWebapp is not used and instead some subcomponents that use
* the components in the `components` variable are imported and rendered
* outside of the ResponsiveWebapp component, then the ComponentContext will
* need to wrap that component in order for the subcomponents to be able to
* access the component context. For example:
*
* ```js
* import RouteViewer from 'otp-react-redux/build/components/viewers/route-viewer'
* import { ComponentContext } from 'otp-react-redux/build/util/contexts'
*
* const components = { ModeIcon: MyCustomModeIconComponent }
* const ContextAwareRouteViewer = () => (
* <ComponentContext.Provider value={components}>
* <RouteViewer />
* <ComponentContext.Provider/>
* )
* ```
*/}
<ResponsiveWebapp components={components} />
</Provider>
),
document.getElementById('root')
)