@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.
@@ -1,5 +1,5 @@
1
1
 
2
- import { type BrowserHistoryApiWrappers, type HistoryPushStateParams, type HistoryReplaceStateParams, type LocationAssignParam, type LogError, type NativeFeatureKey, type PdfType, type WebFeaturesGeoConfiguration, type WebFeaturesHapticsOptions, type WebFeaturesSheetDragArea } from './types';
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 nativeBridgeService;
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
- * Воспроизводит тактильный отклик WebFeatures.
258
- *
259
- * ВАЖНО!
260
- * Доступно только в iOS начиная с версии АМ `17.0.0`.
261
- * В несовместимом окружении вызов игнорируется.
262
- * Управляется нативным фича-тоглом `webViewHapticsIOS`.
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 Интенсивность `0...1` (только для impact-типов).
266
- * B2N пробрасывает значение в натив без валидации диапазона.
267
+ * @param options.intensity Интенсивность от 0 до 1, применяется только
268
+ * к impact-типам. Если не передана, NA использует значение по умолчанию.
267
269
  */
268
- vibrate(options: WebFeaturesHapticsOptions): void;
270
+ vibrate(options: HapticsOptions, isFTEnabled: boolean): void;
269
271
  /**
270
272
  * Задаёт область нативной шторы, за которую можно её перетаскивать.
273
+ * Работает только на iOS в версиях `17.0.0` и выше.
271
274
  *
272
- * ВАЖНО!
273
- * Доступно только в iOS начиная с версии АМ `17.0.0`.
274
- * В несовместимом окружении вызов игнорируется.
275
- *
276
- * @param area Область перетаскивания шторы.
275
+ * @param area
276
+ * `wholeSheet` — перетаскивание за любую часть шторы (по умолчанию в NA),
277
+ * данная опция может конфликтовать с `drag` обработчиками в вебе.
277
278
  */
278
- setSheetDragArea(area: WebFeaturesSheetDragArea): void;
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
- * Показывает нативный таббар и, при переданном `selectedId`, выбирает вкладку.
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(selectedId?: string): void;
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 native_bridge_service_1 = require("./services-and-utils/native-bridge-service");
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.nativeBridgeService = new native_bridge_service_1.NativeBridgeService((_e = this.options) === null || _e === void 0 ? void 0 : _e.logError);
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
- * Воспроизводит тактильный отклик WebFeatures.
317
- *
318
- * ВАЖНО!
319
- * Доступно только в iOS начиная с версии АМ `17.0.0`.
320
- * В несовместимом окружении вызов игнорируется.
321
- * Управляется нативным фича-тоглом `webViewHapticsIOS`.
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 Интенсивность `0...1` (только для impact-типов).
325
- * B2N пробрасывает значение в натив без валидации диапазона.
324
+ * @param options.intensity Интенсивность от 0 до 1, применяется только
325
+ * к impact-типам. Если не передана, NA использует значение по умолчанию.
326
326
  */
327
- vibrate(options) {
328
- this.webFeaturesService.vibrate(options);
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
- * Доступно только в iOS начиная с версии АМ `17.0.0`.
335
- * В несовместимом окружении вызов игнорируется.
336
- *
337
- * @param area Область перетаскивания шторы.
334
+ * @param area
335
+ * `wholeSheet` — перетаскивание за любую часть шторы (по умолчанию в NA),
336
+ * данная опция может конфликтовать с `drag` обработчиками в вебе.
338
337
  */
339
338
  setSheetDragArea(area) {
340
- this.webFeaturesService.setSheetDragArea(area);
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.webFeaturesService.hideTabbar();
347
+ this.nativeCommandsService.hideTabbar();
352
348
  }
353
349
  /**
354
- * Показывает нативный таббар и, при переданном `selectedId`, выбирает вкладку.
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(selectedId) {
364
- this.webFeaturesService.showTabbar(selectedId);
354
+ showTabbar() {
355
+ this.nativeCommandsService.showTabbar();
365
356
  }
366
357
  }
367
358
  exports.BridgeToNative = BridgeToNative;
@@ -1,4 +1,4 @@
1
- import { type NativeFeaturesFromVersion, type WebFeatureAction } from './types';
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 WEB_FEATURES_FROM_VERSION: Readonly<Record<WebFeatureAction, {
14
+ export declare const NATIVE_COMMANDS_FROM_VERSION: Readonly<Record<ModernAction, {
15
15
  fromVersion: string;
16
16
  }>>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WEB_FEATURES_FROM_VERSION = exports.VERSION_TO_IOS_APP_ID = exports.NATIVE_FEATURES_FROM_VERSION = exports.DEEP_LINK_PATTERN = exports.ANDROID_APP_ID = void 0;
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.WEB_FEATURES_FROM_VERSION = {
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 WebFeatureAction } from '../types';
1
+ import { type LogError, type ModernAction } from '../types';
2
2
  export declare const CALL_TIMEOUT_MS = 10000;
3
3
  /**
4
- * Сервис-транспорт для взаимодействия WA с NA через WebFeatures-мост.
5
- *
6
- * Отправляет сообщения (`send` / `call`) и обрабатывает асинхронные ответы на `call`
7
- * через `window.webBridge.callback`.
8
- *
9
- * Отправляет сообщения напрямую через мост соответствующей платформы.
4
+ * Сервис-транспорт для взаимодействия WA с NA.
10
5
  */
11
- export declare class NativeBridgeService {
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: WebFeatureAction, data: unknown): void;
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: WebFeatureAction, data: unknown): Promise<Data>;
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.NativeBridgeService = exports.CALL_TIMEOUT_MS = void 0;
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 через WebFeatures-мост.
17
- *
18
- * Отправляет сообщения (`send` / `call`) и обрабатывает асинхронные ответы на `call`
19
- * через `window.webBridge.callback`.
20
- *
21
- * Отправляет сообщения напрямую через мост соответствующей платформы.
16
+ * Сервис-транспорт для взаимодействия WA с NA.
22
17
  */
