@alfalab/bridge-to-native 1.5.2-beta.b951ff8 → 1.5.2-beta.feed590
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/client/bridge-to-native.d.ts +35 -42
- package/client/bridge-to-native.js +40 -49
- package/client/constants.d.ts +2 -2
- package/client/constants.js +2 -2
- package/client/services-and-utils/{native-bridge-service.d.ts → modern-bridge-service.d.ts} +6 -11
- package/client/services-and-utils/{native-bridge-service.js → modern-bridge-service.js} +13 -29
- package/client/services-and-utils/native-commands-service.d.ts +21 -0
- package/client/services-and-utils/native-commands-service.js +54 -0
- package/client/services-and-utils/native-features.d.ts +6 -4
- package/client/services-and-utils/native-features.js +8 -6
- package/client/services-and-utils/native-params-service.d.ts +0 -2
- package/client/types.d.ts +11 -11
- package/package.json +1 -1
- package/client/services-and-utils/web-features-service.d.ts +0 -37
- package/client/services-and-utils/web-features-service.js +0 -67
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { type BrowserHistoryApiWrappers, type
|
|
2
|
+
import { type BrowserHistoryApiWrappers, type GeoConfiguration, type HapticsOptions, type HistoryPushStateParams, type HistoryReplaceStateParams, type LocationAssignParam, type LogError, type NativeFeatureKey, type PdfType, type SheetDragArea } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* Сервис, предоставляет методы для WA, работающего внутри NA.
|
|
5
5
|
*/
|
|
@@ -13,16 +13,18 @@ export declare class BridgeToNative {
|
|
|
13
13
|
* будут использованы стандартные `History: pushState()` и `History: go()`.
|
|
14
14
|
* @param options.logError Функция с помощью которой B2N может залогировать ошибку,
|
|
15
15
|
* если не передать, B2N не будет логировать ошибки.
|
|
16
|
+
* @param options.isSheetWebview Признак открытия WV в шторе. Отвечает за доступность
|
|
17
|
+
* новых методов взаимодействия с нативом. По умолчанию true.
|
|
16
18
|
*/
|
|
17
19
|
constructor(options?: {
|
|
18
20
|
browserHistoryApiWrappers?: BrowserHistoryApiWrappers;
|
|
19
21
|
logError?: LogError;
|
|
22
|
+
isSheetWebview?: boolean;
|
|
20
23
|
} | undefined);
|
|
21
24
|
private nativeParamsService;
|
|
22
25
|
private externalLinksService;
|
|
23
26
|
private nativeNavigationAndTitleService;
|
|
24
|
-
private
|
|
25
|
-
private webFeaturesService;
|
|
27
|
+
private nativeCommandsService;
|
|
26
28
|
/**
|
|
27
29
|
* Схема NA.
|
|
28
30
|
*/
|
|
@@ -80,16 +82,6 @@ export declare class BridgeToNative {
|
|
|
80
82
|
* ресурс в новом WV.
|
|
81
83
|
*/
|
|
82
84
|
getHrefToOpenInBrowser(link: string): string;
|
|
83
|
-
/**
|
|
84
|
-
* Запрашивает текущую конфигурацию геолокации WebFeatures.
|
|
85
|
-
*
|
|
86
|
-
* ВАЖНО!
|
|
87
|
-
* Доступно только в iOS начиная с версии АМ `17.0.0`.
|
|
88
|
-
* В несовместимом окружении возвращённый промис будет отклонён.
|
|
89
|
-
*
|
|
90
|
-
* @returns Промис с `permission` и `userCoordinate` (`null`, если доступ не разрешён).
|
|
91
|
-
*/
|
|
92
|
-
getGeoConfiguration(): Promise<WebFeaturesGeoConfiguration>;
|
|
93
85
|
/**
|
|
94
86
|
* Делает один шаг назад по браузерной истории и модифицирует внутреннее состояние B2N,
|
|
95
87
|
* чтобы в дальнейшем зарегистрировать этот переход в NA.
|
|
@@ -254,46 +246,47 @@ export declare class BridgeToNative {
|
|
|
254
246
|
*/
|
|
255
247
|
setTitle(nativeTitle: string): void;
|
|
256
248
|
/**
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
261
|
-
*
|
|
262
|
-
*
|
|
249
|
+
* Возвращает статус доступа к геолокации и, при наличии разрешения, координаты пользователя.
|
|
250
|
+
* Работает только на iOS в версиях `17.0.0` и выше.
|
|
251
|
+
* В Android нужно использовать Web API.
|
|
252
|
+
*
|
|
253
|
+
* @returns Promise с конфигурацией геолокации:
|
|
254
|
+
* `permission`: `allowed` — доступ разрешён; `denied` — запрещён;
|
|
255
|
+
* `notDetermined` — решение ещё не принято; `restricted` — доступ ограничен.
|
|
256
|
+
* `userCoordinate`: `{ latitude, longitude }` или `null`, если доступ не разрешён.
|
|
257
|
+
* Отказ в доступе — успешный ответ с соответствующим permission, а не ошибка запроса.
|
|
258
|
+
*/
|
|
259
|
+
getGeoConfiguration(): Promise<GeoConfiguration>;
|
|
260
|
+
/**
|
|
261
|
+
* Воспроизводит тактильный отклик.
|
|
262
|
+
* Работает только на iOS в версиях `17.0.0` и выше.
|
|
263
263
|
*
|
|
264
|
+
* @param isFTEnabled Значение фича-тогла webViewHapticsIOS;
|
|
265
|
+
* при false команда не отправляется.
|
|
264
266
|
* @param options.type Тип тактильного отклика.
|
|
265
|
-
* @param options.intensity Интенсивность
|
|
266
|
-
*
|
|
267
|
+
* @param options.intensity Интенсивность от 0 до 1, применяется только
|
|
268
|
+
* к impact-типам. Если не передана, NA использует значение по умолчанию.
|
|
267
269
|
*/
|
|
268
|
-
vibrate(options:
|
|
270
|
+
vibrate(options: HapticsOptions, isFTEnabled: boolean): void;
|
|
269
271
|
/**
|
|
270
272
|
* Задаёт область нативной шторы, за которую можно её перетаскивать.
|
|
273
|
+
* Работает только на iOS в версиях `17.0.0` и выше.
|
|
271
274
|
*
|
|
272
|
-
*
|
|
273
|
-
*
|
|
274
|
-
*
|
|
275
|
-
*
|
|
276
|
-
* @param area Область перетаскивания шторы.
|
|
275
|
+
* @param area
|
|
276
|
+
* `wholeSheet` — перетаскивание за любую часть шторы (по умолчанию в NA),
|
|
277
|
+
* данная опция может конфликтовать с `drag` обработчиками в вебе.
|
|
277
278
|
*/
|
|
278
|
-
setSheetDragArea(area:
|
|
279
|
+
setSheetDragArea(area: SheetDragArea): void;
|
|
279
280
|
/**
|
|
280
281
|
* Скрывает нативный таббар.
|
|
281
|
-
*
|
|
282
|
-
*
|
|
283
|
-
* Доступно только в iOS начиная с версии АМ `17.0.0`.
|
|
284
|
-
* В несовместимом окружении вызов игнорируется.
|
|
285
|
-
* Управляется нативным фича-тоглом `mainSuperAppIOS`.
|
|
282
|
+
* Метод имеет смысл только на iOS в версиях `17.0.0` и выше, в которых WV-модуль
|
|
283
|
+
* может открываться с таббаром внизу.
|
|
286
284
|
*/
|
|
287
285
|
hideTabbar(): void;
|
|
288
286
|
/**
|
|
289
|
-
* Показывает нативный таббар
|
|
290
|
-
*
|
|
291
|
-
*
|
|
292
|
-
* Доступно только в iOS начиная с версии АМ `17.0.0`.
|
|
293
|
-
* В несовместимом окружении вызов игнорируется.
|
|
294
|
-
* Управляется нативным фича-тоглом `mainSuperAppIOS`.
|
|
295
|
-
*
|
|
296
|
-
* @param selectedId id вкладки, которую выбрать при показе.
|
|
287
|
+
* Показывает нативный таббар (будет активна вкладка, которая была активна при скрытии).
|
|
288
|
+
* Метод имеет смысл только на iOS в версиях `17.0.0` и выше, в которых WV-модуль
|
|
289
|
+
* может открываться с таббаром внизу.
|
|
297
290
|
*/
|
|
298
|
-
showTabbar(
|
|
291
|
+
showTabbar(): void;
|
|
299
292
|
}
|
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.BridgeToNative = void 0;
|
|
5
5
|
const external_links_service_1 = require("./services-and-utils/external-links-service");
|
|
6
|
-
const
|
|
6
|
+
const native_commands_service_1 = require("./services-and-utils/native-commands-service");
|
|
7
7
|
const native_navigation_and_title_service_1 = require("./services-and-utils/native-navigation-and-title-service");
|
|
8
8
|
const native_params_service_1 = require("./services-and-utils/native-params-service");
|
|
9
|
-
const web_features_service_1 = require("./services-and-utils/web-features-service");
|
|
10
9
|
/**
|
|
11
10
|
* Сервис, предоставляет методы для WA, работающего внутри NA.
|
|
12
11
|
*/
|
|
@@ -19,15 +18,16 @@ class BridgeToNative {
|
|
|
19
18
|
* будут использованы стандартные `History: pushState()` и `History: go()`.
|
|
20
19
|
* @param options.logError Функция с помощью которой B2N может залогировать ошибку,
|
|
21
20
|
* если не передать, B2N не будет логировать ошибки.
|
|
21
|
+
* @param options.isSheetWebview Признак открытия WV в шторе. Отвечает за доступность
|
|
22
|
+
* новых методов взаимодействия с нативом. По умолчанию true.
|
|
22
23
|
*/
|
|
23
24
|
constructor(options) {
|
|
24
|
-
var _a, _b, _c, _d, _e;
|
|
25
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
25
26
|
this.options = options;
|
|
26
27
|
this.nativeParamsService = new native_params_service_1.NativeParamsService((_a = this.options) === null || _a === void 0 ? void 0 : _a.logError);
|
|
27
28
|
this.externalLinksService = new external_links_service_1.ExternalLinksService(this.nativeParamsService, (_b = this.options) === null || _b === void 0 ? void 0 : _b.logError);
|
|
28
29
|
this.nativeNavigationAndTitleService = new native_navigation_and_title_service_1.NativeNavigationAndTitleService(this.nativeParamsService, (_c = this.options) === null || _c === void 0 ? void 0 : _c.browserHistoryApiWrappers, (_d = this.options) === null || _d === void 0 ? void 0 : _d.logError);
|
|
29
|
-
this.
|
|
30
|
-
this.webFeaturesService = new web_features_service_1.WebFeaturesService(this.nativeParamsService, this.nativeBridgeService);
|
|
30
|
+
this.nativeCommandsService = new native_commands_service_1.NativeCommandsService(this.nativeParamsService, (_e = this.options) === null || _e === void 0 ? void 0 : _e.logError, (_g = (_f = this.options) === null || _f === void 0 ? void 0 : _f.isSheetWebview) !== null && _g !== void 0 ? _g : true);
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
33
|
* Схема NA.
|
|
@@ -106,18 +106,6 @@ class BridgeToNative {
|
|
|
106
106
|
getHrefToOpenInBrowser(link) {
|
|
107
107
|
return this.externalLinksService.getHrefToOpenInBrowser(link);
|
|
108
108
|
}
|
|
109
|
-
/**
|
|
110
|
-
* Запрашивает текущую конфигурацию геолокации WebFeatures.
|
|
111
|
-
*
|
|
112
|
-
* ВАЖНО!
|
|
113
|
-
* Доступно только в iOS начиная с версии АМ `17.0.0`.
|
|
114
|
-
* В несовместимом окружении возвращённый промис будет отклонён.
|
|
115
|
-
*
|
|
116
|
-
* @returns Промис с `permission` и `userCoordinate` (`null`, если доступ не разрешён).
|
|
117
|
-
*/
|
|
118
|
-
getGeoConfiguration() {
|
|
119
|
-
return this.webFeaturesService.getGeoConfiguration();
|
|
120
|
-
}
|
|
121
109
|
/**
|
|
122
110
|
* Делает один шаг назад по браузерной истории и модифицирует внутреннее состояние B2N,
|
|
123
111
|
* чтобы в дальнейшем зарегистрировать этот переход в NA.
|
|
@@ -313,55 +301,58 @@ class BridgeToNative {
|
|
|
313
301
|
this.nativeNavigationAndTitleService.setTitle(nativeTitle);
|
|
314
302
|
}
|
|
315
303
|
/**
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
304
|
+
* Возвращает статус доступа к геолокации и, при наличии разрешения, координаты пользователя.
|
|
305
|
+
* Работает только на iOS в версиях `17.0.0` и выше.
|
|
306
|
+
* В Android нужно использовать Web API.
|
|
307
|
+
*
|
|
308
|
+
* @returns Promise с конфигурацией геолокации:
|
|
309
|
+
* `permission`: `allowed` — доступ разрешён; `denied` — запрещён;
|
|
310
|
+
* `notDetermined` — решение ещё не принято; `restricted` — доступ ограничен.
|
|
311
|
+
* `userCoordinate`: `{ latitude, longitude }` или `null`, если доступ не разрешён.
|
|
312
|
+
* Отказ в доступе — успешный ответ с соответствующим permission, а не ошибка запроса.
|
|
313
|
+
*/
|
|
314
|
+
getGeoConfiguration() {
|
|
315
|
+
return this.nativeCommandsService.getGeoConfiguration();
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Воспроизводит тактильный отклик.
|
|
319
|
+
* Работает только на iOS в версиях `17.0.0` и выше.
|
|
322
320
|
*
|
|
321
|
+
* @param isFTEnabled Значение фича-тогла webViewHapticsIOS;
|
|
322
|
+
* при false команда не отправляется.
|
|
323
323
|
* @param options.type Тип тактильного отклика.
|
|
324
|
-
* @param options.intensity Интенсивность
|
|
325
|
-
*
|
|
324
|
+
* @param options.intensity Интенсивность от 0 до 1, применяется только
|
|
325
|
+
* к impact-типам. Если не передана, NA использует значение по умолчанию.
|
|
326
326
|
*/
|
|
327
|
-
vibrate(options) {
|
|
328
|
-
this.
|
|
327
|
+
vibrate(options, isFTEnabled) {
|
|
328
|
+
this.nativeCommandsService.vibrate(options, isFTEnabled);
|
|
329
329
|
}
|
|
330
330
|
/**
|
|
331
331
|
* Задаёт область нативной шторы, за которую можно её перетаскивать.
|
|
332
|
+
* Работает только на iOS в версиях `17.0.0` и выше.
|
|
332
333
|
*
|
|
333
|
-
*
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
* @param area Область перетаскивания шторы.
|
|
334
|
+
* @param area
|
|
335
|
+
* `wholeSheet` — перетаскивание за любую часть шторы (по умолчанию в NA),
|
|
336
|
+
* данная опция может конфликтовать с `drag` обработчиками в вебе.
|
|
338
337
|
*/
|
|
339
338
|
setSheetDragArea(area) {
|
|
340
|
-
this.
|
|
339
|
+
this.nativeCommandsService.setSheetDragArea(area);
|
|
341
340
|
}
|
|
342
341
|
/**
|
|
343
342
|
* Скрывает нативный таббар.
|
|
344
|
-
*
|
|
345
|
-
*
|
|
346
|
-
* Доступно только в iOS начиная с версии АМ `17.0.0`.
|
|
347
|
-
* В несовместимом окружении вызов игнорируется.
|
|
348
|
-
* Управляется нативным фича-тоглом `mainSuperAppIOS`.
|
|
343
|
+
* Метод имеет смысл только на iOS в версиях `17.0.0` и выше, в которых WV-модуль
|
|
344
|
+
* может открываться с таббаром внизу.
|
|
349
345
|
*/
|
|
350
346
|
hideTabbar() {
|
|
351
|
-
this.
|
|
347
|
+
this.nativeCommandsService.hideTabbar();
|
|
352
348
|
}
|
|
353
349
|
/**
|
|
354
|
-
* Показывает нативный таббар
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
* Доступно только в iOS начиная с версии АМ `17.0.0`.
|
|
358
|
-
* В несовместимом окружении вызов игнорируется.
|
|
359
|
-
* Управляется нативным фича-тоглом `mainSuperAppIOS`.
|
|
360
|
-
*
|
|
361
|
-
* @param selectedId id вкладки, которую выбрать при показе.
|
|
350
|
+
* Показывает нативный таббар (будет активна вкладка, которая была активна при скрытии).
|
|
351
|
+
* Метод имеет смысл только на iOS в версиях `17.0.0` и выше, в которых WV-модуль
|
|
352
|
+
* может открываться с таббаром внизу.
|
|
362
353
|
*/
|
|
363
|
-
showTabbar(
|
|
364
|
-
this.
|
|
354
|
+
showTabbar() {
|
|
355
|
+
this.nativeCommandsService.showTabbar();
|
|
365
356
|
}
|
|
366
357
|
}
|
|
367
358
|
exports.BridgeToNative = BridgeToNative;
|
package/client/constants.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type ModernAction, type NativeFeaturesFromVersion } from './types';
|
|
2
2
|
export declare const ANDROID_APP_ID = "alfabank";
|
|
3
3
|
export declare const DEEP_LINK_PATTERN: RegExp;
|
|
4
4
|
export declare const NATIVE_FEATURES_FROM_VERSION: NativeFeaturesFromVersion;
|
|
@@ -11,6 +11,6 @@ export declare const VERSION_TO_IOS_APP_ID: {
|
|
|
11
11
|
readonly '13.5.0': "assistmekz";
|
|
12
12
|
readonly '14.5.0': "smartfinancementor";
|
|
13
13
|
};
|
|
14
|
-
export declare const
|
|
14
|
+
export declare const NATIVE_COMMANDS_FROM_VERSION: Readonly<Record<ModernAction, {
|
|
15
15
|
fromVersion: string;
|
|
16
16
|
}>>;
|
package/client/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.NATIVE_COMMANDS_FROM_VERSION = exports.VERSION_TO_IOS_APP_ID = exports.NATIVE_FEATURES_FROM_VERSION = exports.DEEP_LINK_PATTERN = exports.ANDROID_APP_ID = void 0;
|
|
4
4
|
exports.ANDROID_APP_ID = 'alfabank';
|
|
5
5
|
exports.DEEP_LINK_PATTERN = /^(\/|alfabank:\/{3}dashboard\/|alfabank:\/{3}|alfabank:\/{2}|https:\/{2}online.alfabank.ru\/)/;
|
|
6
6
|
exports.NATIVE_FEATURES_FROM_VERSION = {
|
|
@@ -28,7 +28,7 @@ exports.VERSION_TO_IOS_APP_ID = {
|
|
|
28
28
|
'13.5.0': 'assistmekz',
|
|
29
29
|
'14.5.0': 'smartfinancementor',
|
|
30
30
|
};
|
|
31
|
-
exports.
|
|
31
|
+
exports.NATIVE_COMMANDS_FROM_VERSION = {
|
|
32
32
|
'geo.configuration': { fromVersion: '17.0.0' },
|
|
33
33
|
'haptics.vibrate': { fromVersion: '17.0.0' },
|
|
34
34
|
'sheet.setDragArea': { fromVersion: '17.0.0' },
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import { type LogError, type
|
|
1
|
+
import { type LogError, type ModernAction } from '../types';
|
|
2
2
|
export declare const CALL_TIMEOUT_MS = 10000;
|
|
3
3
|
/**
|
|
4
|
-
* Сервис-транспорт для взаимодействия WA с NA
|
|
5
|
-
*
|
|
6
|
-
* Отправляет сообщения (`send` / `call`) и обрабатывает асинхронные ответы на `call`
|
|
7
|
-
* через `window.webBridge.callback`.
|
|
8
|
-
*
|
|
9
|
-
* Отправляет сообщения напрямую через мост соответствующей платформы.
|
|
4
|
+
* Сервис-транспорт для взаимодействия WA с NA.
|
|
10
5
|
*/
|
|
11
|
-
export declare class
|
|
6
|
+
export declare class ModernBridgeService {
|
|
12
7
|
private logError?;
|
|
13
8
|
private pendingCalls;
|
|
14
9
|
private savedCallback?;
|
|
@@ -16,16 +11,16 @@ export declare class NativeBridgeService {
|
|
|
16
11
|
/**
|
|
17
12
|
* Отправляет fire-and-forget сообщение в NA (без ожидания ответа).
|
|
18
13
|
*/
|
|
19
|
-
send(action:
|
|
14
|
+
send(action: ModernAction, data: unknown): void;
|
|
20
15
|
/**
|
|
21
16
|
* Отправляет сообщение типа `call` и возвращает промис с ответом NA.
|
|
22
17
|
*
|
|
23
18
|
* @throws Если транспорт недоступен или ответ не пришёл за {@link CALL_TIMEOUT_MS}.
|
|
24
19
|
*/
|
|
25
|
-
call<Data>(action:
|
|
20
|
+
call<Data>(action: ModernAction, data: unknown): Promise<Data>;
|
|
26
21
|
private handleCallback;
|
|
27
22
|
/**
|
|
28
|
-
* Проверяет доступность
|
|
23
|
+
* Проверяет доступность нативного webkit-моста iOS.
|
|
29
24
|
*/
|
|
30
25
|
private hasTransport;
|
|
31
26
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.ModernBridgeService = exports.CALL_TIMEOUT_MS = void 0;
|
|
4
4
|
exports.CALL_TIMEOUT_MS = 10000;
|
|
5
5
|
const BRIDGE_KIND_SEND = 'send';
|
|
6
6
|
const BRIDGE_KIND_CALL = 'call';
|
|
@@ -13,14 +13,9 @@ const generateRequestId = () => {
|
|
|
13
13
|
return String(requestIdCounter);
|
|
14
14
|
};
|
|
15
15
|
/**
|
|
16
|
-
* Сервис-транспорт для взаимодействия WA с NA
|
|
17
|
-
*
|
|
18
|
-
* Отправляет сообщения (`send` / `call`) и обрабатывает асинхронные ответы на `call`
|
|
19
|
-
* через `window.webBridge.callback`.
|
|
20
|
-
*
|
|
21
|
-
* Отправляет сообщения напрямую через мост соответствующей платформы.
|
|
16
|
+
* Сервис-транспорт для взаимодействия WA с NA.
|
|
22
17
|
*/
|
|
23
|
-
class
|
|
18
|
+
class ModernBridgeService {
|
|
24
19
|
constructor(logError) {
|
|
25
20
|
var _a;
|
|
26
21
|
this.logError = logError;
|
|
@@ -56,14 +51,14 @@ class NativeBridgeService {
|
|
|
56
51
|
requestId,
|
|
57
52
|
data,
|
|
58
53
|
};
|
|
59
|
-
if (!this.hasTransport(
|
|
54
|
+
if (!this.hasTransport()) {
|
|
60
55
|
this.reportNoTransport('call', action);
|
|
61
|
-
return Promise.reject(new Error(`
|
|
56
|
+
return Promise.reject(new Error(`ModernBridgeService: transport is not available for "${action}"`));
|
|
62
57
|
}
|
|
63
58
|
return new Promise((resolve, reject) => {
|
|
64
59
|
const timeoutId = setTimeout(() => {
|
|
65
60
|
this.pendingCalls.delete(requestId);
|
|
66
|
-
reject(new Error(`
|
|
61
|
+
reject(new Error(`ModernBridgeService: request "${action}" timed out`));
|
|
67
62
|
}, exports.CALL_TIMEOUT_MS);
|
|
68
63
|
this.pendingCalls.set(requestId, {
|
|
69
64
|
resolve: resolve,
|
|
@@ -91,15 +86,12 @@ class NativeBridgeService {
|
|
|
91
86
|
pending.resolve(payload.data);
|
|
92
87
|
}
|
|
93
88
|
/**
|
|
94
|
-
* Проверяет доступность
|
|
89
|
+
* Проверяет доступность нативного webkit-моста iOS.
|
|
95
90
|
*/
|
|
96
91
|
// eslint-disable-next-line class-methods-use-this -- единая точка доступа к глобалам window.
|
|
97
|
-
hasTransport(
|
|
98
|
-
var _a, _b, _c
|
|
99
|
-
return Boolean((
|
|
100
|
-
(kind === BRIDGE_KIND_CALL
|
|
101
|
-
? typeof ((_d = window.Android) === null || _d === void 0 ? void 0 : _d.call) === 'function'
|
|
102
|
-
: typeof ((_e = window.Android) === null || _e === void 0 ? void 0 : _e.send) === 'function'));
|
|
92
|
+
hasTransport() {
|
|
93
|
+
var _a, _b, _c;
|
|
94
|
+
return Boolean((_c = (_b = (_a = window.webkit) === null || _a === void 0 ? void 0 : _a.messageHandlers) === null || _b === void 0 ? void 0 : _b.bridge) === null || _c === void 0 ? void 0 : _c.postMessage);
|
|
103
95
|
}
|
|
104
96
|
/**
|
|
105
97
|
* Отправляет тело сообщения доступным транспортом.
|
|
@@ -108,27 +100,19 @@ class NativeBridgeService {
|
|
|
108
100
|
*/
|
|
109
101
|
// eslint-disable-next-line class-methods-use-this -- единая точка доступа к глобалам window.
|
|
110
102
|
dispatch(body) {
|
|
111
|
-
var _a, _b, _c
|
|
103
|
+
var _a, _b, _c;
|
|
112
104
|
if ((_c = (_b = (_a = window.webkit) === null || _a === void 0 ? void 0 : _a.messageHandlers) === null || _b === void 0 ? void 0 : _b.bridge) === null || _c === void 0 ? void 0 : _c.postMessage) {
|
|
113
105
|
window.webkit.messageHandlers.bridge.postMessage(body);
|
|
114
106
|
return true;
|
|
115
107
|
}
|
|
116
|
-
if (body.kind === BRIDGE_KIND_CALL && typeof ((_d = window.Android) === null || _d === void 0 ? void 0 : _d.call) === 'function') {
|
|
117
|
-
window.Android.call(JSON.stringify(body));
|
|
118
|
-
return true;
|
|
119
|
-
}
|
|
120
|
-
if (body.kind === BRIDGE_KIND_SEND && typeof ((_e = window.Android) === null || _e === void 0 ? void 0 : _e.send) === 'function') {
|
|
121
|
-
window.Android.send(JSON.stringify(body));
|
|
122
|
-
return true;
|
|
123
|
-
}
|
|
124
108
|
return false;
|
|
125
109
|
}
|
|
126
110
|
reportNoTransport(kind, action) {
|
|
127
111
|
var _a;
|
|
128
|
-
const message = `
|
|
112
|
+
const message = `ModernBridgeService: native bridge is not available, "${action}" (${kind}) was not sent`;
|
|
129
113
|
(_a = this.logError) === null || _a === void 0 ? void 0 : _a.call(this, message, { action, kind });
|
|
130
114
|
// eslint-disable-next-line no-console -- сообщаем потребителю о недоступности моста.
|
|
131
115
|
console.error(message);
|
|
132
116
|
}
|
|
133
117
|
}
|
|
134
|
-
exports.
|
|
118
|
+
exports.ModernBridgeService = ModernBridgeService;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type GeoConfiguration, type HapticsOptions, type LogError, type SheetDragArea } from '../types';
|
|
2
|
+
import { type NativeParamsService } from './native-params-service';
|
|
3
|
+
/**
|
|
4
|
+
* Сервис команд для взаимодействия WA с NA (iOS, NA ≥ 17.0.0):
|
|
5
|
+
* геолокация, тактильный отклик, нативная штора и таббар.
|
|
6
|
+
*
|
|
7
|
+
* Инкапсулирует гейт доступности по платформе и версии NA и формирует
|
|
8
|
+
* данные для вызовов через {@link ModernBridgeService}.
|
|
9
|
+
*/
|
|
10
|
+
export declare class NativeCommandsService {
|
|
11
|
+
private nativeParamsService;
|
|
12
|
+
private isSheetWebview;
|
|
13
|
+
constructor(nativeParamsService: NativeParamsService, logError?: LogError, isSheetWebview?: boolean);
|
|
14
|
+
private modernBridgeService;
|
|
15
|
+
getGeoConfiguration(): Promise<GeoConfiguration>;
|
|
16
|
+
vibrate({ type, intensity }: HapticsOptions, isFTEnabled: boolean): void;
|
|
17
|
+
setSheetDragArea(area: SheetDragArea): void;
|
|
18
|
+
hideTabbar(): void;
|
|
19
|
+
showTabbar(): void;
|
|
20
|
+
private isAvailable;
|
|
21
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NativeCommandsService = void 0;
|
|
4
|
+
const modern_bridge_service_1 = require("./modern-bridge-service");
|
|
5
|
+
const native_features_1 = require("./native-features");
|
|
6
|
+
/**
|
|
7
|
+
* Сервис команд для взаимодействия WA с NA (iOS, NA ≥ 17.0.0):
|
|
8
|
+
* геолокация, тактильный отклик, нативная штора и таббар.
|
|
9
|
+
*
|
|
10
|
+
* Инкапсулирует гейт доступности по платформе и версии NA и формирует
|
|
11
|
+
* данные для вызовов через {@link ModernBridgeService}.
|
|
12
|
+
*/
|
|
13
|
+
class NativeCommandsService {
|
|
14
|
+
constructor(nativeParamsService, logError, isSheetWebview = true) {
|
|
15
|
+
this.nativeParamsService = nativeParamsService;
|
|
16
|
+
this.isSheetWebview = isSheetWebview;
|
|
17
|
+
this.modernBridgeService = new modern_bridge_service_1.ModernBridgeService(logError);
|
|
18
|
+
}
|
|
19
|
+
getGeoConfiguration() {
|
|
20
|
+
if (!this.isAvailable('geo.configuration')) {
|
|
21
|
+
return Promise.reject(new Error('NativeCommandsService: geo.configuration is unavailable in this environment'));
|
|
22
|
+
}
|
|
23
|
+
return this.modernBridgeService.call('geo.configuration', {});
|
|
24
|
+
}
|
|
25
|
+
vibrate({ type, intensity }, isFTEnabled) {
|
|
26
|
+
if (!isFTEnabled || !this.isAvailable('haptics.vibrate')) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
this.modernBridgeService.send('haptics.vibrate', Object.assign({ type }, (intensity === undefined ? {} : { intensity })));
|
|
30
|
+
}
|
|
31
|
+
setSheetDragArea(area) {
|
|
32
|
+
if (!this.isAvailable('sheet.setDragArea')) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this.modernBridgeService.send('sheet.setDragArea', { area });
|
|
36
|
+
}
|
|
37
|
+
hideTabbar() {
|
|
38
|
+
if (!this.isAvailable('tabbar.hide')) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
this.modernBridgeService.send('tabbar.hide', {});
|
|
42
|
+
}
|
|
43
|
+
showTabbar() {
|
|
44
|
+
if (!this.isAvailable('tabbar.show')) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
this.modernBridgeService.send('tabbar.show', {});
|
|
48
|
+
}
|
|
49
|
+
isAvailable(action) {
|
|
50
|
+
return (this.isSheetWebview &&
|
|
51
|
+
(0, native_features_1.canUseNativeCommand)(this.nativeParamsService.environment, this.nativeParamsService.appVersion, action));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.NativeCommandsService = NativeCommandsService;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Environment, type
|
|
1
|
+
import { type Environment, type ModernAction, type NativeFeatureKey } from '../types';
|
|
2
2
|
export declare const isValidVersionFormat: (version?: string) => version is string;
|
|
3
3
|
/**
|
|
4
4
|
* Сравнивает версии формата `x.y.z` покомпонентно, как числа.
|
|
@@ -11,7 +11,9 @@ export declare const isVersionHigherOrEqual: (version: string, versionToCompare:
|
|
|
11
11
|
*/
|
|
12
12
|
export declare const canUseNativeFeature: (platform: Environment, appVersion: string, feature: NativeFeatureKey) => boolean;
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* Проверяет доступность команды для указанной платформы и версии NA.
|
|
15
|
+
*
|
|
16
|
+
* Проверяемые команды поддерживаются только на iOS.
|
|
17
|
+
* Версия в неизвестном формате считается `0.0.0`.
|
|
16
18
|
*/
|
|
17
|
-
export declare const
|
|
19
|
+
export declare const canUseNativeCommand: (platform: Environment, appVersion: string, action: ModernAction) => boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.canUseNativeCommand = exports.canUseNativeFeature = exports.isVersionHigherOrEqual = exports.isValidVersionFormat = void 0;
|
|
4
4
|
const constants_1 = require("../constants");
|
|
5
5
|
const VERSION_FORMAT_PATTERN = /^\d+\.\d+\.\d+$/;
|
|
6
6
|
const isValidVersionFormat = (version) => Boolean(version) && VERSION_FORMAT_PATTERN.test(version);
|
|
@@ -33,14 +33,16 @@ const canUseNativeFeature = (platform, appVersion, feature) => {
|
|
|
33
33
|
};
|
|
34
34
|
exports.canUseNativeFeature = canUseNativeFeature;
|
|
35
35
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
36
|
+
* Проверяет доступность команды для указанной платформы и версии NA.
|
|
37
|
+
*
|
|
38
|
+
* Проверяемые команды поддерживаются только на iOS.
|
|
39
|
+
* Версия в неизвестном формате считается `0.0.0`.
|
|
38
40
|
*/
|
|
39
|
-
const
|
|
41
|
+
const canUseNativeCommand = (platform, appVersion, action) => {
|
|
40
42
|
if (platform !== 'ios') {
|
|
41
43
|
return false;
|
|
42
44
|
}
|
|
43
|
-
const { fromVersion } = constants_1.
|
|
45
|
+
const { fromVersion } = constants_1.NATIVE_COMMANDS_FROM_VERSION[action];
|
|
44
46
|
return (0, exports.isVersionHigherOrEqual)((0, exports.isValidVersionFormat)(appVersion) ? appVersion : '0.0.0', fromVersion);
|
|
45
47
|
};
|
|
46
|
-
exports.
|
|
48
|
+
exports.canUseNativeCommand = canUseNativeCommand;
|
package/client/types.d.ts
CHANGED
|
@@ -22,23 +22,23 @@ export type NativeFeaturesFromVersion = Readonly<{
|
|
|
22
22
|
}>;
|
|
23
23
|
export type PdfType = 'pdfFile' | 'base64' | 'binary';
|
|
24
24
|
export type Theme = 'light' | 'dark';
|
|
25
|
-
export type
|
|
26
|
-
export type
|
|
27
|
-
export type
|
|
25
|
+
export type ModernAction = 'geo.configuration' | 'haptics.vibrate' | 'sheet.setDragArea' | 'tabbar.hide' | 'tabbar.show';
|
|
26
|
+
export type GeoPermission = 'allowed' | 'denied' | 'notDetermined' | 'restricted';
|
|
27
|
+
export type UserCoordinate = {
|
|
28
28
|
latitude: number;
|
|
29
29
|
longitude: number;
|
|
30
30
|
};
|
|
31
|
-
export type
|
|
32
|
-
permission:
|
|
33
|
-
userCoordinate:
|
|
31
|
+
export type GeoConfiguration = {
|
|
32
|
+
permission: GeoPermission;
|
|
33
|
+
userCoordinate: UserCoordinate | null;
|
|
34
34
|
};
|
|
35
|
-
export type
|
|
36
|
-
export type
|
|
37
|
-
type:
|
|
35
|
+
export type HapticsType = 'light' | 'medium' | 'heavy' | 'soft' | 'rigid' | 'success' | 'warning' | 'error' | 'selection';
|
|
36
|
+
export type HapticsOptions = {
|
|
37
|
+
type: HapticsType;
|
|
38
38
|
intensity?: number;
|
|
39
39
|
};
|
|
40
|
-
export type
|
|
41
|
-
export type
|
|
40
|
+
export type SheetDragArea = 'wholeSheet' | 'navigationBar';
|
|
41
|
+
export type CallbackPayload = {
|
|
42
42
|
data: unknown;
|
|
43
43
|
error: {
|
|
44
44
|
code: number;
|
package/package.json
CHANGED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { type WebFeaturesGeoConfiguration, type WebFeaturesHapticsOptions, type WebFeaturesSheetDragArea } from '../types';
|
|
2
|
-
import { type NativeBridgeService } from './native-bridge-service';
|
|
3
|
-
import { type NativeParamsService } from './native-params-service';
|
|
4
|
-
/**
|
|
5
|
-
* Доменный сервис фич WebFeatures (iOS, АМ ≥ 17.0.0).
|
|
6
|
-
*
|
|
7
|
-
* Инкапсулирует гейт доступности по платформе и версии NA и формирует
|
|
8
|
-
* данные для вызовов через {@link NativeBridgeService}.
|
|
9
|
-
*/
|
|
10
|
-
export declare class WebFeaturesService {
|
|
11
|
-
private nativeParamsService;
|
|
12
|
-
private nativeBridgeService;
|
|
13
|
-
constructor(nativeParamsService: NativeParamsService, nativeBridgeService: NativeBridgeService);
|
|
14
|
-
/**
|
|
15
|
-
* Возвращает статус доступа к геолокации и, при наличии разрешения, координаты пользователя
|
|
16
|
-
*
|
|
17
|
-
* @throws Если фича недоступна в текущем окружении или NA вернул ошибку.
|
|
18
|
-
*/
|
|
19
|
-
getGeoConfiguration(): Promise<WebFeaturesGeoConfiguration>;
|
|
20
|
-
/**
|
|
21
|
-
* Воспроизводит тактильный отклик.
|
|
22
|
-
*/
|
|
23
|
-
vibrate({ type, intensity }: WebFeaturesHapticsOptions): void;
|
|
24
|
-
/**
|
|
25
|
-
* Задаёт область шторы, за которую можно её перетаскивать.
|
|
26
|
-
*/
|
|
27
|
-
setSheetDragArea(area: WebFeaturesSheetDragArea): void;
|
|
28
|
-
/**
|
|
29
|
-
* Скрывает нативный таббар.
|
|
30
|
-
*/
|
|
31
|
-
hideTabbar(): void;
|
|
32
|
-
/**
|
|
33
|
-
* Показывает нативный таббар и, при переданном `selectedId`, выбирает вкладку.
|
|
34
|
-
*/
|
|
35
|
-
showTabbar(selectedId?: string): void;
|
|
36
|
-
private isAvailable;
|
|
37
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WebFeaturesService = void 0;
|
|
4
|
-
const native_features_1 = require("./native-features");
|
|
5
|
-
/**
|
|
6
|
-
* Доменный сервис фич WebFeatures (iOS, АМ ≥ 17.0.0).
|
|
7
|
-
*
|
|
8
|
-
* Инкапсулирует гейт доступности по платформе и версии NA и формирует
|
|
9
|
-
* данные для вызовов через {@link NativeBridgeService}.
|
|
10
|
-
*/
|
|
11
|
-
class WebFeaturesService {
|
|
12
|
-
constructor(nativeParamsService, nativeBridgeService) {
|
|
13
|
-
this.nativeParamsService = nativeParamsService;
|
|
14
|
-
this.nativeBridgeService = nativeBridgeService;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Возвращает статус доступа к геолокации и, при наличии разрешения, координаты пользователя
|
|
18
|
-
*
|
|
19
|
-
* @throws Если фича недоступна в текущем окружении или NA вернул ошибку.
|
|
20
|
-
*/
|
|
21
|
-
getGeoConfiguration() {
|
|
22
|
-
if (!this.isAvailable('geo.configuration')) {
|
|
23
|
-
return Promise.reject(new Error('WebFeatures: geo.configuration is unavailable in this environment'));
|
|
24
|
-
}
|
|
25
|
-
return this.nativeBridgeService.call('geo.configuration', {});
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Воспроизводит тактильный отклик.
|
|
29
|
-
*/
|
|
30
|
-
vibrate({ type, intensity }) {
|
|
31
|
-
if (!this.isAvailable('haptics.vibrate')) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
this.nativeBridgeService.send('haptics.vibrate', Object.assign({ type }, (intensity === undefined ? {} : { intensity })));
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Задаёт область шторы, за которую можно её перетаскивать.
|
|
38
|
-
*/
|
|
39
|
-
setSheetDragArea(area) {
|
|
40
|
-
if (!this.isAvailable('sheet.setDragArea')) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
this.nativeBridgeService.send('sheet.setDragArea', { area });
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Скрывает нативный таббар.
|
|
47
|
-
*/
|
|
48
|
-
hideTabbar() {
|
|
49
|
-
if (!this.isAvailable('tabbar.hide')) {
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
this.nativeBridgeService.send('tabbar.hide', {});
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Показывает нативный таббар и, при переданном `selectedId`, выбирает вкладку.
|
|
56
|
-
*/
|
|
57
|
-
showTabbar(selectedId) {
|
|
58
|
-
if (!this.isAvailable('tabbar.show')) {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
this.nativeBridgeService.send('tabbar.show', selectedId === undefined ? {} : { selectedId });
|
|
62
|
-
}
|
|
63
|
-
isAvailable(action) {
|
|
64
|
-
return (0, native_features_1.canUseWebFeature)(this.nativeParamsService.environment, this.nativeParamsService.appVersion, action);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
exports.WebFeaturesService = WebFeaturesService;
|