-
Notifications
You must be signed in to change notification settings - Fork 1
/
MPDirectionsRenderer.ts
194 lines (181 loc) · 5.4 KB
/
MPDirectionsRenderer.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
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
import { EmitterSubscription, NativeEventEmitter, NativeModules } from 'react-native';
import { MPCameraViewFitMode, MPError, MPRoute, OnLegSelectedListener } from "../../index";
import { EventNames } from './EventNames';
const { DirectionsRenderer } = NativeModules;
/**
* Renders a {@link MPRoute} on the map.
*
* @export
* @class MPDirectionsRenderer
* @typedef {MPDirectionsRenderer}
*/
export default class MPDirectionsRenderer {
/**
* Listener for leg selection events.
*
* @private
* @type {?EmitterSubscription}
*/
private onLegSelectedSub?: EmitterSubscription;
/**
* Event handler.
*
* @private
* @type {?NativeEventEmitter}
*/
private eventEmitter?: NativeEventEmitter;
/**
* Creates an instance of MPDirectionsRenderer.
*
* @constructor
* @public
* @param {typeof NativeEventEmitter} nativeEventEmitter
*/
public constructor(nativeEventEmitter: typeof NativeEventEmitter) {
this.eventEmitter = new nativeEventEmitter(DirectionsRenderer);
}
/**
* Clears the route from the map.
*
* @public
* @async
* @returns {Promise<void>}
*/
public async clear(): Promise<void> {
await DirectionsRenderer.clear();
}
/**
* Selects the next leg if possible.
*
* Has no effect if the last leg is selected.
*
* @public
* @async
* @returns {Promise<void>}
*/
public async nextLeg(): Promise<void> {
await DirectionsRenderer.nextLeg();
}
/**
* Selects the previous leg if possible.
*
* Has no effect if the first leg is selected.
*
* @public
* @async
* @returns {Promise<void>}
*/
public async previousLeg(): Promise<void> {
await DirectionsRenderer.previousLeg();
}
/**
* Set a route to be rendered. This also resets the selected leg and step indices to 0.
*
* @public
* @async
* @param {?MPRoute} [route]
* @returns {Promise<void>}
*/
public async setRoute(route: MPRoute): Promise<void> {
await DirectionsRenderer.setRoute(JSON.stringify(route))
}
/**
* Enable/Disable the polyline animation when displaying a route element on the map.
*
* @public
* @async
* @param {boolean} animated
* @param {boolean} repeating
* @param {number} durationMs
* @returns {Promise<void>}
*/
public async setAnimatedPolyline(animated: boolean, repeating: boolean, durationMs: number): Promise<void> {
await DirectionsRenderer.setAnimatedPolyline(animated, repeating, durationMs);
}
/**
* Manually set the selected leg index on the route.
*
* This may reject if the resulting internal state is invalid (parsed index is out of bounds).
*
* @public
* @async
* @param {number} legIndex
* @returns {Promise<void>}
*/
public async selectLegIndex(legIndex: number): Promise<void> {
await DirectionsRenderer.selectLegIndex(legIndex).catch((err: Error) => {
return Promise.reject(MPError.create(JSON.parse(err.message)));
});
}
/**
* Gets the currently selected leg's floor index.
*
* @public
* @async
* @returns {Promise<number>}
*/
public async getSelectedLegFloorIndex(): Promise<number> {
return DirectionsRenderer.getSelectedLegFloorIndex();
}
/**
* Set the duration of camera animations in ms.
*
* If the duration < 0 then camera animations are disabled, and the camera will move instantly.
*
* The value is 1000 ms by default
*
* @public
* @async
* @param {number} durationMs
* @returns {Promise<void>}
*/
public async setCameraAnimationDuration(durationMs: number): Promise<void> {
await DirectionsRenderer.setCameraAnimationDuration(durationMs);
}
/**
* Set the fitmode of the camera, when displaying route elements on the map.
*
* @public
* @async
* @param {MPCameraViewFitMode} fitMode
* @returns {Promise<void>}
*/
public async setCameraViewFitMode(fitMode: MPCameraViewFitMode): Promise<void> {
let cameraFitMode: number;
switch (fitMode) {
case MPCameraViewFitMode.northAligned: {
cameraFitMode = 0;
break;
}
case MPCameraViewFitMode.firstStepAligned: {
cameraFitMode = 1;
break;
}
case MPCameraViewFitMode.startToEndAligned: {
cameraFitMode = 2;
break;
}
}
await DirectionsRenderer.setCameraViewFitMode(cameraFitMode);
}
/**
* Set a listener, which will be invoked when a new leg has been selected.
*
* This is used for when the forward/back markers are selected on the map.
*
* @public
* @async
* @param {?OnLegSelectedListener} [listener]
* @returns {Promise<void>}
*/
public async setOnLegSelectedListener(listener?: OnLegSelectedListener): Promise<void> {
await DirectionsRenderer.setOnLegSelectedListener();
this.onLegSelectedSub?.remove();
if (listener !== undefined) {
this.onLegSelectedSub = this.eventEmitter?.addListener(EventNames.onLegSelected, event => {
const leg = event.leg;
listener(leg);
});
}
}
}