23
- class NativeBridgeService {
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(BRIDGE_KIND_CALL)) {
54
+ if (!this.hasTransport()) {
60
55
  this.reportNoTransport('call', action);
61
- return Promise.reject(new Error(`NativeBridgeService: transport is not available for "${action}"`));
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(`NativeBridgeService: request "${action}" timed out`));
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(kind) {
98
- var _a, _b, _c, _d, _e;
99
- 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) ||
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, _d, _e;
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 = `NativeBridgeService: native bridge is not available, "${action}" (${kind}) was not sent`;
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.NativeBridgeService = NativeBridgeService;
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 NativeFeatureKey, type WebFeatureAction } from '../types';
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
- * Проверяет, поддерживает ли NA указанной платформы и версии фичу WebFeatures.
15
- * Фичи WebFeatures доступны только на iOS. Версия в неизвестном формате считается `0.0.0`.
14
+ * Проверяет доступность команды для указанной платформы и версии NA.
15
+ *
16
+ * Проверяемые команды поддерживаются только на iOS.
17
+ * Версия в неизвестном формате считается `0.0.0`.
16
18
  */
17
- export declare const canUseWebFeature: (platform: Environment, appVersion: string, action: WebFeatureAction) => boolean;
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.canUseWebFeature = exports.canUseNativeFeature = exports.isVersionHigherOrEqual = exports.isValidVersionFormat = void 0;
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
- * Проверяет, поддерживает ли NA указанной платформы и версии фичу WebFeatures.
37
- * Фичи WebFeatures доступны только на iOS. Версия в неизвестном формате считается `0.0.0`.
36
+ * Проверяет доступность команды для указанной платформы и версии NA.
37
+ *
38
+ * Проверяемые команды поддерживаются только на iOS.
39
+ * Версия в неизвестном формате считается `0.0.0`.
38
40
  */
39
- const canUseWebFeature = (platform, appVersion, action) => {
41
+ const canUseNativeCommand = (platform, appVersion, action) => {
40
42
  if (platform !== 'ios') {
41
43
  return false;
42
44
  }
43
- const { fromVersion } = constants_1.WEB_FEATURES_FROM_VERSION[action];
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.canUseWebFeature = canUseWebFeature;
48
+ exports.canUseNativeCommand = canUseNativeCommand;
@@ -6,8 +6,6 @@ export declare class NativeParamsService {
6
6
  private logError?;
7
7
  AndroidBridge: {
8
8
  setPageSettings: (params: string) => void;
9
- call?: (body: string) => void;
10
- send?: (body: string) => void;
11
9
  } | undefined;
12
10
  appId: string;
13
11
  appVersion: string;
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 WebFeatureAction = 'geo.configuration' | 'haptics.vibrate' | 'sheet.setDragArea' | 'tabbar.hide' | 'tabbar.show';
26
- export type WebFeaturesGeoPermission = 'allowed' | 'denied' | 'notDetermined' | 'restricted';
27
- export type WebFeaturesUserCoordinate = {
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 WebFeaturesGeoConfiguration = {
32
- permission: WebFeaturesGeoPermission;
33
- userCoordinate: WebFeaturesUserCoordinate | null;
31
+ export type GeoConfiguration = {
32
+ permission: GeoPermission;
33
+ userCoordinate: UserCoordinate | null;
34
34
  };
35
- export type WebFeaturesHapticsType = 'light' | 'medium' | 'heavy' | 'soft' | 'rigid' | 'success' | 'warning' | 'error' | 'selection';
36
- export type WebFeaturesHapticsOptions = {
37
- type: WebFeaturesHapticsType;
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 WebFeaturesSheetDragArea = 'wholeSheet' | 'navigationBar';
41
- export type WebFeaturesCallbackPayload = {
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfalab/bridge-to-native",
3
- "version": "1.5.2-beta.b951ff8",
3
+ "version": "1.5.2-beta.feed590",
4
4
  "license": "MIT",
5
5
  "description": "Утилита для удобной работы веб приложения внутри нативного приложения и коммуникации с ним.",
6
6
  "engines": {
@@ -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;