@mapslibvn/react-native 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -4
- package/THIRD_PARTY_NOTICES.md +33 -2
- package/dist/chunk-PKBMQBKP.js +7 -0
- package/dist/expo/index.d.ts +96 -0
- package/dist/expo/index.js +330 -0
- package/dist/index.d.ts +100 -219
- package/dist/index.js +1458 -58
- package/dist/session-B7Fu_s_b.d.ts +557 -0
- package/package.json +30 -3
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nguồn POI và profile archive (spec 07/09 mục 4). Đây là nguồn sự thật duy nhất cho API, SDK và
|
|
3
|
+
* pipeline: thêm profile mới = thêm một dòng vào POI_SOURCE_PROFILES + một lần export-tiles.
|
|
4
|
+
*/
|
|
5
|
+
declare const POI_SOURCES: readonly ["osm", "overture", "fsq"];
|
|
6
|
+
type PoiSource = (typeof POI_SOURCES)[number];
|
|
7
|
+
|
|
8
|
+
/** Kiểu dữ liệu Places API (spec 6.1) dùng chung cho Worker và SDK. */
|
|
9
|
+
interface PlaceCategory {
|
|
10
|
+
code: string;
|
|
11
|
+
group: string;
|
|
12
|
+
name_vi: string;
|
|
13
|
+
name_en: string;
|
|
14
|
+
}
|
|
15
|
+
interface PlaceAddress {
|
|
16
|
+
housenumber?: string;
|
|
17
|
+
street?: string;
|
|
18
|
+
ward?: string;
|
|
19
|
+
province?: string;
|
|
20
|
+
text?: string;
|
|
21
|
+
}
|
|
22
|
+
interface Place {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
category: PlaceCategory | null;
|
|
26
|
+
lat: number;
|
|
27
|
+
lng: number;
|
|
28
|
+
address: PlaceAddress;
|
|
29
|
+
contact?: Record<string, unknown> | null;
|
|
30
|
+
hours?: unknown;
|
|
31
|
+
quality_score: number | null;
|
|
32
|
+
status: 'active' | 'closed' | 'pending' | 'rejected';
|
|
33
|
+
updated_at: string;
|
|
34
|
+
}
|
|
35
|
+
interface PlaceSource {
|
|
36
|
+
source: 'osm' | 'overture' | 'fsq';
|
|
37
|
+
source_id: string;
|
|
38
|
+
role: 'primary' | 'secondary';
|
|
39
|
+
}
|
|
40
|
+
interface PlaceDetails extends Place {
|
|
41
|
+
sources: PlaceSource[];
|
|
42
|
+
attribution: {
|
|
43
|
+
text: string;
|
|
44
|
+
html: string;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
type GeocodePrecision = 'rooftop' | 'alley' | 'interpolated' | 'street' | 'ward' | 'district' | 'province';
|
|
48
|
+
type AutocompleteType = 'poi' | 'street' | 'address' | 'area';
|
|
49
|
+
interface AutocompleteItem {
|
|
50
|
+
type: AutocompleteType;
|
|
51
|
+
id?: string;
|
|
52
|
+
name: string;
|
|
53
|
+
secondary: string;
|
|
54
|
+
lat: number;
|
|
55
|
+
lng: number;
|
|
56
|
+
precision?: GeocodePrecision;
|
|
57
|
+
score: number;
|
|
58
|
+
bbox?: [number, number, number, number];
|
|
59
|
+
/** Tên thay thế (OSM `alt_name`/`old_name`) đã khớp truy vấn, ví dụ "Công Lý" (spec 6.3). */
|
|
60
|
+
matched_alt?: string;
|
|
61
|
+
}
|
|
62
|
+
interface GeocodeMatched {
|
|
63
|
+
housenumber?: string;
|
|
64
|
+
street?: string;
|
|
65
|
+
ward?: string;
|
|
66
|
+
province?: string;
|
|
67
|
+
former?: {
|
|
68
|
+
ward?: string;
|
|
69
|
+
district?: string;
|
|
70
|
+
province?: string;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
interface GeocodeItem {
|
|
74
|
+
lat: number;
|
|
75
|
+
lng: number;
|
|
76
|
+
precision: GeocodePrecision;
|
|
77
|
+
confidence: number;
|
|
78
|
+
matched: GeocodeMatched;
|
|
79
|
+
display_name: string;
|
|
80
|
+
bbox?: [number, number, number, number];
|
|
81
|
+
}
|
|
82
|
+
interface ReverseAddress {
|
|
83
|
+
approx_housenumber?: string;
|
|
84
|
+
street?: string;
|
|
85
|
+
ward?: string;
|
|
86
|
+
province?: string;
|
|
87
|
+
display_name: string;
|
|
88
|
+
}
|
|
89
|
+
interface ReverseResponse {
|
|
90
|
+
address: ReverseAddress;
|
|
91
|
+
nearest_poi: Place | null;
|
|
92
|
+
}
|
|
93
|
+
type EditKind = 'create' | 'update' | 'close' | 'reopen' | 'report';
|
|
94
|
+
/** Trường được phép sửa/khai khi đóng góp (spec 6.1 + 6.5). */
|
|
95
|
+
interface EditChanges {
|
|
96
|
+
name?: string;
|
|
97
|
+
lat?: number;
|
|
98
|
+
lng?: number;
|
|
99
|
+
category?: string;
|
|
100
|
+
housenumber?: string;
|
|
101
|
+
street?: string;
|
|
102
|
+
ward?: string;
|
|
103
|
+
province?: string;
|
|
104
|
+
address_text?: string;
|
|
105
|
+
contact?: {
|
|
106
|
+
phone?: string[];
|
|
107
|
+
website?: string[];
|
|
108
|
+
facebook?: string;
|
|
109
|
+
};
|
|
110
|
+
/** Chuỗi opening_hours OSM hoặc {osm: chuỗi}. */
|
|
111
|
+
hours?: string | {
|
|
112
|
+
osm: string;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
interface SuggestEditRequest {
|
|
116
|
+
/** Bắt buộc trừ kind='create'. */
|
|
117
|
+
poi_id?: string;
|
|
118
|
+
kind: EditKind;
|
|
119
|
+
changes?: EditChanges;
|
|
120
|
+
photo_url?: string;
|
|
121
|
+
note?: string;
|
|
122
|
+
/** Chuỗi ổn định theo người dùng cuối do app nhúng cấp — server chỉ lưu bản băm. */
|
|
123
|
+
end_user_token: string;
|
|
124
|
+
}
|
|
125
|
+
interface SuggestEditResponse {
|
|
126
|
+
edit_id: number;
|
|
127
|
+
status: 'pending' | 'auto_approved';
|
|
128
|
+
/** POI đích; với kind='create' là id POI mới (pending cho tới khi được duyệt). */
|
|
129
|
+
poi_id: string | null;
|
|
130
|
+
}
|
|
131
|
+
/** POI đọc từ tile lớp `poi` khi người dùng bấm — SDK web và React Native dùng chung. */
|
|
132
|
+
interface PoiFeature {
|
|
133
|
+
id: string;
|
|
134
|
+
name: string;
|
|
135
|
+
category: string;
|
|
136
|
+
group: string;
|
|
137
|
+
lngLat: [number, number];
|
|
138
|
+
}
|
|
139
|
+
/** Phương tiện cho `GET /v1/directions` (spec dẫn đường A). */
|
|
140
|
+
type TravelMode = 'motorbike' | 'car' | 'walk';
|
|
141
|
+
type DirectionsLang = 'vi' | 'en';
|
|
142
|
+
/** Loại bước rẽ theo tập cố định của MapsLibVN — không phụ thuộc engine. */
|
|
143
|
+
type ManeuverKind = 'depart' | 'arrive' | 'continue' | 'slight_right' | 'slight_left' | 'turn_right' | 'turn_left' | 'sharp_right' | 'sharp_left' | 'uturn_right' | 'uturn_left' | 'ramp_straight' | 'ramp_right' | 'ramp_left' | 'exit_right' | 'exit_left' | 'keep_right' | 'keep_left' | 'merge' | 'merge_right' | 'merge_left' | 'roundabout_enter' | 'roundabout_exit' | 'ferry_enter' | 'ferry_exit' | 'elevator' | 'steps' | 'escalator' | 'building_enter' | 'building_exit' | 'other';
|
|
144
|
+
interface RouteStep {
|
|
145
|
+
kind: ManeuverKind;
|
|
146
|
+
instruction: string;
|
|
147
|
+
/** Câu rẽ ngắn gọn để đọc lúc còn cách xa (spec B); Valhalla không trả → null. */
|
|
148
|
+
verbal_alert: string | null;
|
|
149
|
+
verbal_pre: string | null;
|
|
150
|
+
verbal_post: string | null;
|
|
151
|
+
street_names: string[];
|
|
152
|
+
distance_m: number;
|
|
153
|
+
duration_s: number;
|
|
154
|
+
/** Chỉ số điểm trong polyline của CẢ tuyến (đã dịch qua các leg). */
|
|
155
|
+
shape_begin: number;
|
|
156
|
+
shape_end: number;
|
|
157
|
+
/** [lng, lat] điểm bắt đầu bước. */
|
|
158
|
+
location: [number, number];
|
|
159
|
+
/** Số lối ra khi `kind = roundabout_enter`, còn lại null. */
|
|
160
|
+
roundabout_exit: number | null;
|
|
161
|
+
}
|
|
162
|
+
interface RouteLeg {
|
|
163
|
+
distance_m: number;
|
|
164
|
+
duration_s: number;
|
|
165
|
+
/** Chỉ số điểm đầu của leg trong polyline tuyến. */
|
|
166
|
+
shape_offset: number;
|
|
167
|
+
steps: RouteStep[];
|
|
168
|
+
}
|
|
169
|
+
interface Route {
|
|
170
|
+
mode: TravelMode;
|
|
171
|
+
distance_m: number;
|
|
172
|
+
duration_s: number;
|
|
173
|
+
/** [minLng, minLat, maxLng, maxLat] */
|
|
174
|
+
bbox: [number, number, number, number];
|
|
175
|
+
/** polyline6 của cả tuyến — giải mã bằng `decodePolyline6` → `[lng, lat][]`. */
|
|
176
|
+
geometry: string;
|
|
177
|
+
legs: RouteLeg[];
|
|
178
|
+
flags: {
|
|
179
|
+
toll: boolean;
|
|
180
|
+
highway: boolean;
|
|
181
|
+
ferry: boolean;
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
interface Waypoint {
|
|
185
|
+
/** [lng, lat] điểm người dùng gửi. */
|
|
186
|
+
location: [number, number];
|
|
187
|
+
/** [lng, lat] điểm trên tuyến gần nhất (đầu leg tương ứng). */
|
|
188
|
+
snapped: [number, number];
|
|
189
|
+
name: string | null;
|
|
190
|
+
}
|
|
191
|
+
interface DirectionsResponse {
|
|
192
|
+
routes: Route[];
|
|
193
|
+
waypoints: Waypoint[];
|
|
194
|
+
attribution: string;
|
|
195
|
+
/** Thông tin chẩn đoán, không phải hợp đồng ổn định. */
|
|
196
|
+
engine?: {
|
|
197
|
+
name: string;
|
|
198
|
+
graph: string | null;
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
type Theme = 'light' | 'dark';
|
|
203
|
+
interface ClientOptions {
|
|
204
|
+
/** Khoá API dạng mlv_live_… */
|
|
205
|
+
apiKey: string;
|
|
206
|
+
/** Gốc API, ví dụ https://maps-api.example.com */
|
|
207
|
+
baseUrl: string;
|
|
208
|
+
/** Cho phép tiêm fetch cho test hoặc môi trường không có global fetch. */
|
|
209
|
+
fetch?: typeof globalThis.fetch;
|
|
210
|
+
/**
|
|
211
|
+
* Header thêm cho mọi request, ví dụ `X-Bundle-Id` cho khoá `mobile` (spec 6.4).
|
|
212
|
+
* Không ghi đè được `X-Api-Key`.
|
|
213
|
+
*/
|
|
214
|
+
headers?: Record<string, string>;
|
|
215
|
+
/**
|
|
216
|
+
* Tập nguồn POI cho bản đồ và Places API (spec 07/09). Mặc định cả ba nguồn.
|
|
217
|
+
* Áp cho autocomplete/search/nearby/reverse và `styleUrl`; `getPlace`/`geocode` không lọc.
|
|
218
|
+
*/
|
|
219
|
+
poiSources?: readonly PoiSource[];
|
|
220
|
+
}
|
|
221
|
+
interface AttributionResponse {
|
|
222
|
+
text: string;
|
|
223
|
+
html: string;
|
|
224
|
+
links: {
|
|
225
|
+
text: string;
|
|
226
|
+
href: string;
|
|
227
|
+
license?: string;
|
|
228
|
+
}[];
|
|
229
|
+
}
|
|
230
|
+
interface DirectionsOptions {
|
|
231
|
+
/** [lat, lng] — vĩ độ trước, cùng quy ước với `near`. */
|
|
232
|
+
from: [number, number];
|
|
233
|
+
to: [number, number];
|
|
234
|
+
/** Tối đa 5 điểm dừng, mỗi điểm [lat, lng]. */
|
|
235
|
+
via?: [number, number][];
|
|
236
|
+
/** Mặc định máy chủ: `motorbike`. */
|
|
237
|
+
mode?: TravelMode;
|
|
238
|
+
/** Mặc định máy chủ: `vi`. */
|
|
239
|
+
lang?: DirectionsLang;
|
|
240
|
+
/** Xin thêm một tuyến thay thế (bị bỏ qua khi có `via`). */
|
|
241
|
+
alternatives?: boolean;
|
|
242
|
+
}
|
|
243
|
+
declare function createClient(options: ClientOptions): {
|
|
244
|
+
baseUrl: string;
|
|
245
|
+
attribution: () => Promise<AttributionResponse>;
|
|
246
|
+
styleUrl: (theme: Theme) => string;
|
|
247
|
+
autocomplete: (q: string, opts?: {
|
|
248
|
+
near?: [number, number];
|
|
249
|
+
limit?: number;
|
|
250
|
+
types?: AutocompleteType[];
|
|
251
|
+
}) => Promise<{
|
|
252
|
+
items: AutocompleteItem[];
|
|
253
|
+
}>;
|
|
254
|
+
search: (q: string, opts?: {
|
|
255
|
+
category?: string;
|
|
256
|
+
near?: [number, number];
|
|
257
|
+
radius?: number;
|
|
258
|
+
bbox?: [number, number, number, number];
|
|
259
|
+
limit?: number;
|
|
260
|
+
offset?: number;
|
|
261
|
+
}) => Promise<{
|
|
262
|
+
items: Place[];
|
|
263
|
+
total: number;
|
|
264
|
+
}>;
|
|
265
|
+
nearby: (opts: {
|
|
266
|
+
lat: number;
|
|
267
|
+
lng: number;
|
|
268
|
+
radius?: number;
|
|
269
|
+
category?: string;
|
|
270
|
+
limit?: number;
|
|
271
|
+
}) => Promise<{
|
|
272
|
+
items: Place[];
|
|
273
|
+
}>;
|
|
274
|
+
getPlace: (id: string) => Promise<PlaceDetails>;
|
|
275
|
+
geocode: (q: string, opts?: {
|
|
276
|
+
near?: [number, number];
|
|
277
|
+
limit?: number;
|
|
278
|
+
}) => Promise<{
|
|
279
|
+
items: GeocodeItem[];
|
|
280
|
+
}>;
|
|
281
|
+
reverse: (lat: number, lng: number) => Promise<ReverseResponse>;
|
|
282
|
+
/** Chỉ đường (spec dẫn đường A). Response dùng [lng, lat]; tham số vào dùng [lat, lng]. */
|
|
283
|
+
directions: (opts: DirectionsOptions) => Promise<DirectionsResponse>;
|
|
284
|
+
/** Gửi đóng góp/sửa POI (spec 6.1). Khoá phải có scope edits:write. */
|
|
285
|
+
suggestEdit: (edit: SuggestEditRequest) => Promise<SuggestEditResponse>;
|
|
286
|
+
};
|
|
287
|
+
type MapsLibVNClient = ReturnType<typeof createClient>;
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Biến đổi style JSON thuần (không cần Map đang chạy) — dùng cho React Native, nơi wrapper
|
|
291
|
+
* không có API đổi layout property của lớp có sẵn. Web dùng `applyLanguage` lúc chạy nhưng
|
|
292
|
+
* chia sẻ `nameExpression`/`isNameLabelLayer` từ đây.
|
|
293
|
+
*/
|
|
294
|
+
|
|
295
|
+
type Lang = 'vi' | 'en';
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Polyline mã hoá kiểu Google với precision 1e6 (Valhalla `legs[].shape`).
|
|
299
|
+
* Toạ độ trả về theo thứ tự GeoJSON `[lng, lat]`.
|
|
300
|
+
*/
|
|
301
|
+
declare function decodePolyline6(encoded: string): [number, number][];
|
|
302
|
+
|
|
303
|
+
/** Một điểm định vị. Lớp dán (web/RN) đổi từ API nền tảng sang dạng này. */
|
|
304
|
+
interface GeoFix {
|
|
305
|
+
lng: number;
|
|
306
|
+
lat: number;
|
|
307
|
+
/** Bán kính sai số (m). Thiếu → coi là 10 m. */
|
|
308
|
+
accuracy_m?: number;
|
|
309
|
+
/** Độ so với bắc, thuận chiều kim đồng hồ; null/undefined khi đứng yên hoặc không có. */
|
|
310
|
+
heading?: number | null;
|
|
311
|
+
speed_mps?: number | null;
|
|
312
|
+
/** ms epoch — nguồn thời gian duy nhất của máy trạng thái. */
|
|
313
|
+
timestamp: number;
|
|
314
|
+
}
|
|
315
|
+
/** Nguồn tuyến. `MapsLibVNClient` của `createClient` thoả kiểu này không cần bọc. */
|
|
316
|
+
interface RouteProvider {
|
|
317
|
+
directions(opts: DirectionsOptions): Promise<DirectionsResponse>;
|
|
318
|
+
}
|
|
319
|
+
interface PositionError {
|
|
320
|
+
code: 'denied' | 'unavailable' | 'timeout';
|
|
321
|
+
message: string;
|
|
322
|
+
raw?: unknown;
|
|
323
|
+
}
|
|
324
|
+
/** Nguồn vị trí do lớp dán cung cấp; core chỉ định nghĩa kiểu để web và RN cùng hình. */
|
|
325
|
+
interface PositionSource {
|
|
326
|
+
subscribe(onFix: (fix: GeoFix) => void, onError?: (error: PositionError) => void): () => void;
|
|
327
|
+
}
|
|
328
|
+
type NavigationStatus = 'idle' | 'navigating' | 'off_route' | 'rerouting' | 'arrived' | 'stopped';
|
|
329
|
+
interface NavigationThresholds {
|
|
330
|
+
/** Ngưỡng lệch cơ sở; hiệu dụng = max(offRoute_m, 1.5 × accuracy_m). */
|
|
331
|
+
offRoute_m: number;
|
|
332
|
+
/** Số fix liên tiếp ngoài ngưỡng để xác nhận lệch. */
|
|
333
|
+
offRouteFixes: number;
|
|
334
|
+
/** … và đã kéo dài ít nhất bấy nhiêu giây (theo timestamp fix). */
|
|
335
|
+
offRouteSeconds: number;
|
|
336
|
+
/** Fix kém hơn thì bỏ, không cập nhật gì. */
|
|
337
|
+
maxAccuracy_m: number;
|
|
338
|
+
/** Đọc "Trong X nữa, …" khi còn ≤. */
|
|
339
|
+
approach_m: number;
|
|
340
|
+
/** Đọc câu rẽ khi còn ≤. */
|
|
341
|
+
pre_m: number;
|
|
342
|
+
/** Bán kính đến nơi / qua điểm via. */
|
|
343
|
+
arrive_m: number;
|
|
344
|
+
rerouteCooldown_s: number;
|
|
345
|
+
rerouteMaxFailures: number;
|
|
346
|
+
}
|
|
347
|
+
/** Số khởi điểm theo spec B mục 4.3; chốt lại sau thực địa (Task 20). */
|
|
348
|
+
declare const NAVIGATION_THRESHOLDS: Readonly<Record<TravelMode, NavigationThresholds>>;
|
|
349
|
+
interface NavigationProgress {
|
|
350
|
+
status: NavigationStatus;
|
|
351
|
+
route: Route;
|
|
352
|
+
routeIndex: number;
|
|
353
|
+
legIndex: number;
|
|
354
|
+
/** Chỉ số step PHẲNG qua mọi leg (spec B 4.4). */
|
|
355
|
+
stepIndex: number;
|
|
356
|
+
step: RouteStep;
|
|
357
|
+
/** Step có điểm rẽ kế tiếp; null khi step hiện tại là arrive cuối. */
|
|
358
|
+
nextStep: RouteStep | null;
|
|
359
|
+
/** [lng, lat] điểm đã bám lên tuyến. */
|
|
360
|
+
snapped: [number, number];
|
|
361
|
+
/** Hướng đi (độ): heading GPS khi speed_mps > 1, còn không thì hướng đoạn tuyến. */
|
|
362
|
+
bearing: number;
|
|
363
|
+
/** Chỉ số đỉnh đầu của đoạn polyline đang ở. */
|
|
364
|
+
shapeIndex: number;
|
|
365
|
+
traveled_m: number;
|
|
366
|
+
remaining_m: number;
|
|
367
|
+
/** ETA: phần còn lại của step hiện tại theo tỉ lệ + tổng duration các step sau. */
|
|
368
|
+
remaining_s: number;
|
|
369
|
+
/** Tới điểm rẽ của nextStep; 0 khi không còn. */
|
|
370
|
+
distanceToStep_m: number;
|
|
371
|
+
/** Khoảng cách vuông góc từ fix tới tuyến. */
|
|
372
|
+
offRoute_m: number;
|
|
373
|
+
fix: GeoFix;
|
|
374
|
+
}
|
|
375
|
+
interface Announcement {
|
|
376
|
+
text: string;
|
|
377
|
+
kind: 'depart' | 'post' | 'approach' | 'pre' | 'arrive';
|
|
378
|
+
stepIndex: number;
|
|
379
|
+
/** 3 = câu rẽ / đến nơi / khởi hành, 2 = "Trong X nữa", 1 = verbal_post. */
|
|
380
|
+
priority: 1 | 2 | 3;
|
|
381
|
+
}
|
|
382
|
+
interface NavigationEvents {
|
|
383
|
+
status: {
|
|
384
|
+
status: NavigationStatus;
|
|
385
|
+
previous: NavigationStatus;
|
|
386
|
+
};
|
|
387
|
+
progress: NavigationProgress;
|
|
388
|
+
step: {
|
|
389
|
+
stepIndex: number;
|
|
390
|
+
step: RouteStep;
|
|
391
|
+
};
|
|
392
|
+
waypoint: {
|
|
393
|
+
legIndex: number;
|
|
394
|
+
waypoint: Waypoint;
|
|
395
|
+
};
|
|
396
|
+
offRoute: {
|
|
397
|
+
distance_m: number;
|
|
398
|
+
fix: GeoFix;
|
|
399
|
+
};
|
|
400
|
+
reroute: {
|
|
401
|
+
reason: 'off_route' | 'manual';
|
|
402
|
+
response: DirectionsResponse;
|
|
403
|
+
};
|
|
404
|
+
rerouteFailed: {
|
|
405
|
+
error: unknown;
|
|
406
|
+
attempts: number;
|
|
407
|
+
final: boolean;
|
|
408
|
+
};
|
|
409
|
+
announce: Announcement;
|
|
410
|
+
arrive: {
|
|
411
|
+
waypoint: Waypoint;
|
|
412
|
+
fix: GeoFix;
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
interface NavigatorOptions {
|
|
416
|
+
response: DirectionsResponse;
|
|
417
|
+
/** Mặc định 0. */
|
|
418
|
+
routeIndex?: number;
|
|
419
|
+
/** Bắt buộc khi `reroute` là 'auto' (mặc định). */
|
|
420
|
+
provider?: RouteProvider;
|
|
421
|
+
/** Mặc định 'auto'. */
|
|
422
|
+
reroute?: 'auto' | 'manual';
|
|
423
|
+
/** Mặc định 'vi'; dùng cho câu "Trong X nữa" và request tính lại. */
|
|
424
|
+
lang?: DirectionsLang;
|
|
425
|
+
thresholds?: Partial<NavigationThresholds>;
|
|
426
|
+
}
|
|
427
|
+
interface Navigator {
|
|
428
|
+
readonly status: NavigationStatus;
|
|
429
|
+
readonly progress: NavigationProgress | null;
|
|
430
|
+
/** Đồng bộ. Fix kém accuracy hoặc timestamp không tăng bị bỏ. */
|
|
431
|
+
update(fix: GeoFix): void;
|
|
432
|
+
/** Thay tuyến: reset bước, lịch đọc, bộ đếm lệch; fix kế tiếp bám trên toàn tuyến. */
|
|
433
|
+
setRoute(response: DirectionsResponse, routeIndex?: number): void;
|
|
434
|
+
/** Gọi provider ngay (bỏ cooldown và trần lỗi). */
|
|
435
|
+
reroute(): Promise<void>;
|
|
436
|
+
stop(): void;
|
|
437
|
+
on<K extends keyof NavigationEvents>(event: K, handler: (e: NavigationEvents[K]) => void): void;
|
|
438
|
+
off<K extends keyof NavigationEvents>(event: K, handler: (e: NavigationEvents[K]) => void): void;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/** "85 mét", "1,2 ki-lô-mét" (viết đủ để giọng đọc phát âm đúng), "12 ki-lô-mét"; en tương ứng. */
|
|
442
|
+
declare function formatDistance(m: number, lang?: DirectionsLang): string;
|
|
443
|
+
/** Bản ngắn cho UI: "85 m", "1,2 km", "12 km". */
|
|
444
|
+
declare function formatDistanceShort(m: number): string;
|
|
445
|
+
|
|
446
|
+
interface SimulateOptions {
|
|
447
|
+
/** Mặc định theo mode: walk 1.4, motorbike 8, car 12. */
|
|
448
|
+
speed_mps?: number;
|
|
449
|
+
/** Mặc định 1. */
|
|
450
|
+
interval_s?: number;
|
|
451
|
+
/** Mặc định 8. */
|
|
452
|
+
accuracy_m?: number;
|
|
453
|
+
/** Nhiễu vị trí đều trong hình tròn bán kính này; mặc định 0. */
|
|
454
|
+
jitter_m?: number;
|
|
455
|
+
/** Mặc định 1. */
|
|
456
|
+
seed?: number;
|
|
457
|
+
/** Mặc định 1_700_000_000_000. */
|
|
458
|
+
start_ms?: number;
|
|
459
|
+
}
|
|
460
|
+
/** Đi dọc polyline với vận tốc hằng; heading = hướng đoạn; thuần và xác định. */
|
|
461
|
+
declare function simulateFixes(route: Route, opts?: SimulateOptions): GeoFix[];
|
|
462
|
+
|
|
463
|
+
/** Máy trạng thái dẫn đường thuần (spec B mục 4.4–4.5): không DOM, không timer, thời gian từ fix. */
|
|
464
|
+
declare function createNavigator(opts: NavigatorOptions): Navigator;
|
|
465
|
+
|
|
466
|
+
/** Bộ đọc câu — mặc định Expo ở `@mapslibvn/react-native/expo`; app thay bằng TTS riêng được. */
|
|
467
|
+
interface Speaker {
|
|
468
|
+
/** Cắt câu đang đọc nếu `priority` ≥ ưu tiên câu đó; thấp hơn thì xếp hàng. */
|
|
469
|
+
speak(text: string, priority: 1 | 2 | 3, lang: DirectionsLang): void;
|
|
470
|
+
cancel(): void;
|
|
471
|
+
/** Có giọng khớp `lang` không; phiên gọi một lần lúc `start()` để phát `voiceUnavailable`. */
|
|
472
|
+
available(lang: DirectionsLang): Promise<boolean>;
|
|
473
|
+
/** Nhận `voice: { rate, volume }` của `start()`; tuỳ chọn. */
|
|
474
|
+
setOptions?(options: {
|
|
475
|
+
rate?: number;
|
|
476
|
+
volume?: number;
|
|
477
|
+
}): void;
|
|
478
|
+
}
|
|
479
|
+
interface KeepAwake {
|
|
480
|
+
activate(): Promise<void> | void;
|
|
481
|
+
deactivate(): Promise<void> | void;
|
|
482
|
+
}
|
|
483
|
+
interface AudioSession {
|
|
484
|
+
activate(): Promise<void>;
|
|
485
|
+
deactivate(): Promise<void>;
|
|
486
|
+
}
|
|
487
|
+
interface BackgroundUnavailable {
|
|
488
|
+
reason: 'task_not_defined' | 'not_configured' | 'permission' | 'unsupported';
|
|
489
|
+
message: string;
|
|
490
|
+
}
|
|
491
|
+
/** `PositionSource` của core cộng hai móc tuỳ chọn; phiên nhận diện bằng `'setMode' in source`. */
|
|
492
|
+
interface SessionPositionSource extends PositionSource {
|
|
493
|
+
/** Phiên gọi trước `subscribe` với `mode` của tuyến (iOS activityType, Android ưu tiên). */
|
|
494
|
+
setMode?(mode: TravelMode): void;
|
|
495
|
+
/** Nguồn báo đã rơi về tiền cảnh; phiên phát lại thành `backgroundUnavailable`. */
|
|
496
|
+
onBackgroundUnavailable?(cb: (e: BackgroundUnavailable) => void): void;
|
|
497
|
+
}
|
|
498
|
+
interface NavigationSessionOptions {
|
|
499
|
+
provider: RouteProvider;
|
|
500
|
+
/** Bắt buộc để `start()` chạy; thiếu → reject với `MISSING_SOURCE_MESSAGE`. */
|
|
501
|
+
source?: SessionPositionSource;
|
|
502
|
+
/** Thiếu → không đọc, không phát `voiceUnavailable`. */
|
|
503
|
+
speech?: Speaker;
|
|
504
|
+
keepAwake?: KeepAwake;
|
|
505
|
+
audio?: AudioSession;
|
|
506
|
+
}
|
|
507
|
+
interface NavigationSessionStartOptions {
|
|
508
|
+
response: DirectionsResponse;
|
|
509
|
+
/** Mặc định 0. */
|
|
510
|
+
routeIndex?: number;
|
|
511
|
+
/** Mặc định 'auto'. */
|
|
512
|
+
reroute?: 'auto' | 'manual';
|
|
513
|
+
/** Mặc định 'vi'. */
|
|
514
|
+
lang?: DirectionsLang;
|
|
515
|
+
/** Mặc định true khi có `speech`. */
|
|
516
|
+
voice?: boolean | {
|
|
517
|
+
rate?: number;
|
|
518
|
+
volume?: number;
|
|
519
|
+
};
|
|
520
|
+
thresholds?: Partial<NavigationThresholds>;
|
|
521
|
+
/** Mặc định true khi có `keepAwake`. */
|
|
522
|
+
keepAwake?: boolean;
|
|
523
|
+
}
|
|
524
|
+
interface SessionEvents extends NavigationEvents {
|
|
525
|
+
/** Tuyến hiện tại đổi: `start()`, `setRoute()`, hoặc tính lại xong. Map gắn vào vẽ theo đây. */
|
|
526
|
+
route: {
|
|
527
|
+
response: DirectionsResponse;
|
|
528
|
+
routeIndex: number;
|
|
529
|
+
};
|
|
530
|
+
positionError: PositionError;
|
|
531
|
+
voiceUnavailable: undefined;
|
|
532
|
+
/** Nguồn vị trí không chạy nền được, đã rơi về tiền cảnh (một lần mỗi `start`). */
|
|
533
|
+
backgroundUnavailable: BackgroundUnavailable;
|
|
534
|
+
/** Phiên đã dừng nguồn vị trí: đến nơi hoặc app gọi `stop()`. */
|
|
535
|
+
end: {
|
|
536
|
+
reason: 'arrived' | 'stopped';
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
interface NavigationSession {
|
|
540
|
+
/** Resolve sau khi đã đăng ký nguồn vị trí (có thể chờ hộp thoại quyền). Reject chỉ khi thiếu `source`. */
|
|
541
|
+
start(opts: NavigationSessionStartOptions): Promise<void>;
|
|
542
|
+
stop(): Promise<void>;
|
|
543
|
+
reroute(): Promise<void>;
|
|
544
|
+
setRoute(response: DirectionsResponse, routeIndex?: number): void;
|
|
545
|
+
/** 'idle' khi chưa start hoặc đã stop; 'navigating' ngay sau start (core chỉ đổi ở fix đầu). */
|
|
546
|
+
readonly status: NavigationStatus;
|
|
547
|
+
readonly state: NavigationProgress | null;
|
|
548
|
+
/** Tuyến hiện tại — map gắn muộn vẽ lại từ đây; `stop()` không xoá. */
|
|
549
|
+
readonly response: DirectionsResponse | null;
|
|
550
|
+
readonly routeIndex: number;
|
|
551
|
+
on<K extends keyof SessionEvents>(event: K, handler: (e: SessionEvents[K]) => void): void;
|
|
552
|
+
off<K extends keyof SessionEvents>(event: K, handler: (e: SessionEvents[K]) => void): void;
|
|
553
|
+
}
|
|
554
|
+
declare const MISSING_SOURCE_MESSAGE = "Phi\u00EAn d\u1EABn \u0111\u01B0\u1EDDng thi\u1EBFu ngu\u1ED3n v\u1ECB tr\u00ED: truy\u1EC1n source (v\u00ED d\u1EE5 expoLocationSource() t\u1EEB @mapslibvn/react-native/expo)";
|
|
555
|
+
declare function createNavigationSession(opts: NavigationSessionOptions): NavigationSession;
|
|
556
|
+
|
|
557
|
+
export { type AudioSession as A, type BackgroundUnavailable as B, decodePolyline6 as C, type DirectionsResponse as D, formatDistance as E, formatDistanceShort as F, type GeoFix as G, simulateFixes as H, type KeepAwake as K, type Lang as L, type MapsLibVNClient as M, type NavigationSessionOptions as N, type PoiSource as P, type Route as R, type SessionPositionSource as S, type TravelMode as T, type Speaker as a, type SessionEvents as b, type NavigationSession as c, type NavigationSessionStartOptions as d, type NavigationProgress as e, type NavigationStatus as f, type Theme as g, type PoiFeature as h, type AutocompleteItem as i, type PositionSource as j, type Announcement as k, type DirectionsLang as l, type DirectionsOptions as m, MISSING_SOURCE_MESSAGE as n, type ManeuverKind as o, NAVIGATION_THRESHOLDS as p, type NavigationEvents as q, type NavigationThresholds as r, type Place as s, type PositionError as t, type RouteLeg as u, type RouteProvider as v, type RouteStep as w, createClient as x, createNavigationSession as y, createNavigator as z };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mapslibvn/react-native",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "React Native bindings MapsLibVN: <MapsLibVNMap>, <Marker>, useMap, usePlaces — bọc @maplibre/maplibre-react-native",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "React Native bindings MapsLibVN: <MapsLibVNMap>, <Marker>, useMap, usePlaces, dẫn đường (createNavigationSession, useNavigation; entry /expo cho định vị nền + TTS) — bọc @maplibre/maplibre-react-native",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -11,6 +11,11 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.js",
|
|
13
13
|
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./expo": {
|
|
16
|
+
"types": "./dist/expo/index.d.ts",
|
|
17
|
+
"import": "./dist/expo/index.js",
|
|
18
|
+
"default": "./dist/expo/index.js"
|
|
14
19
|
}
|
|
15
20
|
},
|
|
16
21
|
"files": [
|
|
@@ -22,9 +27,31 @@
|
|
|
22
27
|
"sideEffects": false,
|
|
23
28
|
"peerDependencies": {
|
|
24
29
|
"@maplibre/maplibre-react-native": "^11.3.0",
|
|
30
|
+
"expo-audio": ">=1.0.10",
|
|
31
|
+
"expo-keep-awake": ">=15.0.6",
|
|
32
|
+
"expo-location": ">=19.0.6",
|
|
33
|
+
"expo-speech": ">=14.0.6",
|
|
34
|
+
"expo-task-manager": ">=14.0.6",
|
|
25
35
|
"react": ">=19.1.0",
|
|
26
36
|
"react-native": ">=0.80.0"
|
|
27
37
|
},
|
|
38
|
+
"peerDependenciesMeta": {
|
|
39
|
+
"expo-audio": {
|
|
40
|
+
"optional": true
|
|
41
|
+
},
|
|
42
|
+
"expo-keep-awake": {
|
|
43
|
+
"optional": true
|
|
44
|
+
},
|
|
45
|
+
"expo-location": {
|
|
46
|
+
"optional": true
|
|
47
|
+
},
|
|
48
|
+
"expo-speech": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
51
|
+
"expo-task-manager": {
|
|
52
|
+
"optional": true
|
|
53
|
+
}
|
|
54
|
+
},
|
|
28
55
|
"devDependencies": {
|
|
29
56
|
"@maplibre/maplibre-react-native": "^11.3.8",
|
|
30
57
|
"@testing-library/react": "^16.3.0",
|
|
@@ -35,7 +62,7 @@
|
|
|
35
62
|
"react-native": "^0.81.0",
|
|
36
63
|
"tsup": "^8.3.0",
|
|
37
64
|
"typescript": "^5.6.0",
|
|
38
|
-
"@mapslibvn/core": "0.
|
|
65
|
+
"@mapslibvn/core": "0.5.0"
|
|
39
66
|
},
|
|
40
67
|
"scripts": {
|
|
41
68
|
"build": "tsup",
|