/
Mapper.ts
99 lines (91 loc) · 3.27 KB
/
Mapper.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
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
import { camelizeKeys } from 'humps';
import { Direction, ModeDirections, ModeSelector, Route, RouteRequest } from '.';
import { Location } from '../Geo';
import { ItineraryItem, TransportAvoid, TransportMode, TransportSettings, TransportType } from '../Trip';
const toTranspotModesMapping = {
driving: 'car',
walking: 'pedestrian',
};
const MODES_ORDER: TransportMode[] = [
'plane',
'car',
'pedestrian'
];
export const mapRouteFromApiResponse = (
data,
transportAvoid: TransportAvoid[],
transportMode: TransportMode,
transportType: TransportType|null
): Route => {
const routeBuild: any = camelizeKeys(data);
routeBuild.directions = routeBuild.directions.map((direction): Direction => {
direction.mode = toTranspotModesMapping[direction.mode] ? toTranspotModesMapping[direction.mode] : direction.mode;
if (!direction.type) {
direction.type = direction.mode === 'car' ? transportType : null;
}
if (!direction.avoid) {
direction.avoid = direction.mode === 'car' ? transportAvoid : [];
}
return direction as Direction;
});
routeBuild.modeDirections = routeBuild.directions.reduce((
mDirectionsSet: ModeDirections[],
direction: Direction): ModeDirections[] => {
let modeDirections = mDirectionsSet.find((mDirections: ModeDirections) => (mDirections.mode === direction.mode));
if (!modeDirections) {
modeDirections = { mode: direction.mode, directions: []};
mDirectionsSet.push(modeDirections);
}
modeDirections.directions.push(direction);
return mDirectionsSet;
}, []).sort((a: ModeDirections, b: ModeDirections): number => {
const aIndex: number = MODES_ORDER.indexOf(a.mode);
const bIndex: number = MODES_ORDER.indexOf(b.mode);
if (aIndex < bIndex) {
return 1;
} else if (aIndex > bIndex) {
return -1;
}
return 0;
});
delete routeBuild.directions;
const route = routeBuild as Route;
route.chosenDirection = choseDirection(route.modeDirections, transportMode, transportType);
return route as Route;
};
export const createRouteRequest = (
destination: Location,
origin: Location,
itineraryItem?: ItineraryItem
): RouteRequest => {
const userMode: TransportMode | null =
itineraryItem ? itineraryItem.transportFromPrevious && itineraryItem.transportFromPrevious.mode : null;
const transportFromPrevious: TransportSettings | null =
itineraryItem ? itineraryItem.transportFromPrevious : null;
return {
origin,
destination,
waypoints: transportFromPrevious ? transportFromPrevious.waypoints : [],
avoid: transportFromPrevious ? transportFromPrevious.avoid : ['unpaved'],
type: transportFromPrevious ? transportFromPrevious.type : 'fastest',
chosenMode: userMode ? userMode : ModeSelector.selectOptimalMode(origin, destination),
} as RouteRequest;
};
export const choseDirection = (
modeDirectionsSet: ModeDirections[],
mode: TransportMode,
type: TransportType|null
): Direction => {
return modeDirectionsSet.reduce((chosen: Direction|null, modeDirection: ModeDirections): Direction => {
if (chosen === null || (modeDirection.mode === mode && !type)) {
chosen = modeDirection.directions[0];
}
if (modeDirection.mode === mode && type) {
const found = modeDirection.directions.find((direction: Direction) => (type === direction.type));
if (found) {
chosen = found;
}
}
return chosen;
}, null) as Direction;
};