-
Notifications
You must be signed in to change notification settings - Fork 54
/
Copy pathvehicle-position-retriever.ts
72 lines (61 loc) · 1.83 KB
/
vehicle-position-retriever.ts
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
import { connect } from 'react-redux'
import { useCallback, useEffect, useState } from 'react'
import * as apiActions from '../../actions/api'
interface Props {
fetchAll?: boolean
getVehiclePositions: (id?: string) => void
refreshSeconds: number
routeId?: string
}
/**
* Non-visual component that retrieves vehicle positions for the given route.
*/
const VehiclePositionRetriever = ({
fetchAll,
getVehiclePositions,
refreshSeconds,
routeId
}: Props) => {
const [refreshTimer, setRefreshTimer] = useState<NodeJS.Timeout | null>(null)
const refreshVehiclePositions = useCallback(() => {
if (routeId || fetchAll) {
getVehiclePositions(routeId)
}
}, [routeId, getVehiclePositions, fetchAll])
useEffect(() => {
// Fetch vehicle positions when initially mounting component and a route id is available.
if (routeId || fetchAll) {
refreshVehiclePositions()
if (!refreshTimer) {
// Refresh vehicle positions per interval set in config.
setRefreshTimer(
setInterval(refreshVehiclePositions, refreshSeconds * 1000)
)
}
}
return () => {
// Stop refreshing vehicle positions for the specified route when this component unmounts.
if (refreshTimer) {
clearInterval(refreshTimer)
setRefreshTimer(null)
}
}
}, [routeId, refreshVehiclePositions, refreshTimer, refreshSeconds, fetchAll])
// Component renders nothing.
return null
}
// connect to redux store
const mapStateToProps = (state: any) => {
return {
refreshSeconds:
state.otp.config.routeViewer?.vehiclePositionRefreshSeconds || 10,
routeId: state.otp.ui.viewedRoute?.routeId
}
}
const mapDispatchToProps = {
getVehiclePositions: apiActions.getVehiclePositions
}
export default connect(
mapStateToProps,
mapDispatchToProps
)(VehiclePositionRetriever)