react-native-maplibre-lite 0.2.0 → 0.2.2
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 +116 -14
- 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 +261 -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 +22 -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 +14 -1
- 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 +83 -17
- 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 +154 -8
- 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 +316 -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 +87 -18
- 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 +8 -0
|
@@ -0,0 +1,261 @@
|
|
|
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
|
+
const HTTP_URL_PREFIX_RE = /^https?:\/\//i;
|
|
67
|
+
function trimTrailingSlashes(s) {
|
|
68
|
+
return s.replace(/\/+$/, '');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Strips `?query` and `#hash` — catalog URLs are plain paths. */
|
|
72
|
+
function stripUrlQueryAndHash(url) {
|
|
73
|
+
const q = url.indexOf('?');
|
|
74
|
+
const h = url.indexOf('#');
|
|
75
|
+
let end = url.length;
|
|
76
|
+
if (q >= 0) end = Math.min(end, q);
|
|
77
|
+
if (h >= 0) end = Math.min(end, h);
|
|
78
|
+
return url.slice(0, end);
|
|
79
|
+
}
|
|
80
|
+
function pathnameSegments(pathname) {
|
|
81
|
+
return pathname.split('/').filter(Boolean);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Parses `http(s)://host[:port]/path` without the URL API (Hermes-safe).
|
|
86
|
+
*/
|
|
87
|
+
function parseHttpUrl(url) {
|
|
88
|
+
const bare = stripUrlQueryAndHash(url.trim());
|
|
89
|
+
if (!HTTP_URL_PREFIX_RE.test(bare)) return null;
|
|
90
|
+
const schemeEnd = bare.indexOf('://');
|
|
91
|
+
const rest = bare.slice(schemeEnd + 3);
|
|
92
|
+
const slash = rest.indexOf('/');
|
|
93
|
+
const authority = slash === -1 ? rest : rest.slice(0, slash);
|
|
94
|
+
if (!authority) return null;
|
|
95
|
+
const pathname = slash === -1 ? '/' : rest.slice(slash);
|
|
96
|
+
const origin = bare.slice(0, schemeEnd + 3) + authority;
|
|
97
|
+
return {
|
|
98
|
+
origin,
|
|
99
|
+
pathname
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function resolveVoiceCatalogUrl(url) {
|
|
103
|
+
const t = url.trim();
|
|
104
|
+
if (!t) return null;
|
|
105
|
+
return parseHttpUrl(t) ? t : null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Base URL for a voice directory: `.../voices/{dir}`. */
|
|
109
|
+
export function voiceDirBaseUrl(catalogUrl, dir) {
|
|
110
|
+
const parsed = parseHttpUrl(catalogUrl);
|
|
111
|
+
if (!parsed) {
|
|
112
|
+
throw new Error('voiceDirBaseUrl: invalid catalog URL');
|
|
113
|
+
}
|
|
114
|
+
const parts = pathnameSegments(parsed.pathname);
|
|
115
|
+
if (parts.length > 0 && parts[parts.length - 1].toLowerCase().endsWith('.json')) {
|
|
116
|
+
parts.pop();
|
|
117
|
+
}
|
|
118
|
+
const safeDir = dir.trim().replace(/[/\\]+/g, '');
|
|
119
|
+
if (!safeDir) {
|
|
120
|
+
throw new Error('voiceDirBaseUrl: empty dir');
|
|
121
|
+
}
|
|
122
|
+
parts.push(safeDir);
|
|
123
|
+
return trimTrailingSlashes(`${parsed.origin}/${parts.join('/')}`);
|
|
124
|
+
}
|
|
125
|
+
function voiceManifestUrl(baseUrl) {
|
|
126
|
+
return `${trimTrailingSlashes(baseUrl)}/data.json`;
|
|
127
|
+
}
|
|
128
|
+
export async function fetchVoiceCatalog(catalogUrl) {
|
|
129
|
+
const res = await fetch(catalogUrl);
|
|
130
|
+
if (!res.ok) {
|
|
131
|
+
throw new Error(`voice catalog fetch failed: ${res.status}`);
|
|
132
|
+
}
|
|
133
|
+
const data = await res.json();
|
|
134
|
+
if (!Array.isArray(data)) {
|
|
135
|
+
throw new Error('voice catalog: expected JSON array');
|
|
136
|
+
}
|
|
137
|
+
const entries = [];
|
|
138
|
+
for (const item of data) {
|
|
139
|
+
if (item && typeof item === 'object' && typeof item.dir === 'string' && typeof item.name === 'string') {
|
|
140
|
+
const e = item;
|
|
141
|
+
entries.push({
|
|
142
|
+
dir: e.dir.trim(),
|
|
143
|
+
name: e.name,
|
|
144
|
+
locale: typeof e.locale === 'string' ? e.locale : 'RU'
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (entries.length === 0) {
|
|
149
|
+
throw new Error('voice catalog: empty');
|
|
150
|
+
}
|
|
151
|
+
return entries;
|
|
152
|
+
}
|
|
153
|
+
export async function fetchVoiceManifest(clipBaseUrl) {
|
|
154
|
+
const res = await fetch(voiceManifestUrl(clipBaseUrl));
|
|
155
|
+
if (!res.ok) {
|
|
156
|
+
throw new Error(`voice manifest fetch failed: ${res.status}`);
|
|
157
|
+
}
|
|
158
|
+
const data = await res.json();
|
|
159
|
+
if (!data || typeof data !== 'object' || Array.isArray(data)) {
|
|
160
|
+
throw new Error('voice manifest: expected JSON object');
|
|
161
|
+
}
|
|
162
|
+
const manifest = {};
|
|
163
|
+
for (const [key, value] of Object.entries(data)) {
|
|
164
|
+
if (Array.isArray(value) && value.every(v => typeof v === 'string')) {
|
|
165
|
+
manifest[key] = value;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return manifest;
|
|
169
|
+
}
|
|
170
|
+
function resolveSelectedDir(catalog, pref) {
|
|
171
|
+
if (pref && 'dir' in pref) {
|
|
172
|
+
const found = catalog.find(e => e.dir === pref.dir);
|
|
173
|
+
if (found) return found.dir;
|
|
174
|
+
}
|
|
175
|
+
return catalog[0].dir;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Loads catalog + user preference + optional per-voice manifest.
|
|
180
|
+
* When pref is `{ disabled: true }`, returns `enabled: false` and `manifest: null`.
|
|
181
|
+
*/
|
|
182
|
+
export async function loadVoiceRuntime(catalogUrl) {
|
|
183
|
+
const resolved = resolveVoiceCatalogUrl(catalogUrl);
|
|
184
|
+
if (!resolved) return null;
|
|
185
|
+
const catalog = await fetchVoiceCatalog(resolved);
|
|
186
|
+
const pref = await readVoicePref();
|
|
187
|
+
const selectedDir = resolveSelectedDir(catalog, pref);
|
|
188
|
+
const clipBaseUrl = voiceDirBaseUrl(resolved, selectedDir);
|
|
189
|
+
if (pref != null && 'disabled' in pref && pref.disabled === true) {
|
|
190
|
+
return {
|
|
191
|
+
catalogUrl: resolved,
|
|
192
|
+
catalog,
|
|
193
|
+
selectedDir,
|
|
194
|
+
clipBaseUrl,
|
|
195
|
+
manifest: null,
|
|
196
|
+
enabled: false
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
const manifest = await fetchVoiceManifest(clipBaseUrl);
|
|
200
|
+
return {
|
|
201
|
+
catalogUrl: resolved,
|
|
202
|
+
catalog,
|
|
203
|
+
selectedDir,
|
|
204
|
+
clipBaseUrl,
|
|
205
|
+
manifest,
|
|
206
|
+
enabled: true
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/** Reload manifest after user picks another voice (same catalog URL). */
|
|
211
|
+
export async function reloadVoiceForDir(catalogUrl, catalog, dir) {
|
|
212
|
+
const entry = catalog.find(e => e.dir === dir);
|
|
213
|
+
if (!entry) {
|
|
214
|
+
throw new Error(`voice dir not in catalog: ${dir}`);
|
|
215
|
+
}
|
|
216
|
+
const clipBaseUrl = voiceDirBaseUrl(catalogUrl, entry.dir);
|
|
217
|
+
const manifest = await fetchVoiceManifest(clipBaseUrl);
|
|
218
|
+
await writeVoicePref({
|
|
219
|
+
dir: entry.dir
|
|
220
|
+
});
|
|
221
|
+
return {
|
|
222
|
+
selectedDir: entry.dir,
|
|
223
|
+
clipBaseUrl,
|
|
224
|
+
manifest,
|
|
225
|
+
enabled: true
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function pickVariant(manifest, key) {
|
|
229
|
+
const vars = manifest[key];
|
|
230
|
+
if (!vars?.length) return 'var1';
|
|
231
|
+
return vars[Math.floor(Math.random() * vars.length)] ?? 'var1';
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** clipId для S3: `{key}_{variant}`. */
|
|
235
|
+
function phraseKeyToClipId(manifest, key, variant) {
|
|
236
|
+
return `${key}_${variant}`;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Преобразует список ключей фраз (из веб-части) в список URL клипов
|
|
241
|
+
* `{clipBaseUrl}/{key}_{variant}.mp3`. Неизвестные / отсутствующие в
|
|
242
|
+
* манифесте ключи пропускаются.
|
|
243
|
+
*/
|
|
244
|
+
export function keysToClipUrls(manifest, clipBaseUrl, keys) {
|
|
245
|
+
const base = trimTrailingSlashes(clipBaseUrl);
|
|
246
|
+
const variants = new Map();
|
|
247
|
+
const urls = [];
|
|
248
|
+
for (const raw of keys) {
|
|
249
|
+
if (!isKnownPhraseKey(raw)) continue;
|
|
250
|
+
const key = raw;
|
|
251
|
+
if (!(key in manifest)) continue;
|
|
252
|
+
let variant = variants.get(key);
|
|
253
|
+
if (!variant) {
|
|
254
|
+
variant = pickVariant(manifest, key);
|
|
255
|
+
variants.set(key, variant);
|
|
256
|
+
}
|
|
257
|
+
urls.push(`${base}/${phraseKeyToClipId(manifest, key, variant)}.mp3`);
|
|
258
|
+
}
|
|
259
|
+
return urls;
|
|
260
|
+
}
|
|
261
|
+
//# 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","HTTP_URL_PREFIX_RE","trimTrailingSlashes","s","replace","stripUrlQueryAndHash","url","q","indexOf","h","end","length","Math","min","slice","pathnameSegments","pathname","split","filter","Boolean","parseHttpUrl","bare","test","schemeEnd","rest","slash","authority","origin","resolveVoiceCatalogUrl","t","voiceDirBaseUrl","catalogUrl","Error","parts","toLowerCase","endsWith","pop","safeDir","push","join","voiceManifestUrl","baseUrl","fetchVoiceCatalog","res","fetch","ok","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","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":[]}
|
|
@@ -1,5 +1,13 @@
|
|
|
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
|
+
|
|
3
11
|
/** Web → RN: `postToNative` payload (`webProject/src/map/types.ts`). */
|
|
4
12
|
|
|
5
13
|
/**
|
|
@@ -12,6 +20,18 @@ export const NAVIGATOR_PROFILE_IDS = ['car', 'car_avoid_motorway', 'car_avoid_fe
|
|
|
12
20
|
|
|
13
21
|
/** [longitude, latitude] — как в GeoJSON / GraphHopper. */
|
|
14
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
|
+
|
|
15
35
|
/** Parsed MapLibre style JSON — `InitParams.mapStyle` / `UpdateParams.mapStyle` в WebView. */
|
|
16
36
|
|
|
17
37
|
/** RN → Web: `init` (`MapLiteController.InitParams`). */
|
|
@@ -34,4 +54,6 @@ export const NAVIGATOR_PROFILE_IDS = ['car', 'car_avoid_motorway', 'car_avoid_fe
|
|
|
34
54
|
/** Web → RN: `postToNative` (`webProject/src/map/types.ts`). */
|
|
35
55
|
|
|
36
56
|
/** Имена `event` в `{ type: 'event', event, params }` из WebView. */
|
|
57
|
+
|
|
58
|
+
/** `params` для `{ type: 'event', event, params }` по имени события. */
|
|
37
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":[]}
|