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.
Files changed (78) hide show
  1. package/README.md +92 -6
  2. package/lib/module/components/MapView.js +167 -48
  3. package/lib/module/components/MapView.js.map +1 -1
  4. package/lib/module/components/NavigatorHud.js +152 -0
  5. package/lib/module/components/NavigatorHud.js.map +1 -0
  6. package/lib/module/components/NavigatorRecenterButton.js +48 -0
  7. package/lib/module/components/NavigatorRecenterButton.js.map +1 -0
  8. package/lib/module/components/NavigatorVoiceControl.js +173 -0
  9. package/lib/module/components/NavigatorVoiceControl.js.map +1 -0
  10. package/lib/module/components/navigatorChromeTheme.js +98 -0
  11. package/lib/module/components/navigatorChromeTheme.js.map +1 -0
  12. package/lib/module/components/navigatorManeuverIcon.js +210 -0
  13. package/lib/module/components/navigatorManeuverIcon.js.map +1 -0
  14. package/lib/module/components/navigatorVoiceCatalog.js +225 -0
  15. package/lib/module/components/navigatorVoiceCatalog.js.map +1 -0
  16. package/lib/module/components/navigatorVoiceKeys.js +14 -0
  17. package/lib/module/components/navigatorVoiceKeys.js.map +1 -0
  18. package/lib/module/components/navigatorVoicePlayer.js +100 -0
  19. package/lib/module/components/navigatorVoicePlayer.js.map +1 -0
  20. package/lib/module/components/navigatorVoiceStrings.js +31 -0
  21. package/lib/module/components/navigatorVoiceStrings.js.map +1 -0
  22. package/lib/module/components/types.js +47 -0
  23. package/lib/module/components/types.js.map +1 -1
  24. package/lib/module/components/useNavigatorVoice.js +78 -0
  25. package/lib/module/components/useNavigatorVoice.js.map +1 -0
  26. package/lib/module/components/utils.js +26 -0
  27. package/lib/module/components/utils.js.map +1 -1
  28. package/lib/module/components/webMapBuild.js +1 -1
  29. package/lib/module/components/webMapBuild.js.map +1 -1
  30. package/lib/module/index.js.map +1 -1
  31. package/lib/typescript/src/components/MapView.d.ts +15 -2
  32. package/lib/typescript/src/components/MapView.d.ts.map +1 -1
  33. package/lib/typescript/src/components/NavigatorHud.d.ts +13 -0
  34. package/lib/typescript/src/components/NavigatorHud.d.ts.map +1 -0
  35. package/lib/typescript/src/components/NavigatorRecenterButton.d.ts +11 -0
  36. package/lib/typescript/src/components/NavigatorRecenterButton.d.ts.map +1 -0
  37. package/lib/typescript/src/components/NavigatorVoiceControl.d.ts +20 -0
  38. package/lib/typescript/src/components/NavigatorVoiceControl.d.ts.map +1 -0
  39. package/lib/typescript/src/components/navigatorChromeTheme.d.ts +19 -0
  40. package/lib/typescript/src/components/navigatorChromeTheme.d.ts.map +1 -0
  41. package/lib/typescript/src/components/navigatorManeuverIcon.d.ts +20 -0
  42. package/lib/typescript/src/components/navigatorManeuverIcon.d.ts.map +1 -0
  43. package/lib/typescript/src/components/navigatorVoiceCatalog.d.ts +50 -0
  44. package/lib/typescript/src/components/navigatorVoiceCatalog.d.ts.map +1 -0
  45. package/lib/typescript/src/components/navigatorVoiceKeys.d.ts +10 -0
  46. package/lib/typescript/src/components/navigatorVoiceKeys.d.ts.map +1 -0
  47. package/lib/typescript/src/components/navigatorVoicePlayer.d.ts +15 -0
  48. package/lib/typescript/src/components/navigatorVoicePlayer.d.ts.map +1 -0
  49. package/lib/typescript/src/components/navigatorVoiceStrings.d.ts +19 -0
  50. package/lib/typescript/src/components/navigatorVoiceStrings.d.ts.map +1 -0
  51. package/lib/typescript/src/components/types.d.ts +205 -12
  52. package/lib/typescript/src/components/types.d.ts.map +1 -1
  53. package/lib/typescript/src/components/useNavigatorVoice.d.ts +20 -0
  54. package/lib/typescript/src/components/useNavigatorVoice.d.ts.map +1 -0
  55. package/lib/typescript/src/components/utils.d.ts +9 -0
  56. package/lib/typescript/src/components/utils.d.ts.map +1 -1
  57. package/lib/typescript/src/components/webMapBuild.d.ts +1 -1
  58. package/lib/typescript/src/components/webMapBuild.d.ts.map +1 -1
  59. package/lib/typescript/src/index.d.ts +1 -1
  60. package/lib/typescript/src/index.d.ts.map +1 -1
  61. package/package.json +16 -7
  62. package/resources/README.md +62 -0
  63. package/resources/map.html +797 -0
  64. package/src/components/MapView.tsx +209 -58
  65. package/src/components/NavigatorHud.tsx +166 -0
  66. package/src/components/NavigatorRecenterButton.tsx +45 -0
  67. package/src/components/NavigatorVoiceControl.tsx +198 -0
  68. package/src/components/navigatorChromeTheme.ts +118 -0
  69. package/src/components/navigatorManeuverIcon.tsx +177 -0
  70. package/src/components/navigatorVoiceCatalog.ts +275 -0
  71. package/src/components/navigatorVoiceKeys.ts +132 -0
  72. package/src/components/navigatorVoicePlayer.tsx +126 -0
  73. package/src/components/navigatorVoiceStrings.ts +42 -0
  74. package/src/components/types.ts +198 -16
  75. package/src/components/useNavigatorVoice.ts +96 -0
  76. package/src/components/utils.ts +28 -0
  77. package/src/components/webMapBuild.ts +1 -1
  78. 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":";;AA+CA;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","ignoreList":[]}
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;AAEpE,MAAMC,aAAa,GAAG,IAAI;AAE1B,OAAO,MAAMC,aAAa,GAAG,MAAOC,GAAW,IAAK;EAChD,MAAMC,QAAQ,GAAG,GAAGD,GAAG,IAAIF,aAAa,EAAE;EAE1C,IAAI;IACA,MAAMI,MAAM,GAAG,MAAML,YAAY,CAACM,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,MAAMb,YAAY,CAACc,OAAO,CAACV,QAAQ,EAAES,IAAI,CAAC;IAC9C,CAAC,CAAC,OAAON,CAAC,EAAE;MACR;IAAA;EAER;EACA,OAAOM,IAAI;AACf,CAAC","ignoreList":[]}
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":[]}