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
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+
3
+ import Svg, { Circle, G, Path } from 'react-native-svg';
4
+
5
+ /**
6
+ * SVG-иконка манёвра навигатора. Порт `getSignIcon` из веб-части
7
+ * (`webProject/src/map/navigator.ts`) на `react-native-svg`.
8
+ */
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ export function NavigatorManeuverIcon({
11
+ sign,
12
+ color,
13
+ size = 32
14
+ }) {
15
+ const stroke = color;
16
+ const arrow = rotation => /*#__PURE__*/_jsx(Svg, {
17
+ width: size,
18
+ height: size,
19
+ viewBox: "0 0 24 24",
20
+ fill: "none",
21
+ children: /*#__PURE__*/_jsxs(G, {
22
+ rotation: rotation,
23
+ origin: "12, 12",
24
+ children: [/*#__PURE__*/_jsx(Path, {
25
+ d: "M12 21 V5",
26
+ stroke: stroke,
27
+ strokeWidth: 2.4,
28
+ strokeLinecap: "round",
29
+ strokeLinejoin: "round"
30
+ }), /*#__PURE__*/_jsx(Path, {
31
+ d: "M5 12 L12 5 L19 12",
32
+ stroke: stroke,
33
+ strokeWidth: 2.4,
34
+ strokeLinecap: "round",
35
+ strokeLinejoin: "round"
36
+ })]
37
+ })
38
+ });
39
+ switch (sign) {
40
+ case -3:
41
+ return arrow(-135);
42
+ case -2:
43
+ return arrow(-90);
44
+ case -1:
45
+ return arrow(-45);
46
+ case 0:
47
+ return arrow(0);
48
+ case 1:
49
+ return arrow(45);
50
+ case 2:
51
+ return arrow(90);
52
+ case 3:
53
+ return arrow(135);
54
+ case 4:
55
+ return /*#__PURE__*/_jsxs(Svg, {
56
+ width: size,
57
+ height: size,
58
+ viewBox: "0 0 24 24",
59
+ fill: "none",
60
+ children: [/*#__PURE__*/_jsx(Circle, {
61
+ cx: 12,
62
+ cy: 12,
63
+ r: 9,
64
+ stroke: stroke,
65
+ strokeWidth: 2.2
66
+ }), /*#__PURE__*/_jsx(Circle, {
67
+ cx: 12,
68
+ cy: 12,
69
+ r: 3,
70
+ fill: stroke
71
+ })]
72
+ });
73
+ case 5:
74
+ return /*#__PURE__*/_jsxs(Svg, {
75
+ width: size,
76
+ height: size,
77
+ viewBox: "0 0 24 24",
78
+ fill: "none",
79
+ children: [/*#__PURE__*/_jsx(Circle, {
80
+ cx: 12,
81
+ cy: 12,
82
+ r: 4,
83
+ stroke: stroke,
84
+ strokeWidth: 2.2
85
+ }), /*#__PURE__*/_jsx(Circle, {
86
+ cx: 12,
87
+ cy: 12,
88
+ r: 9,
89
+ stroke: stroke,
90
+ strokeWidth: 2.2
91
+ })]
92
+ });
93
+ case 6:
94
+ case -6:
95
+ return /*#__PURE__*/_jsxs(Svg, {
96
+ width: size,
97
+ height: size,
98
+ viewBox: "0 0 24 24",
99
+ fill: "none",
100
+ children: [/*#__PURE__*/_jsx(Circle, {
101
+ cx: 12,
102
+ cy: 12,
103
+ r: 6,
104
+ stroke: stroke,
105
+ strokeWidth: 2.2
106
+ }), /*#__PURE__*/_jsx(Path, {
107
+ d: "M12 18 V21",
108
+ stroke: stroke,
109
+ strokeWidth: 2.2,
110
+ strokeLinecap: "round",
111
+ strokeLinejoin: "round"
112
+ }), /*#__PURE__*/_jsx(Path, {
113
+ d: "M9 21 H15",
114
+ stroke: stroke,
115
+ strokeWidth: 2.2,
116
+ strokeLinecap: "round",
117
+ strokeLinejoin: "round"
118
+ })]
119
+ });
120
+ case -8:
121
+ case 8:
122
+ case -98:
123
+ return /*#__PURE__*/_jsxs(Svg, {
124
+ width: size,
125
+ height: size,
126
+ viewBox: "0 0 24 24",
127
+ fill: "none",
128
+ children: [/*#__PURE__*/_jsx(Path, {
129
+ d: "M8 20 V11 a5 5 0 0 1 10 0 V14",
130
+ stroke: stroke,
131
+ strokeWidth: 2.4,
132
+ strokeLinecap: "round",
133
+ strokeLinejoin: "round"
134
+ }), /*#__PURE__*/_jsx(Path, {
135
+ d: "M14 18 L18 14 L22 18",
136
+ stroke: stroke,
137
+ strokeWidth: 2.4,
138
+ strokeLinecap: "round",
139
+ strokeLinejoin: "round"
140
+ })]
141
+ });
142
+ default:
143
+ return arrow(0);
144
+ }
145
+ }
146
+
147
+ /** Иконка кнопки «вернуть камеру на положение» (порт из веб recenter FAB). */
148
+ export function NavigatorRecenterIcon({
149
+ color,
150
+ size = 28
151
+ }) {
152
+ return /*#__PURE__*/_jsxs(Svg, {
153
+ width: size,
154
+ height: size,
155
+ viewBox: "0 0 24 24",
156
+ fill: "none",
157
+ children: [/*#__PURE__*/_jsx(Circle, {
158
+ cx: 12,
159
+ cy: 12,
160
+ r: 8.5,
161
+ stroke: color,
162
+ strokeWidth: 2.2
163
+ }), /*#__PURE__*/_jsx(Path, {
164
+ d: "M12 15.5 V8.5",
165
+ stroke: color,
166
+ strokeWidth: 2.2,
167
+ strokeLinecap: "round",
168
+ strokeLinejoin: "round"
169
+ }), /*#__PURE__*/_jsx(Path, {
170
+ d: "M9.25 11.25 L12 8.5 L14.75 11.25",
171
+ stroke: color,
172
+ strokeWidth: 2.2,
173
+ strokeLinecap: "round",
174
+ strokeLinejoin: "round"
175
+ })]
176
+ });
177
+ }
178
+
179
+ /** Иконка кнопки выбора голоса озвучки (порт из веб voice FAB). */
180
+ export function NavigatorVoiceIcon({
181
+ color,
182
+ size = 26
183
+ }) {
184
+ return /*#__PURE__*/_jsxs(Svg, {
185
+ width: size,
186
+ height: size,
187
+ viewBox: "0 0 24 24",
188
+ fill: "none",
189
+ children: [/*#__PURE__*/_jsx(Path, {
190
+ d: "M11 5 L6 9 L2 9 L2 15 L6 15 L11 19 Z",
191
+ stroke: color,
192
+ strokeWidth: 2,
193
+ strokeLinecap: "round",
194
+ strokeLinejoin: "round"
195
+ }), /*#__PURE__*/_jsx(Path, {
196
+ d: "M15.54 8.46a5 5 0 0 1 0 7.07",
197
+ stroke: color,
198
+ strokeWidth: 2,
199
+ strokeLinecap: "round",
200
+ strokeLinejoin: "round"
201
+ }), /*#__PURE__*/_jsx(Path, {
202
+ d: "M19.07 4.93a10 10 0 0 1 0 14.14",
203
+ stroke: color,
204
+ strokeWidth: 2,
205
+ strokeLinecap: "round",
206
+ strokeLinejoin: "round"
207
+ })]
208
+ });
209
+ }
210
+ //# sourceMappingURL=navigatorManeuverIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Svg","Circle","G","Path","jsx","_jsx","jsxs","_jsxs","NavigatorManeuverIcon","sign","color","size","stroke","arrow","rotation","width","height","viewBox","fill","children","origin","d","strokeWidth","strokeLinecap","strokeLinejoin","cx","cy","r","NavigatorRecenterIcon","NavigatorVoiceIcon"],"sourceRoot":"../../../src","sources":["components/navigatorManeuverIcon.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+
3
+ import AsyncStorage from '@react-native-async-storage/async-storage';
4
+ import { isKnownPhraseKey } from "./navigatorVoiceKeys.js";
5
+
6
+ /**
7
+ * Каталог/манифест голосов навигатора и персист настроек. Порт
8
+ * `webProject/src/map/navigationVoiceCatalog.ts` на нативную часть:
9
+ * localStorage → AsyncStorage, плюс маппинг ключей фраз в URL клипов.
10
+ */
11
+
12
+ /** Per-voice manifest from S3: phrase key → variant ids. */
13
+
14
+ const LS_VOICE_PREF = 'maplite-navigator-voice-pref';
15
+ const LS_VOICE_VOLUME = 'maplite-navigator-voice-volume';
16
+ const DEFAULT_VOICE_VOLUME_LEVEL = 5;
17
+ export function volumeLevelToGain(level) {
18
+ return level * 0.2;
19
+ }
20
+ export async function readVoiceVolumeLevel() {
21
+ try {
22
+ const raw = await AsyncStorage.getItem(LS_VOICE_VOLUME);
23
+ if (!raw) return DEFAULT_VOICE_VOLUME_LEVEL;
24
+ const n = Number.parseInt(raw, 10);
25
+ if (n >= 1 && n <= 5) return n;
26
+ } catch {
27
+ /* ignore */
28
+ }
29
+ return DEFAULT_VOICE_VOLUME_LEVEL;
30
+ }
31
+ export async function writeVoiceVolumeLevel(level) {
32
+ try {
33
+ await AsyncStorage.setItem(LS_VOICE_VOLUME, String(level));
34
+ } catch {
35
+ /* ignore */
36
+ }
37
+ }
38
+ export async function readVoicePref() {
39
+ try {
40
+ const raw = await AsyncStorage.getItem(LS_VOICE_PREF);
41
+ if (!raw) return null;
42
+ const parsed = JSON.parse(raw);
43
+ if (parsed && typeof parsed === 'object' && 'disabled' in parsed && parsed.disabled === true) {
44
+ return {
45
+ disabled: true
46
+ };
47
+ }
48
+ if (parsed && typeof parsed === 'object' && 'dir' in parsed && typeof parsed.dir === 'string') {
49
+ const dir = parsed.dir.trim();
50
+ if (dir) return {
51
+ dir
52
+ };
53
+ }
54
+ } catch {
55
+ /* ignore */
56
+ }
57
+ return null;
58
+ }
59
+ export async function writeVoicePref(pref) {
60
+ try {
61
+ await AsyncStorage.setItem(LS_VOICE_PREF, JSON.stringify(pref));
62
+ } catch {
63
+ /* ignore */
64
+ }
65
+ }
66
+ export function resolveVoiceCatalogUrl(url) {
67
+ const t = url.trim();
68
+ if (!t) return null;
69
+ try {
70
+ // eslint-disable-next-line no-new
71
+ new URL(t);
72
+ return t;
73
+ } catch {
74
+ return null;
75
+ }
76
+ }
77
+
78
+ /** Base URL for a voice directory: `.../voices/{dir}`. */
79
+ export function voiceDirBaseUrl(catalogUrl, dir) {
80
+ const u = new URL(catalogUrl);
81
+ const parts = u.pathname.split('/').filter(Boolean);
82
+ if (parts.length > 0 && parts[parts.length - 1].toLowerCase().endsWith('.json')) {
83
+ parts.pop();
84
+ }
85
+ parts.push(dir);
86
+ u.pathname = `/${parts.join('/')}`;
87
+ return u.toString().replace(/\/+$/, '');
88
+ }
89
+ function voiceManifestUrl(baseUrl) {
90
+ return `${baseUrl.replace(/\/+$/, '')}/data.json`;
91
+ }
92
+ export async function fetchVoiceCatalog(catalogUrl) {
93
+ const res = await fetch(catalogUrl);
94
+ if (!res.ok) {
95
+ throw new Error(`voice catalog fetch failed: ${res.status}`);
96
+ }
97
+ const data = await res.json();
98
+ if (!Array.isArray(data)) {
99
+ throw new Error('voice catalog: expected JSON array');
100
+ }
101
+ const entries = [];
102
+ for (const item of data) {
103
+ if (item && typeof item === 'object' && typeof item.dir === 'string' && typeof item.name === 'string') {
104
+ const e = item;
105
+ entries.push({
106
+ dir: e.dir.trim(),
107
+ name: e.name,
108
+ locale: typeof e.locale === 'string' ? e.locale : 'RU'
109
+ });
110
+ }
111
+ }
112
+ if (entries.length === 0) {
113
+ throw new Error('voice catalog: empty');
114
+ }
115
+ return entries;
116
+ }
117
+ export async function fetchVoiceManifest(clipBaseUrl) {
118
+ const res = await fetch(voiceManifestUrl(clipBaseUrl));
119
+ if (!res.ok) {
120
+ throw new Error(`voice manifest fetch failed: ${res.status}`);
121
+ }
122
+ const data = await res.json();
123
+ if (!data || typeof data !== 'object' || Array.isArray(data)) {
124
+ throw new Error('voice manifest: expected JSON object');
125
+ }
126
+ const manifest = {};
127
+ for (const [key, value] of Object.entries(data)) {
128
+ if (Array.isArray(value) && value.every(v => typeof v === 'string')) {
129
+ manifest[key] = value;
130
+ }
131
+ }
132
+ return manifest;
133
+ }
134
+ function resolveSelectedDir(catalog, pref) {
135
+ if (pref && 'dir' in pref) {
136
+ const found = catalog.find(e => e.dir === pref.dir);
137
+ if (found) return found.dir;
138
+ }
139
+ return catalog[0].dir;
140
+ }
141
+
142
+ /**
143
+ * Loads catalog + user preference + optional per-voice manifest.
144
+ * When pref is `{ disabled: true }`, returns `enabled: false` and `manifest: null`.
145
+ */
146
+ export async function loadVoiceRuntime(catalogUrl) {
147
+ const resolved = resolveVoiceCatalogUrl(catalogUrl);
148
+ if (!resolved) return null;
149
+ const catalog = await fetchVoiceCatalog(resolved);
150
+ const pref = await readVoicePref();
151
+ const selectedDir = resolveSelectedDir(catalog, pref);
152
+ const clipBaseUrl = voiceDirBaseUrl(resolved, selectedDir);
153
+ if (pref != null && 'disabled' in pref && pref.disabled === true) {
154
+ return {
155
+ catalogUrl: resolved,
156
+ catalog,
157
+ selectedDir,
158
+ clipBaseUrl,
159
+ manifest: null,
160
+ enabled: false
161
+ };
162
+ }
163
+ const manifest = await fetchVoiceManifest(clipBaseUrl);
164
+ return {
165
+ catalogUrl: resolved,
166
+ catalog,
167
+ selectedDir,
168
+ clipBaseUrl,
169
+ manifest,
170
+ enabled: true
171
+ };
172
+ }
173
+
174
+ /** Reload manifest after user picks another voice (same catalog URL). */
175
+ export async function reloadVoiceForDir(catalogUrl, catalog, dir) {
176
+ const entry = catalog.find(e => e.dir === dir);
177
+ if (!entry) {
178
+ throw new Error(`voice dir not in catalog: ${dir}`);
179
+ }
180
+ const clipBaseUrl = voiceDirBaseUrl(catalogUrl, entry.dir);
181
+ const manifest = await fetchVoiceManifest(clipBaseUrl);
182
+ await writeVoicePref({
183
+ dir: entry.dir
184
+ });
185
+ return {
186
+ selectedDir: entry.dir,
187
+ clipBaseUrl,
188
+ manifest,
189
+ enabled: true
190
+ };
191
+ }
192
+ function pickVariant(manifest, key) {
193
+ const vars = manifest[key];
194
+ if (!vars?.length) return 'var1';
195
+ return vars[Math.floor(Math.random() * vars.length)] ?? 'var1';
196
+ }
197
+
198
+ /** clipId для S3: `{key}_{variant}`. */
199
+ function phraseKeyToClipId(manifest, key, variant) {
200
+ return `${key}_${variant}`;
201
+ }
202
+
203
+ /**
204
+ * Преобразует список ключей фраз (из веб-части) в список URL клипов
205
+ * `{clipBaseUrl}/{key}_{variant}.mp3`. Неизвестные / отсутствующие в
206
+ * манифесте ключи пропускаются.
207
+ */
208
+ export function keysToClipUrls(manifest, clipBaseUrl, keys) {
209
+ const base = clipBaseUrl.replace(/\/+$/, '');
210
+ const variants = new Map();
211
+ const urls = [];
212
+ for (const raw of keys) {
213
+ if (!isKnownPhraseKey(raw)) continue;
214
+ const key = raw;
215
+ if (!(key in manifest)) continue;
216
+ let variant = variants.get(key);
217
+ if (!variant) {
218
+ variant = pickVariant(manifest, key);
219
+ variants.set(key, variant);
220
+ }
221
+ urls.push(`${base}/${phraseKeyToClipId(manifest, key, variant)}.mp3`);
222
+ }
223
+ return urls;
224
+ }
225
+ //# sourceMappingURL=navigatorVoiceCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AsyncStorage","isKnownPhraseKey","LS_VOICE_PREF","LS_VOICE_VOLUME","DEFAULT_VOICE_VOLUME_LEVEL","volumeLevelToGain","level","readVoiceVolumeLevel","raw","getItem","n","Number","parseInt","writeVoiceVolumeLevel","setItem","String","readVoicePref","parsed","JSON","parse","disabled","dir","trim","writeVoicePref","pref","stringify","resolveVoiceCatalogUrl","url","t","URL","voiceDirBaseUrl","catalogUrl","u","parts","pathname","split","filter","Boolean","length","toLowerCase","endsWith","pop","push","join","toString","replace","voiceManifestUrl","baseUrl","fetchVoiceCatalog","res","fetch","ok","Error","status","data","json","Array","isArray","entries","item","name","e","locale","fetchVoiceManifest","clipBaseUrl","manifest","key","value","Object","every","v","resolveSelectedDir","catalog","found","find","loadVoiceRuntime","resolved","selectedDir","enabled","reloadVoiceForDir","entry","pickVariant","vars","Math","floor","random","phraseKeyToClipId","variant","keysToClipUrls","keys","base","variants","Map","urls","get","set"],"sourceRoot":"../../../src","sources":["components/navigatorVoiceCatalog.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Фиксированные ключи клипов навигатора (схема проекта). Зеркало
5
+ * `webProject/src/map/navigationVoiceKeys.ts` — веб-часть присылает эти
6
+ * ключи в событии `navigatorVoice`, нативная часть мапит их в аудио.
7
+ * Варианты (`var1`, …) и наличие записей — только из S3 voice manifest.
8
+ */
9
+ export const VOICE_PHRASE_KEYS = ['maneuver_sharp_left', 'maneuver_turn_left', 'maneuver_slight_left', 'maneuver_straight', 'maneuver_slight_right', 'maneuver_turn_right', 'maneuver_sharp_right', 'maneuver_arrival', 'maneuver_waypoint', 'maneuver_enter_roundabout', 'maneuver_leave_roundabout', 'maneuver_keep_left', 'maneuver_keep_right', 'maneuver_uturn', 'maneuver_uturn_left', 'maneuver_uturn_right', 'maneuver_default', 'exit_1', 'exit_2', 'exit_3', 'exit_4', 'exit_5', 'exit_6', 'exit_7', 'exit_8', 'exit_9', 'exit_10', 'exit_11', 'exit_12', 'roundabout_take_exit', 'prefix_via', 'connector_and', 'unit_meter', 'unit_meters_2_4', 'unit_meters_5_plus', 'unit_kilometer', 'unit_kilometers_2_4', 'unit_kilometers_5_plus', 'route_started', 'route_recalculated', 'arrived_title', 'arrival_at_destination', 'waypoint_reached', 'off_route', 'num_1', 'num_2', 'num_3', 'num_4', 'num_5', 'num_6', 'num_7', 'num_8', 'num_9', 'num_10', 'num_11', 'num_12', 'num_13', 'num_14', 'num_15', 'num_16', 'num_17', 'num_18', 'num_19', 'num_20', 'num_30', 'num_40', 'num_50', 'num_60', 'num_70', 'num_80', 'num_90', 'num_100', 'num_200', 'num_300', 'num_400', 'num_500', 'num_600', 'num_700', 'num_800', 'num_900', 'num_km_1', 'num_km_2', 'num_km_3', 'num_km_4', 'num_km_5', 'num_km_6', 'num_km_7', 'num_km_8', 'num_km_9', 'num_km_10', 'num_km_11', 'num_km_12', 'num_km_13', 'num_km_14', 'num_km_15', 'num_km_16', 'num_km_17', 'num_km_18', 'num_km_19', 'num_km_20', 'num_km_30', 'num_km_40', 'num_km_50', 'num_km_60', 'num_km_70', 'num_km_80', 'num_km_90', 'num_km_100', 'num_km_200', 'num_km_300', 'num_km_400', 'num_km_500', 'num_km_600', 'num_km_700', 'num_km_800', 'num_km_900'];
10
+ const VOICE_PHRASE_KEY_SET = new Set(VOICE_PHRASE_KEYS);
11
+ export function isKnownPhraseKey(key) {
12
+ return VOICE_PHRASE_KEY_SET.has(key);
13
+ }
14
+ //# sourceMappingURL=navigatorVoiceKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["VOICE_PHRASE_KEYS","VOICE_PHRASE_KEY_SET","Set","isKnownPhraseKey","key","has"],"sourceRoot":"../../../src","sources":["components/navigatorVoiceKeys.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,iBAAiB,GAAG,CAC7B,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,sBAAsB,EACtB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,qBAAqB,EACrB,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,wBAAwB,EACxB,kBAAkB,EAClB,WAAW,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,CACN;AAIV,MAAMC,oBAAoB,GAAG,IAAIC,GAAG,CAASF,iBAAiB,CAAC;AAE/D,OAAO,SAASG,gBAAgBA,CAACC,GAAW,EAAyB;EACjE,OAAOH,oBAAoB,CAACI,GAAG,CAACD,GAAG,CAAC;AACxC","ignoreList":[]}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+
3
+ import { forwardRef, useImperativeHandle, useRef, useState } from 'react';
4
+ import Video from 'react-native-video';
5
+
6
+ /**
7
+ * Последовательный проигрыватель клипов озвучки навигатора. Порт логики
8
+ * очереди из `webProject/src/map/navigationVoicePlayer.ts` на `react-native-video`:
9
+ * веб присылает список ключей фраз, нативная часть собирает из них URL и
10
+ * проигрывает их по очереди с короткой паузой между клипами.
11
+ */
12
+
13
+ /** Пауза между клипами (как в веб-плеере). */
14
+ import { jsx as _jsx } from "react/jsx-runtime";
15
+ const CLIP_PAUSE_MS = 300;
16
+ export const NavigatorVoicePlayer = /*#__PURE__*/forwardRef((props, ref) => {
17
+ const [current, setCurrent] = useState(null);
18
+ const [volume, setVolume] = useState(typeof props.initialVolume === 'number' ? Math.min(1, Math.max(0, props.initialVolume)) : 1);
19
+ const queueRef = useRef([]);
20
+ const indexRef = useRef(0);
21
+ /** Поколение очереди: рост инвалидирует «хвосты» предыдущих очередей. */
22
+ const genRef = useRef(0);
23
+ /** Меняем токен, чтобы перерисовать `<Video>` даже при том же URL подряд. */
24
+ const tokenRef = useRef(0);
25
+ const pauseTimerRef = useRef(null);
26
+ const clearPause = () => {
27
+ if (pauseTimerRef.current != null) {
28
+ clearTimeout(pauseTimerRef.current);
29
+ pauseTimerRef.current = null;
30
+ }
31
+ };
32
+ const playIndex = () => {
33
+ const uri = queueRef.current[indexRef.current];
34
+ if (uri == null) {
35
+ setCurrent(null);
36
+ return;
37
+ }
38
+ tokenRef.current += 1;
39
+ setCurrent({
40
+ uri,
41
+ token: tokenRef.current
42
+ });
43
+ };
44
+ const advance = gen => {
45
+ if (gen !== genRef.current) return;
46
+ indexRef.current += 1;
47
+ if (indexRef.current >= queueRef.current.length) {
48
+ setCurrent(null);
49
+ return;
50
+ }
51
+ clearPause();
52
+ pauseTimerRef.current = setTimeout(() => {
53
+ pauseTimerRef.current = null;
54
+ if (gen === genRef.current) playIndex();
55
+ }, CLIP_PAUSE_MS);
56
+ };
57
+ useImperativeHandle(ref, () => ({
58
+ playUrls: urls => {
59
+ clearPause();
60
+ genRef.current += 1;
61
+ queueRef.current = urls;
62
+ indexRef.current = 0;
63
+ if (urls.length === 0) {
64
+ setCurrent(null);
65
+ return;
66
+ }
67
+ playIndex();
68
+ },
69
+ stop: () => {
70
+ clearPause();
71
+ genRef.current += 1;
72
+ queueRef.current = [];
73
+ indexRef.current = 0;
74
+ setCurrent(null);
75
+ },
76
+ setVolume: gain => {
77
+ setVolume(Math.min(1, Math.max(0, gain)));
78
+ }
79
+ }), []);
80
+ if (!current) return null;
81
+ const gen = genRef.current;
82
+ return /*#__PURE__*/_jsx(Video, {
83
+ source: {
84
+ uri: current.uri
85
+ },
86
+ paused: false,
87
+ volume: volume,
88
+ repeat: false,
89
+ ignoreSilentSwitch: "ignore",
90
+ playInBackground: true,
91
+ onEnd: () => advance(gen),
92
+ onError: () => advance(gen),
93
+ style: {
94
+ width: 0,
95
+ height: 0
96
+ }
97
+ }, current.token);
98
+ });
99
+ NavigatorVoicePlayer.displayName = 'NavigatorVoicePlayer';
100
+ //# sourceMappingURL=navigatorVoicePlayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["forwardRef","useImperativeHandle","useRef","useState","Video","jsx","_jsx","CLIP_PAUSE_MS","NavigatorVoicePlayer","props","ref","current","setCurrent","volume","setVolume","initialVolume","Math","min","max","queueRef","indexRef","genRef","tokenRef","pauseTimerRef","clearPause","clearTimeout","playIndex","uri","token","advance","gen","length","setTimeout","playUrls","urls","stop","gain","source","paused","repeat","ignoreSilentSwitch","playInBackground","onEnd","onError","style","width","height","displayName"],"sourceRoot":"../../../src","sources":["components/navigatorVoicePlayer.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Подписи нативного UI навигатора (FAB-кнопки, меню голоса, подсказка
5
+ * pick-режима). Текст HUD маршрута приходит готовым из веб-части, поэтому
6
+ * здесь только то, что рисуется нативно. Порт voice/recenter-строк из
7
+ * `webProject/src/map/local.ts`.
8
+ */
9
+
10
+ const ru = {
11
+ recenterAria: 'Вернуть фокус на положение',
12
+ voicePickerAria: 'Голос навигатора',
13
+ voiceDisable: 'Отключить озвучку',
14
+ voiceOff: 'Озвучка выкл.',
15
+ voiceVolumeLabel: 'Громкость',
16
+ voiceVolumeStepAria: step => `Громкость ${step} из 5`,
17
+ pickHint: 'Кликните по карте, чтобы установить текущее положение'
18
+ };
19
+ const en = {
20
+ recenterAria: 'Recenter on your position',
21
+ voicePickerAria: 'Navigator voice',
22
+ voiceDisable: 'Turn off voice guidance',
23
+ voiceOff: 'Voice off',
24
+ voiceVolumeLabel: 'Volume',
25
+ voiceVolumeStepAria: step => `Volume ${step} of 5`,
26
+ pickHint: 'Tap the map to set the current position'
27
+ };
28
+ export function navigatorUiStrings(lang) {
29
+ return lang === 'en' ? en : ru;
30
+ }
31
+ //# sourceMappingURL=navigatorVoiceStrings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ru","recenterAria","voicePickerAria","voiceDisable","voiceOff","voiceVolumeLabel","voiceVolumeStepAria","step","pickHint","en","navigatorUiStrings","lang"],"sourceRoot":"../../../src","sources":["components/navigatorVoiceStrings.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA;AACA;;AAYA,MAAMA,EAAsB,GAAG;EAC3BC,YAAY,EAAE,4BAA4B;EAC1CC,eAAe,EAAE,kBAAkB;EACnCC,YAAY,EAAE,mBAAmB;EACjCC,QAAQ,EAAE,eAAe;EACzBC,gBAAgB,EAAE,WAAW;EAC7BC,mBAAmB,EAAGC,IAAY,IAAK,aAAaA,IAAI,OAAO;EAC/DC,QAAQ,EAAE;AACd,CAAC;AAED,MAAMC,EAAsB,GAAG;EAC3BR,YAAY,EAAE,2BAA2B;EACzCC,eAAe,EAAE,iBAAiB;EAClCC,YAAY,EAAE,yBAAyB;EACvCC,QAAQ,EAAE,WAAW;EACrBC,gBAAgB,EAAE,QAAQ;EAC1BC,mBAAmB,EAAGC,IAAY,IAAK,UAAUA,IAAI,OAAO;EAC5DC,QAAQ,EAAE;AACd,CAAC;AAED,OAAO,SAASE,kBAAkBA,CAACC,IAA+B,EAAsB;EACpF,OAAOA,IAAI,KAAK,IAAI,GAAGF,EAAE,GAAGT,EAAE;AAClC","ignoreList":[]}