react-native-maplibre-lite 0.1.9 → 0.2.1
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 +92 -6
- package/lib/module/components/MapView.js +167 -48
- package/lib/module/components/MapView.js.map +1 -1
- package/lib/module/components/NavigatorHud.js +152 -0
- package/lib/module/components/NavigatorHud.js.map +1 -0
- package/lib/module/components/NavigatorRecenterButton.js +48 -0
- package/lib/module/components/NavigatorRecenterButton.js.map +1 -0
- package/lib/module/components/NavigatorVoiceControl.js +173 -0
- package/lib/module/components/NavigatorVoiceControl.js.map +1 -0
- package/lib/module/components/navigatorChromeTheme.js +98 -0
- package/lib/module/components/navigatorChromeTheme.js.map +1 -0
- package/lib/module/components/navigatorManeuverIcon.js +210 -0
- package/lib/module/components/navigatorManeuverIcon.js.map +1 -0
- package/lib/module/components/navigatorVoiceCatalog.js +225 -0
- package/lib/module/components/navigatorVoiceCatalog.js.map +1 -0
- package/lib/module/components/navigatorVoiceKeys.js +14 -0
- package/lib/module/components/navigatorVoiceKeys.js.map +1 -0
- package/lib/module/components/navigatorVoicePlayer.js +100 -0
- package/lib/module/components/navigatorVoicePlayer.js.map +1 -0
- package/lib/module/components/navigatorVoiceStrings.js +31 -0
- package/lib/module/components/navigatorVoiceStrings.js.map +1 -0
- package/lib/module/components/types.js +47 -0
- package/lib/module/components/types.js.map +1 -1
- package/lib/module/components/useNavigatorVoice.js +78 -0
- package/lib/module/components/useNavigatorVoice.js.map +1 -0
- package/lib/module/components/utils.js +26 -0
- package/lib/module/components/utils.js.map +1 -1
- package/lib/module/components/webMapBuild.js +1 -1
- package/lib/module/components/webMapBuild.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/src/components/MapView.d.ts +15 -2
- package/lib/typescript/src/components/MapView.d.ts.map +1 -1
- package/lib/typescript/src/components/NavigatorHud.d.ts +13 -0
- package/lib/typescript/src/components/NavigatorHud.d.ts.map +1 -0
- package/lib/typescript/src/components/NavigatorRecenterButton.d.ts +11 -0
- package/lib/typescript/src/components/NavigatorRecenterButton.d.ts.map +1 -0
- package/lib/typescript/src/components/NavigatorVoiceControl.d.ts +20 -0
- package/lib/typescript/src/components/NavigatorVoiceControl.d.ts.map +1 -0
- package/lib/typescript/src/components/navigatorChromeTheme.d.ts +19 -0
- package/lib/typescript/src/components/navigatorChromeTheme.d.ts.map +1 -0
- package/lib/typescript/src/components/navigatorManeuverIcon.d.ts +20 -0
- package/lib/typescript/src/components/navigatorManeuverIcon.d.ts.map +1 -0
- package/lib/typescript/src/components/navigatorVoiceCatalog.d.ts +50 -0
- package/lib/typescript/src/components/navigatorVoiceCatalog.d.ts.map +1 -0
- package/lib/typescript/src/components/navigatorVoiceKeys.d.ts +10 -0
- package/lib/typescript/src/components/navigatorVoiceKeys.d.ts.map +1 -0
- package/lib/typescript/src/components/navigatorVoicePlayer.d.ts +15 -0
- package/lib/typescript/src/components/navigatorVoicePlayer.d.ts.map +1 -0
- package/lib/typescript/src/components/navigatorVoiceStrings.d.ts +19 -0
- package/lib/typescript/src/components/navigatorVoiceStrings.d.ts.map +1 -0
- package/lib/typescript/src/components/types.d.ts +205 -12
- package/lib/typescript/src/components/types.d.ts.map +1 -1
- package/lib/typescript/src/components/useNavigatorVoice.d.ts +20 -0
- package/lib/typescript/src/components/useNavigatorVoice.d.ts.map +1 -0
- package/lib/typescript/src/components/utils.d.ts +9 -0
- package/lib/typescript/src/components/utils.d.ts.map +1 -1
- package/lib/typescript/src/components/webMapBuild.d.ts +1 -1
- package/lib/typescript/src/components/webMapBuild.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/package.json +16 -7
- package/resources/README.md +62 -0
- package/resources/map.html +797 -0
- package/src/components/MapView.tsx +209 -58
- package/src/components/NavigatorHud.tsx +166 -0
- package/src/components/NavigatorRecenterButton.tsx +45 -0
- package/src/components/NavigatorVoiceControl.tsx +198 -0
- package/src/components/navigatorChromeTheme.ts +118 -0
- package/src/components/navigatorManeuverIcon.tsx +177 -0
- package/src/components/navigatorVoiceCatalog.ts +275 -0
- package/src/components/navigatorVoiceKeys.ts +132 -0
- package/src/components/navigatorVoicePlayer.tsx +126 -0
- package/src/components/navigatorVoiceStrings.ts +42 -0
- package/src/components/types.ts +198 -16
- package/src/components/useNavigatorVoice.ts +96 -0
- package/src/components/utils.ts +28 -0
- package/src/components/webMapBuild.ts +1 -1
- package/src/index.tsx +19 -0
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
/** RN → Web: `addMarker` (`MapLiteController.MarkerParams`). */
|
|
4
|
+
|
|
5
|
+
/** RN → Web: `addPolyline` (`MapLiteController.PolylineParams`). */
|
|
6
|
+
|
|
7
|
+
/** RN → Web: `addPolygon` (`MapLiteController.PolygonParams`). */
|
|
8
|
+
|
|
9
|
+
/** RN → Web: `removeMarker` / `removePolyline` / `removePolygon`. */
|
|
10
|
+
|
|
11
|
+
/** Web → RN: `postToNative` payload (`webProject/src/map/types.ts`). */
|
|
12
|
+
|
|
3
13
|
/**
|
|
4
14
|
* Navigator look-and-feel (route line, arrow accent, HUD). Passed to WebView `init` as `navigatorChrome`.
|
|
5
15
|
* All fields are optional; defaults match the built-in blue theme.
|
|
@@ -9,4 +19,41 @@
|
|
|
9
19
|
export const NAVIGATOR_PROFILE_IDS = ['car', 'car_avoid_motorway', 'car_avoid_ferry', 'car_avoid_toll', 'small_truck', 'truck', 'scooter', 'foot', 'hike', 'bike', 'mtb', 'racingbike', 'ecargobike'];
|
|
10
20
|
|
|
11
21
|
/** [longitude, latitude] — как в GeoJSON / GraphHopper. */
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Web → RN: `navigatorHud` event. View-model панели маршрута (HUD).
|
|
25
|
+
* Все строки уже локализованы/отформатированы в вебе — RN рисует «как есть».
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/** Действие озвучки в событии `navigatorVoice`. */
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Web → RN: `navigatorVoice` event. Веб шлёт абстрактные ключи фраз;
|
|
32
|
+
* нативная часть мапит их в URL клипов и воспроизводит.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
/** Parsed MapLibre style JSON — `InitParams.mapStyle` / `UpdateParams.mapStyle` в WebView. */
|
|
36
|
+
|
|
37
|
+
/** RN → Web: `init` (`MapLiteController.InitParams`). */
|
|
38
|
+
|
|
39
|
+
/** RN → Web: `update` (`MapLiteController.UpdateParams`). */
|
|
40
|
+
|
|
41
|
+
/** RN → Web: `fitBounds`. */
|
|
42
|
+
|
|
43
|
+
/** RN → Web: `flyTo`. */
|
|
44
|
+
|
|
45
|
+
/** RN → Web: `setNavigatorPoint`. */
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* RN → Web: `setNavigatorPosition`.
|
|
49
|
+
* `accuracy` (м) включает прод-режим off-route на стороне WebView.
|
|
50
|
+
*/
|
|
51
|
+
|
|
52
|
+
/** RN → Web: JSON в `WebView.postMessage` (`webProject/src/map/MapLiteController.receive`). */
|
|
53
|
+
|
|
54
|
+
/** Web → RN: `postToNative` (`webProject/src/map/types.ts`). */
|
|
55
|
+
|
|
56
|
+
/** Имена `event` в `{ type: 'event', event, params }` из WebView. */
|
|
57
|
+
|
|
58
|
+
/** `params` для `{ type: 'event', event, params }` по имени события. */
|
|
12
59
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NAVIGATOR_PROFILE_IDS"],"sourceRoot":"../../../src","sources":["components/types.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["NAVIGATOR_PROFILE_IDS"],"sourceRoot":"../../../src","sources":["components/types.ts"],"mappings":";;AAAA;;AAYA;;AAQA;;AAWA;;AAkBA;;AAWA;AACA;AACA;AACA;;AAgBA;AACA,OAAO,MAAMA,qBAAqB,GAAG,CACjC,KAAK,EACL,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAAK,EACL,YAAY,EACZ,YAAY,CACN;;AAIV;;AA8BA;AACA;AACA;AACA;;AAwBA;;AAGA;AACA;AACA;AACA;;AAWA;;AAGA;;AA0BA;;AASA;;AAOA;;AAOA;;AAMA;AACA;AACA;AACA;;AAOA;;AAkBA;;AAWA;;AAkBA","ignoreList":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
4
|
+
import { loadVoiceRuntime, readVoiceVolumeLevel, reloadVoiceForDir, writeVoicePref, writeVoiceVolumeLevel } from "./navigatorVoiceCatalog.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Нативное владение голосом навигатора: загрузка каталога/манифеста,
|
|
8
|
+
* выбор голоса/громкости и персист (AsyncStorage). Веб шлёт только ключи
|
|
9
|
+
* фраз; маппинг в аудио и воспроизведение — на стороне RN.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export function useNavigatorVoice(voiceUrl) {
|
|
13
|
+
const [runtime, setRuntime] = useState(null);
|
|
14
|
+
const [volumeLevel, setVolumeLevel] = useState(5);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
let cancelled = false;
|
|
17
|
+
void readVoiceVolumeLevel().then(lvl => {
|
|
18
|
+
if (!cancelled) setVolumeLevel(lvl);
|
|
19
|
+
});
|
|
20
|
+
if (!voiceUrl) {
|
|
21
|
+
setRuntime(null);
|
|
22
|
+
return () => {
|
|
23
|
+
cancelled = true;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
void loadVoiceRuntime(voiceUrl).then(rt => {
|
|
27
|
+
if (!cancelled) setRuntime(rt);
|
|
28
|
+
}).catch(err => {
|
|
29
|
+
console.warn('[maplite] navigator voice catalog failed', err);
|
|
30
|
+
if (!cancelled) setRuntime(null);
|
|
31
|
+
});
|
|
32
|
+
return () => {
|
|
33
|
+
cancelled = true;
|
|
34
|
+
};
|
|
35
|
+
}, [voiceUrl]);
|
|
36
|
+
const selectVoice = useCallback(async dir => {
|
|
37
|
+
if (!runtime) return;
|
|
38
|
+
try {
|
|
39
|
+
const reloaded = await reloadVoiceForDir(runtime.catalogUrl, runtime.catalog, dir);
|
|
40
|
+
setRuntime(prev => prev ? {
|
|
41
|
+
...prev,
|
|
42
|
+
...reloaded
|
|
43
|
+
} : prev);
|
|
44
|
+
} catch (err) {
|
|
45
|
+
console.warn('[maplite] failed to switch navigator voice', {
|
|
46
|
+
dir,
|
|
47
|
+
err
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}, [runtime]);
|
|
51
|
+
const selectVolume = useCallback(level => {
|
|
52
|
+
setVolumeLevel(level);
|
|
53
|
+
void writeVoiceVolumeLevel(level);
|
|
54
|
+
}, []);
|
|
55
|
+
const disableVoice = useCallback(async () => {
|
|
56
|
+
await writeVoicePref({
|
|
57
|
+
disabled: true
|
|
58
|
+
});
|
|
59
|
+
setRuntime(prev => prev ? {
|
|
60
|
+
...prev,
|
|
61
|
+
enabled: false,
|
|
62
|
+
manifest: null
|
|
63
|
+
} : prev);
|
|
64
|
+
}, []);
|
|
65
|
+
return {
|
|
66
|
+
runtime,
|
|
67
|
+
catalog: runtime?.catalog ?? [],
|
|
68
|
+
selectedDir: runtime?.selectedDir ?? null,
|
|
69
|
+
manifest: runtime?.manifest ?? null,
|
|
70
|
+
clipBaseUrl: runtime?.clipBaseUrl ?? null,
|
|
71
|
+
voiceEnabled: Boolean(runtime?.enabled && runtime.manifest),
|
|
72
|
+
volumeLevel,
|
|
73
|
+
selectVoice,
|
|
74
|
+
selectVolume,
|
|
75
|
+
disableVoice
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=useNavigatorVoice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useState","loadVoiceRuntime","readVoiceVolumeLevel","reloadVoiceForDir","writeVoicePref","writeVoiceVolumeLevel","useNavigatorVoice","voiceUrl","runtime","setRuntime","volumeLevel","setVolumeLevel","cancelled","then","lvl","rt","catch","err","console","warn","selectVoice","dir","reloaded","catalogUrl","catalog","prev","selectVolume","level","disableVoice","disabled","enabled","manifest","selectedDir","clipBaseUrl","voiceEnabled","Boolean"],"sourceRoot":"../../../src","sources":["components/useNavigatorVoice.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,33 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
4
|
+
import { NativeModules, Platform } from 'react-native';
|
|
4
5
|
const CACHE_VERSION = 'v1';
|
|
6
|
+
|
|
7
|
+
/** Android: `android/app/src/main/assets/map.html`. See `resources/README.md`. */
|
|
8
|
+
export const NATIVE_MAP_HTML_ANDROID_URI = 'file:///android_asset/map.html';
|
|
9
|
+
|
|
10
|
+
/** Имя файла в iOS bundle (Copy Bundle Resources). */
|
|
11
|
+
export const NATIVE_MAP_HTML_IOS_FILENAME = 'map.html';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* URI для `map.html` из нативных ресурсов хост-приложения.
|
|
15
|
+
* Android — assets; iOS — main bundle (через путь к `.app` из `SourceCode.scriptURL`).
|
|
16
|
+
*/
|
|
17
|
+
export const getNativeMapHtmlUri = () => {
|
|
18
|
+
if (Platform.OS === 'android') {
|
|
19
|
+
return NATIVE_MAP_HTML_ANDROID_URI;
|
|
20
|
+
}
|
|
21
|
+
if (Platform.OS === 'ios') {
|
|
22
|
+
const scriptURL = NativeModules.SourceCode?.scriptURL;
|
|
23
|
+
if (typeof scriptURL === 'string' && scriptURL.startsWith('file://')) {
|
|
24
|
+
const bundleDir = scriptURL.substring(0, scriptURL.lastIndexOf('/') + 1);
|
|
25
|
+
return `${bundleDir}${NATIVE_MAP_HTML_IOS_FILENAME}`;
|
|
26
|
+
}
|
|
27
|
+
return NATIVE_MAP_HTML_IOS_FILENAME;
|
|
28
|
+
}
|
|
29
|
+
return NATIVE_MAP_HTML_ANDROID_URI;
|
|
30
|
+
};
|
|
5
31
|
export const loadResources = async url => {
|
|
6
32
|
const cacheKey = `${url}@${CACHE_VERSION}`;
|
|
7
33
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AsyncStorage","CACHE_VERSION","loadResources","url","cacheKey","stored","getItem","_","response","fetch","ok","Error","status","text","setItem"],"sourceRoot":"../../../src","sources":["components/utils.ts"],"mappings":";;AAAA,OAAOA,YAAY,MAAM,2CAA2C;
|
|
1
|
+
{"version":3,"names":["AsyncStorage","NativeModules","Platform","CACHE_VERSION","NATIVE_MAP_HTML_ANDROID_URI","NATIVE_MAP_HTML_IOS_FILENAME","getNativeMapHtmlUri","OS","scriptURL","SourceCode","startsWith","bundleDir","substring","lastIndexOf","loadResources","url","cacheKey","stored","getItem","_","response","fetch","ok","Error","status","text","setItem"],"sourceRoot":"../../../src","sources":["components/utils.ts"],"mappings":";;AAAA,OAAOA,YAAY,MAAM,2CAA2C;AACpE,SAASC,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAEtD,MAAMC,aAAa,GAAG,IAAI;;AAE1B;AACA,OAAO,MAAMC,2BAA2B,GAAG,gCAAgC;;AAE3E;AACA,OAAO,MAAMC,4BAA4B,GAAG,UAAU;;AAEtD;AACA;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAc;EAC7C,IAAIJ,QAAQ,CAACK,EAAE,KAAK,SAAS,EAAE;IAC3B,OAAOH,2BAA2B;EACtC;EAEA,IAAIF,QAAQ,CAACK,EAAE,KAAK,KAAK,EAAE;IACvB,MAAMC,SAAkB,GAAGP,aAAa,CAACQ,UAAU,EAAED,SAAS;IAC9D,IAAI,OAAOA,SAAS,KAAK,QAAQ,IAAIA,SAAS,CAACE,UAAU,CAAC,SAAS,CAAC,EAAE;MAClE,MAAMC,SAAS,GAAGH,SAAS,CAACI,SAAS,CAAC,CAAC,EAAEJ,SAAS,CAACK,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;MACxE,OAAO,GAAGF,SAAS,GAAGN,4BAA4B,EAAE;IACxD;IACA,OAAOA,4BAA4B;EACvC;EAEA,OAAOD,2BAA2B;AACtC,CAAC;AAED,OAAO,MAAMU,aAAa,GAAG,MAAOC,GAAW,IAAK;EAChD,MAAMC,QAAQ,GAAG,GAAGD,GAAG,IAAIZ,aAAa,EAAE;EAE1C,IAAI;IACA,MAAMc,MAAM,GAAG,MAAMjB,YAAY,CAACkB,OAAO,CAACF,QAAQ,CAAC;IACnD,IAAIC,MAAM,EAAE;MACR,OAAOA,MAAM;IACjB;EACJ,CAAC,CAAC,OAAOE,CAAC,EAAE;IACR;EAAA;EAGJ,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACN,GAAG,CAAC;EACjC,IAAI,CAACK,QAAQ,CAACE,EAAE,EAAE;IACd,MAAM,IAAIC,KAAK,CAAC,4BAA4BR,GAAG,KAAKK,QAAQ,CAACI,MAAM,GAAG,CAAC;EAC3E;EACA,MAAMC,IAAI,GAAG,MAAML,QAAQ,CAACK,IAAI,CAAC,CAAC;EAElC,IAAIA,IAAI,EAAE;IACN,IAAI;MACA,MAAMzB,YAAY,CAAC0B,OAAO,CAACV,QAAQ,EAAES,IAAI,CAAC;IAC9C,CAAC,CAAC,OAAON,CAAC,EAAE;MACR;IAAA;EAER;EACA,OAAOM,IAAI;AACf,CAAC","ignoreList":[]}
|