UNPKG

mobility-toolbox-js

Version:

Toolbox for JavaScript applications in the domains of mobility and logistics.

70 lines (69 loc) 2.98 kB
import compareDepartures from './compareDepartures'; /** * This function sort Departures by arrival time and filter out unwanted departures: * - when dparture time is in the past * - when departure are duplicated * - when departure is not in the next 30 min * * @param {Object} depObject The object containing departures by id. * @param {boolean} [sortByMinArrivalTime=false] If true sort departures by arrival time. * @param {number} [maxDepartureAge=30] The maximum departure age in minutes. * @return {RealtimeDeparture[]} Return departures array. * @private */ const sortAndfilterDepartures = (depObject, sortByMinArrivalTime = false, maxDepartureAge = 30) => { const departures = Object.keys(depObject).map((k) => { return depObject[k]; }); departures.sort((a, b) => { return compareDepartures(a, b, sortByMinArrivalTime); }); const futureDate = new Date(); futureDate.setMinutes(futureDate.getMinutes() + maxDepartureAge); const future = futureDate.getTime(); const pastDate = new Date(); pastDate.setMinutes(pastDate.getMinutes() - maxDepartureAge); const past = pastDate.getTime(); const departureArray = []; const platformsBoarding = []; let previousDeparture = null; for (let i = departures.length - 1; i >= 0; i -= 1) { const departure = Object.assign({}, departures[i]); if (!departure.time) { // eslint-disable-next-line no-console console.warn('Departure without time found, skipping it.', departure); continue; } const time = new Date(departure.time).getTime(); // Only show departures within the next 30 minutes if (time > past && time < future) { // If 2 trains are boarding at the same platform, // remove the older one. if (departure.state === 'BOARDING') { if (departure.platform && !platformsBoarding.includes(departure.platform)) { platformsBoarding.push(departure.platform); } else { departure.state = 'HIDDEN'; } } // If two trains with the same line number and destinatin // and a departure difference < 1 minute, hide the second one. if (previousDeparture && departure.to[0] === previousDeparture.to[0] && Math.abs(time - (previousDeparture.time || 0)) < 1000 && departure.line.name === previousDeparture.line.name) { departure.state = 'HIDDEN'; } if (/(STOP_CANCELLED|JOURNEY_CANCELLED)/.test(departure.state)) { departure.cancelled = true; } previousDeparture = departure; previousDeparture.time = time; departureArray.unshift(departure); } } return departureArray; }; export default sortAndfilterDepartures;