@alfalab/bridge-to-native 1.5.0 → 1.5.1-beta.82667a7
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 +33 -1
- package/client/bridge-to-native.js +43 -0
- package/client/index.d.ts +1 -2
- package/client/index.js +8 -8
- package/client/primitives.d.ts +3 -0
- package/client/primitives.js +11 -0
- package/client/services-and-utils/native-messages-service.d.ts +9 -0
- package/client/services-and-utils/native-messages-service.js +63 -0
- package/client/services-and-utils/native-params-service.d.ts +2 -0
- package/client/services-and-utils/utils.d.ts +19 -1
- package/client/services-and-utils/utils.js +62 -1
- package/client/types.d.ts +32 -0
- package/package.json +119 -113
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { type BrowserHistoryApiWrappers, type HistoryPushStateParams, type HistoryReplaceStateParams, type LocationAssignParam, type LogError, type NativeFeatureKey, type PdfType } from './types';
|
|
2
|
+
import { type BrowserHistoryApiWrappers, 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
|
*/
|
|
@@ -18,6 +18,7 @@ export declare class BridgeToNative {
|
|
|
18
18
|
browserHistoryApiWrappers?: BrowserHistoryApiWrappers;
|
|
19
19
|
logError?: LogError;
|
|
20
20
|
} | undefined);
|
|
21
|
+
private nativeMessagesService;
|
|
21
22
|
private nativeParamsService;
|
|
22
23
|
private externalLinksService;
|
|
23
24
|
private nativeNavigationAndTitleService;
|
|
@@ -241,4 +242,35 @@ export declare class BridgeToNative {
|
|
|
241
242
|
* @param nativeTitle Текст заголовка, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
242
243
|
*/
|
|
243
244
|
setTitle(nativeTitle: string): void;
|
|
245
|
+
/**
|
|
246
|
+
* Возвращает статус доступа к геолокации и, при наличии разрешения, координаты пользователя
|
|
247
|
+
*
|
|
248
|
+
* @param data пустой объект или null
|
|
249
|
+
*/
|
|
250
|
+
getGeoConfiguration(data?: Record<string, never> | null): Promise<import("./types").GeoConfiguration>;
|
|
251
|
+
/**
|
|
252
|
+
* Воспроизводит тактильный отклик
|
|
253
|
+
*
|
|
254
|
+
* @param type Тип тактильного отклика
|
|
255
|
+
* @param intensity Интенсивность в диапазоне 0...1. Применяется только для impact-типов.Если не передана — используется значение по умолчанию
|
|
256
|
+
*/
|
|
257
|
+
vibrate(options: HapticsOptions): void;
|
|
258
|
+
/**
|
|
259
|
+
* Задаёт область шторы, за которую можно её перетаскивать
|
|
260
|
+
*
|
|
261
|
+
* @param area Область шторы, за которую можно её перетаскивать
|
|
262
|
+
* - `wholeSheet` — вся штора (значение по умолчанию в нативе);
|
|
263
|
+
* - `navigationBar` — только навигационная панель шторы.
|
|
264
|
+
*/
|
|
265
|
+
setSheetDragArea(area: SheetDragArea): void;
|
|
266
|
+
/**
|
|
267
|
+
* Скрывает нативный таббар
|
|
268
|
+
*/
|
|
269
|
+
hideTabbar(): void;
|
|
270
|
+
/**
|
|
271
|
+
* Показывает нативный таббар и, при переданном selectedId, выбирает вкладку
|
|
272
|
+
*
|
|
273
|
+
* @param selectedId id вкладки, которую выбрать при показе таббара. Если null или не передан — текущая вкладка не меняется
|
|
274
|
+
*/
|
|
275
|
+
showTabbar(selectedId?: string | null): void;
|
|
244
276
|
}
|
|
@@ -3,6 +3,7 @@
|
|
|
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_messages_service_1 = require("./services-and-utils/native-messages-service");
|
|
6
7
|
const native_navigation_and_title_service_1 = require("./services-and-utils/native-navigation-and-title-service");
|
|
7
8
|
const native_params_service_1 = require("./services-and-utils/native-params-service");
|
|
8
9
|
/**
|
|
@@ -21,6 +22,7 @@ class BridgeToNative {
|
|
|
21
22
|
constructor(options) {
|
|
22
23
|
var _a, _b, _c, _d;
|
|
23
24
|
this.options = options;
|
|
25
|
+
this.nativeMessagesService = new native_messages_service_1.NativeMessagesService();
|
|
24
26
|
this.nativeParamsService = new native_params_service_1.NativeParamsService((_a = this.options) === null || _a === void 0 ? void 0 : _a.logError);
|
|
25
27
|
this.externalLinksService = new external_links_service_1.ExternalLinksService(this.nativeParamsService, (_b = this.options) === null || _b === void 0 ? void 0 : _b.logError);
|
|
26
28
|
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);
|
|
@@ -296,5 +298,46 @@ class BridgeToNative {
|
|
|
296
298
|
setTitle(nativeTitle) {
|
|
297
299
|
this.nativeNavigationAndTitleService.setTitle(nativeTitle);
|
|
298
300
|
}
|
|
301
|
+
/**
|
|
302
|
+
* Возвращает статус доступа к геолокации и, при наличии разрешения, координаты пользователя
|
|
303
|
+
*
|
|
304
|
+
* @param data пустой объект или null
|
|
305
|
+
*/
|
|
306
|
+
getGeoConfiguration(data = {}) {
|
|
307
|
+
return this.nativeMessagesService.getGeoConfiguration(data);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Воспроизводит тактильный отклик
|
|
311
|
+
*
|
|
312
|
+
* @param type Тип тактильного отклика
|
|
313
|
+
* @param intensity Интенсивность в диапазоне 0...1. Применяется только для impact-типов.Если не передана — используется значение по умолчанию
|
|
314
|
+
*/
|
|
315
|
+
vibrate(options) {
|
|
316
|
+
this.nativeMessagesService.vibrate(options);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Задаёт область шторы, за которую можно её перетаскивать
|
|
320
|
+
*
|
|
321
|
+
* @param area Область шторы, за которую можно её перетаскивать
|
|
322
|
+
* - `wholeSheet` — вся штора (значение по умолчанию в нативе);
|
|
323
|
+
* - `navigationBar` — только навигационная панель шторы.
|
|
324
|
+
*/
|
|
325
|
+
setSheetDragArea(area) {
|
|
326
|
+
this.nativeMessagesService.setSheetDragArea(area);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Скрывает нативный таббар
|
|
330
|
+
*/
|
|
331
|
+
hideTabbar() {
|
|
332
|
+
this.nativeMessagesService.hideTabbar();
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Показывает нативный таббар и, при переданном selectedId, выбирает вкладку
|
|
336
|
+
*
|
|
337
|
+
* @param selectedId id вкладки, которую выбрать при показе таббара. Если null или не передан — текущая вкладка не меняется
|
|
338
|
+
*/
|
|
339
|
+
showTabbar(selectedId) {
|
|
340
|
+
this.nativeMessagesService.showTabbar(selectedId);
|
|
341
|
+
}
|
|
299
342
|
}
|
|
300
343
|
exports.BridgeToNative = BridgeToNative;
|
package/client/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export { BridgeToNative } from './bridge-to-native';
|
|
2
|
-
export { canUseNativeFeature } from './
|
|
3
|
-
export { prepareNativeDeeplinkUrl, prepareOpenInBrowserUrl, prepareOpenInNewWebviewDeeplink, preparePdfUrl, } from './services-and-utils/native-links';
|
|
2
|
+
export { canUseNativeFeature, isVersionHigherOrEqual, prepareNativeDeeplinkUrl, prepareOpenInBrowserUrl, prepareOpenInNewWebviewDeeplink, preparePdfUrl, } from './primitives';
|
|
4
3
|
export type { Environment, NativeAppTarget, NativeFeatureKey, PdfType } from './types';
|
package/client/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.preparePdfUrl = exports.prepareOpenInNewWebviewDeeplink = exports.prepareOpenInBrowserUrl = exports.prepareNativeDeeplinkUrl = exports.canUseNativeFeature = exports.BridgeToNative = void 0;
|
|
3
|
+
exports.preparePdfUrl = exports.prepareOpenInNewWebviewDeeplink = exports.prepareOpenInBrowserUrl = exports.prepareNativeDeeplinkUrl = exports.isVersionHigherOrEqual = exports.canUseNativeFeature = exports.BridgeToNative = void 0;
|
|
4
4
|
var bridge_to_native_1 = require("./bridge-to-native");
|
|
5
5
|
Object.defineProperty(exports, "BridgeToNative", { enumerable: true, get: function () { return bridge_to_native_1.BridgeToNative; } });
|
|
6
|
-
var
|
|
7
|
-
Object.defineProperty(exports, "canUseNativeFeature", { enumerable: true, get: function () { return
|
|
8
|
-
|
|
9
|
-
Object.defineProperty(exports, "prepareNativeDeeplinkUrl", { enumerable: true, get: function () { return
|
|
10
|
-
Object.defineProperty(exports, "prepareOpenInBrowserUrl", { enumerable: true, get: function () { return
|
|
11
|
-
Object.defineProperty(exports, "prepareOpenInNewWebviewDeeplink", { enumerable: true, get: function () { return
|
|
12
|
-
Object.defineProperty(exports, "preparePdfUrl", { enumerable: true, get: function () { return
|
|
6
|
+
var primitives_1 = require("./primitives");
|
|
7
|
+
Object.defineProperty(exports, "canUseNativeFeature", { enumerable: true, get: function () { return primitives_1.canUseNativeFeature; } });
|
|
8
|
+
Object.defineProperty(exports, "isVersionHigherOrEqual", { enumerable: true, get: function () { return primitives_1.isVersionHigherOrEqual; } });
|
|
9
|
+
Object.defineProperty(exports, "prepareNativeDeeplinkUrl", { enumerable: true, get: function () { return primitives_1.prepareNativeDeeplinkUrl; } });
|
|
10
|
+
Object.defineProperty(exports, "prepareOpenInBrowserUrl", { enumerable: true, get: function () { return primitives_1.prepareOpenInBrowserUrl; } });
|
|
11
|
+
Object.defineProperty(exports, "prepareOpenInNewWebviewDeeplink", { enumerable: true, get: function () { return primitives_1.prepareOpenInNewWebviewDeeplink; } });
|
|
12
|
+
Object.defineProperty(exports, "preparePdfUrl", { enumerable: true, get: function () { return primitives_1.preparePdfUrl; } });
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { canUseNativeFeature, isVersionHigherOrEqual } from './services-and-utils/native-features';
|
|
2
|
+
export { prepareNativeDeeplinkUrl, prepareOpenInBrowserUrl, prepareOpenInNewWebviewDeeplink, preparePdfUrl, } from './services-and-utils/native-links';
|
|
3
|
+
export type { Environment, NativeAppTarget, NativeFeatureKey, PdfType } from './types';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.preparePdfUrl = exports.prepareOpenInNewWebviewDeeplink = exports.prepareOpenInBrowserUrl = exports.prepareNativeDeeplinkUrl = exports.isVersionHigherOrEqual = exports.canUseNativeFeature = void 0;
|
|
4
|
+
var native_features_1 = require("./services-and-utils/native-features");
|
|
5
|
+
Object.defineProperty(exports, "canUseNativeFeature", { enumerable: true, get: function () { return native_features_1.canUseNativeFeature; } });
|
|
6
|
+
Object.defineProperty(exports, "isVersionHigherOrEqual", { enumerable: true, get: function () { return native_features_1.isVersionHigherOrEqual; } });
|
|
7
|
+
var native_links_1 = require("./services-and-utils/native-links");
|
|
8
|
+
Object.defineProperty(exports, "prepareNativeDeeplinkUrl", { enumerable: true, get: function () { return native_links_1.prepareNativeDeeplinkUrl; } });
|
|
9
|
+
Object.defineProperty(exports, "prepareOpenInBrowserUrl", { enumerable: true, get: function () { return native_links_1.prepareOpenInBrowserUrl; } });
|
|
10
|
+
Object.defineProperty(exports, "prepareOpenInNewWebviewDeeplink", { enumerable: true, get: function () { return native_links_1.prepareOpenInNewWebviewDeeplink; } });
|
|
11
|
+
Object.defineProperty(exports, "preparePdfUrl", { enumerable: true, get: function () { return native_links_1.preparePdfUrl; } });
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type GeoConfiguration, type HapticsOptions, type SheetDragArea } from '../types';
|
|
2
|
+
export declare class NativeMessagesService {
|
|
3
|
+
getGeoConfiguration(data?: Record<string, never> | null): Promise<GeoConfiguration>;
|
|
4
|
+
vibrate(options: HapticsOptions): void;
|
|
5
|
+
setSheetDragArea(area: SheetDragArea): void;
|
|
6
|
+
hideTabbar(): void;
|
|
7
|
+
showTabbar(selectedId?: string | null): void;
|
|
8
|
+
private send;
|
|
9
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NativeMessagesService = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
class NativeMessagesService {
|
|
6
|
+
// eslint-disable-next-line class-methods-use-this
|
|
7
|
+
getGeoConfiguration(data = {}) {
|
|
8
|
+
return new Promise((resolve, reject) => {
|
|
9
|
+
const requestId = crypto.randomUUID();
|
|
10
|
+
const timeout = setTimeout(() => {
|
|
11
|
+
utils_1.pendingRequests.delete(requestId);
|
|
12
|
+
reject(new Error('Native bridge geolocation request timed out'));
|
|
13
|
+
}, 10000);
|
|
14
|
+
const cleanup = () => {
|
|
15
|
+
clearTimeout(timeout);
|
|
16
|
+
utils_1.pendingRequests.delete(requestId);
|
|
17
|
+
};
|
|
18
|
+
utils_1.pendingRequests.set(requestId, {
|
|
19
|
+
resolve: (result) => {
|
|
20
|
+
cleanup();
|
|
21
|
+
resolve(result);
|
|
22
|
+
},
|
|
23
|
+
reject: (error) => {
|
|
24
|
+
cleanup();
|
|
25
|
+
reject(error);
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
try {
|
|
29
|
+
(0, utils_1.installCallback)();
|
|
30
|
+
(0, utils_1.sendMessage)({
|
|
31
|
+
kind: 'call',
|
|
32
|
+
action: 'geo.configuration',
|
|
33
|
+
requestId,
|
|
34
|
+
data,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
cleanup();
|
|
39
|
+
reject(error);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
vibrate(options) {
|
|
44
|
+
if (options.intensity !== undefined && (options.intensity < 0 || options.intensity > 1)) {
|
|
45
|
+
throw new RangeError('Haptic intensity must be between 0 and 1');
|
|
46
|
+
}
|
|
47
|
+
this.send('haptics.vibrate', options);
|
|
48
|
+
}
|
|
49
|
+
setSheetDragArea(area) {
|
|
50
|
+
this.send('sheet.setDragArea', { area });
|
|
51
|
+
}
|
|
52
|
+
hideTabbar() {
|
|
53
|
+
this.send('tabbar.hide', {});
|
|
54
|
+
}
|
|
55
|
+
showTabbar(selectedId) {
|
|
56
|
+
this.send('tabbar.show', selectedId === undefined ? {} : { selectedId });
|
|
57
|
+
}
|
|
58
|
+
// eslint-disable-next-line class-methods-use-this
|
|
59
|
+
send(action, data) {
|
|
60
|
+
(0, utils_1.sendMessage)({ kind: 'send', action, requestId: crypto.randomUUID(), data });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.NativeMessagesService = NativeMessagesService;
|
|
@@ -5,6 +5,8 @@ import { type Environment, type LogError, type NativeFeatureKey, type Theme } fr
|
|
|
5
5
|
export declare class NativeParamsService {
|
|
6
6
|
private logError?;
|
|
7
7
|
AndroidBridge: {
|
|
8
|
+
call?: (message: string) => void;
|
|
9
|
+
send?: (message: string) => void;
|
|
8
10
|
setPageSettings: (params: string) => void;
|
|
9
11
|
} | undefined;
|
|
10
12
|
appId: string;
|
|
@@ -1,4 +1,22 @@
|
|
|
1
|
-
import { type LogError } from '../types';
|
|
1
|
+
import { type GeoConfiguration, type LogError, type NativeBridgeMessage } from '../types';
|
|
2
2
|
export declare function appendFromCurrentQueryParamForIos(nativeUrl: string): string;
|
|
3
3
|
export declare const closeWebviewUtil: () => void;
|
|
4
4
|
export declare const validateUrl: (link: URL | string, logError?: LogError) => URL | null;
|
|
5
|
+
/**
|
|
6
|
+
* Map для сопоставления запросов посланных в натив и ответов от него.
|
|
7
|
+
* Сопоставление происходит по requestId.
|
|
8
|
+
* Сейчас запрос с типом call только один - это geo.configuration.
|
|
9
|
+
*/
|
|
10
|
+
export declare const pendingRequests: Map<string, {
|
|
11
|
+
resolve: (data: GeoConfiguration) => void;
|
|
12
|
+
reject: (error: unknown) => void;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* Универсальная функция для отправки сообщений в нативное приложение
|
|
16
|
+
* (Сигнатуры функций натива в iOS и Android отличаются)
|
|
17
|
+
*/
|
|
18
|
+
export declare const sendMessage: (message: NativeBridgeMessage) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Добавляет обработчик webBridge.callback который будет вызываться нативом
|
|
21
|
+
*/
|
|
22
|
+
export declare const installCallback: () => void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateUrl = exports.closeWebviewUtil = void 0;
|
|
3
|
+
exports.installCallback = exports.sendMessage = exports.pendingRequests = exports.validateUrl = exports.closeWebviewUtil = void 0;
|
|
4
4
|
exports.appendFromCurrentQueryParamForIos = appendFromCurrentQueryParamForIos;
|
|
5
5
|
const QUERY_CLOSE_WEBVIEW_KEY = 'closeWebView';
|
|
6
6
|
const QUERY_CLOSE_WEBVIEW_VALUE = 'true';
|
|
@@ -48,3 +48,64 @@ const validateUrl = (link, logError) => {
|
|
|
48
48
|
return url;
|
|
49
49
|
};
|
|
50
50
|
exports.validateUrl = validateUrl;
|
|
51
|
+
/**
|
|
52
|
+
* Map для сопоставления запросов посланных в натив и ответов от него.
|
|
53
|
+
* Сопоставление происходит по requestId.
|
|
54
|
+
* Сейчас запрос с типом call только один - это geo.configuration.
|
|
55
|
+
*/
|
|
56
|
+
exports.pendingRequests = new Map();
|
|
57
|
+
/**
|
|
58
|
+
* Универсальная функция для отправки сообщений в нативное приложение
|
|
59
|
+
* (Сигнатуры функций натива в iOS и Android отличаются)
|
|
60
|
+
*/
|
|
61
|
+
const sendMessage = (message) => {
|
|
62
|
+
var _a, _b, _c;
|
|
63
|
+
const android = window.Android;
|
|
64
|
+
if (message.kind === 'call' && typeof (android === null || android === void 0 ? void 0 : android.call) === 'function') {
|
|
65
|
+
android.call(JSON.stringify(message));
|
|
66
|
+
}
|
|
67
|
+
else if (message.kind === 'send' && typeof (android === null || android === void 0 ? void 0 : android.send) === 'function') {
|
|
68
|
+
android.send(JSON.stringify(message));
|
|
69
|
+
}
|
|
70
|
+
else 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) {
|
|
71
|
+
window.webkit.messageHandlers.bridge.postMessage(message);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
throw new Error('Native bridge is not available');
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
exports.sendMessage = sendMessage;
|
|
78
|
+
/**
|
|
79
|
+
* Находит ожидающий запрос по requestId, удаляет его из pendingRequests и завершает Promise:
|
|
80
|
+
* успешно с данными или с ошибкой. Если в ответе отсутствуют и данные, и ошибка, отклоняет Promise.
|
|
81
|
+
*
|
|
82
|
+
* Ответы с неизвестным requestId, включая повторные ответы и ответы после тайм-аута, игнорируются.
|
|
83
|
+
*
|
|
84
|
+
* @param requestId Уникальный uuid исходного call-запроса, возвращённый нативом.
|
|
85
|
+
* @param response Ответ натива: data содержит конфигурацию геолокации
|
|
86
|
+
* либо error содержит ошибку. По контракту одно из этих полей равно null.
|
|
87
|
+
*/
|
|
88
|
+
const callback = (requestId, response) => {
|
|
89
|
+
var _a;
|
|
90
|
+
const pending = exports.pendingRequests.get(requestId);
|
|
91
|
+
if (!pending)
|
|
92
|
+
return;
|
|
93
|
+
exports.pendingRequests.delete(requestId);
|
|
94
|
+
if (response.error) {
|
|
95
|
+
pending.reject(Object.assign(new Error((_a = response.error.message) !== null && _a !== void 0 ? _a : 'Native bridge Geolocation error'), response.error));
|
|
96
|
+
}
|
|
97
|
+
else if (response.data) {
|
|
98
|
+
pending.resolve(response.data);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
pending.reject(new Error('Native bridge returned no Geolocation data'));
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Добавляет обработчик webBridge.callback который будет вызываться нативом
|
|
106
|
+
*/
|
|
107
|
+
const installCallback = () => {
|
|
108
|
+
window.webBridge = window.webBridge || {};
|
|
109
|
+
window.webBridge.callback = callback;
|
|
110
|
+
};
|
|
111
|
+
exports.installCallback = installCallback;
|
package/client/types.d.ts
CHANGED
|
@@ -22,4 +22,36 @@ export type NativeFeaturesFromVersion = Readonly<{
|
|
|
22
22
|
}>;
|
|
23
23
|
export type PdfType = 'pdfFile' | 'base64' | 'binary';
|
|
24
24
|
export type Theme = 'light' | 'dark';
|
|
25
|
+
export type NativeBridgeMessage = {
|
|
26
|
+
kind: 'call' | 'send';
|
|
27
|
+
action: string;
|
|
28
|
+
requestId: string;
|
|
29
|
+
data: object | null;
|
|
30
|
+
};
|
|
31
|
+
export type NativeBridgeResponse = {
|
|
32
|
+
data: GeoConfiguration | null;
|
|
33
|
+
error: {
|
|
34
|
+
code: number;
|
|
35
|
+
message?: string;
|
|
36
|
+
details?: unknown;
|
|
37
|
+
} | null;
|
|
38
|
+
};
|
|
39
|
+
export type HapticsOptions = {
|
|
40
|
+
type: 'light' | 'medium' | 'heavy' | 'soft' | 'rigid' | 'success' | 'warning' | 'error' | 'selection';
|
|
41
|
+
intensity?: number;
|
|
42
|
+
};
|
|
43
|
+
export type GeoConfiguration = {
|
|
44
|
+
/**
|
|
45
|
+
* allowed — доступ разрешён;
|
|
46
|
+
* denied — доступ запрещён;
|
|
47
|
+
* notDetermined — пользователь ещё не принял решение;
|
|
48
|
+
* restricted — доступ ограничен
|
|
49
|
+
*/
|
|
50
|
+
permission: 'allowed' | 'denied' | 'notDetermined' | 'restricted';
|
|
51
|
+
userCoordinate: {
|
|
52
|
+
latitude: number;
|
|
53
|
+
longitude: number;
|
|
54
|
+
} | null;
|
|
55
|
+
};
|
|
56
|
+
export type SheetDragArea = 'wholeSheet' | 'navigationBar';
|
|
25
57
|
export {};
|
package/package.json
CHANGED
|
@@ -1,121 +1,127 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
"name": "@alfalab/bridge-to-native",
|
|
3
|
+
"version": "1.5.1-beta.82667a7",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"description": "Утилита для удобной работы веб приложения внутри нативного приложения и коммуникации с ним.",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=20.19.2",
|
|
8
|
+
"npm": "please-use-yarn"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/core-ds/bridge-to-native.git"
|
|
13
|
+
},
|
|
14
|
+
"exports": {
|
|
15
|
+
"./client": {
|
|
16
|
+
"import": "./client/index.js",
|
|
17
|
+
"require": "./client/index.js",
|
|
18
|
+
"types": "./client/index.d.ts"
|
|
9
19
|
},
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
20
|
+
"./client/primitives": {
|
|
21
|
+
"import": "./client/primitives.js",
|
|
22
|
+
"require": "./client/primitives.js",
|
|
23
|
+
"types": "./client/primitives.d.ts"
|
|
13
24
|
},
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
"
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
"parserOptions": {
|
|
63
|
-
"project": [
|
|
64
|
-
"./__tests__/tsconfig.json",
|
|
65
|
-
"./src/client/tsconfig.json",
|
|
66
|
-
"./src/server/tsconfig.json"
|
|
67
|
-
]
|
|
68
|
-
},
|
|
69
|
-
"overrides": [
|
|
70
|
-
{
|
|
71
|
-
"files": [
|
|
72
|
-
"__tests__/**/*"
|
|
73
|
-
],
|
|
74
|
-
"rules": {
|
|
75
|
-
"max-lines": "off"
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
]
|
|
25
|
+
"./server": {
|
|
26
|
+
"import": "./server/index.js",
|
|
27
|
+
"require": "./server/index.js",
|
|
28
|
+
"types": "./server/index.d.ts"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"sideEffects": false,
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/core-ds/bridge-to-native/issues"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "yarn build:clean && yarn build:ts",
|
|
37
|
+
"build:clean": "shx rm -rf .publish",
|
|
38
|
+
"build:copy-package-json": "shx cp package.json .publish/package.json",
|
|
39
|
+
"build:ts": "tsc --build",
|
|
40
|
+
"format": "arui-presets-lint format",
|
|
41
|
+
"format:check": "arui-presets-lint format:check",
|
|
42
|
+
"lint": "yarn lint:scripts && yarn format:check",
|
|
43
|
+
"lint:fix": "yarn lint:scripts --fix && yarn format",
|
|
44
|
+
"lint:scripts": "arui-presets-lint scripts",
|
|
45
|
+
"pub": "npm publish .publish --userconfig \"../.npmrc\" --tag \"$TAG\"",
|
|
46
|
+
"release": "yarn build && yarn build:copy-package-json && yarn pub",
|
|
47
|
+
"test": "arui-scripts test --silent --collect-coverage"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@happy-dom/jest-environment": "18.0.1",
|
|
51
|
+
"@types/jest": "29.5.14",
|
|
52
|
+
"@types/node": "20.19.1",
|
|
53
|
+
"arui-presets-lint": "8.7.0",
|
|
54
|
+
"arui-scripts": "19.0.7",
|
|
55
|
+
"copyfiles": "2.4.1",
|
|
56
|
+
"jest-junit": "10.0.0",
|
|
57
|
+
"lint-staged": "^12.5.0",
|
|
58
|
+
"promisify-child-process": "4.1.1",
|
|
59
|
+
"shx": "0.3.4",
|
|
60
|
+
"typescript": "5.5.4"
|
|
61
|
+
},
|
|
62
|
+
"commitlint": {
|
|
63
|
+
"extends": "./node_modules/arui-presets-lint/commitlint"
|
|
64
|
+
},
|
|
65
|
+
"eslintConfig": {
|
|
66
|
+
"extends": "./node_modules/arui-presets-lint/eslint",
|
|
67
|
+
"parserOptions": {
|
|
68
|
+
"project": [
|
|
69
|
+
"./__tests__/tsconfig.json",
|
|
70
|
+
"./src/client/tsconfig.json",
|
|
71
|
+
"./src/server/tsconfig.json"
|
|
72
|
+
]
|
|
79
73
|
},
|
|
80
|
-
"
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
"testEnvironment": "@happy-dom/jest-environment",
|
|
85
|
-
"testPathIgnorePatterns": [
|
|
86
|
-
"/__tests__/server/"
|
|
87
|
-
]
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
"displayName": "server-tests",
|
|
91
|
-
"testEnvironment": "node",
|
|
92
|
-
"testPathIgnorePatterns": [
|
|
93
|
-
"/__tests__/client/"
|
|
94
|
-
]
|
|
95
|
-
}
|
|
74
|
+
"overrides": [
|
|
75
|
+
{
|
|
76
|
+
"files": [
|
|
77
|
+
"__tests__/**/*"
|
|
96
78
|
],
|
|
97
|
-
"
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
79
|
+
"rules": {
|
|
80
|
+
"max-lines": "off"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
"jest": {
|
|
86
|
+
"projects": [
|
|
87
|
+
{
|
|
88
|
+
"displayName": "client-tests",
|
|
89
|
+
"testEnvironment": "@happy-dom/jest-environment",
|
|
90
|
+
"testPathIgnorePatterns": [
|
|
91
|
+
"/__tests__/server/"
|
|
107
92
|
]
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
|
|
114
|
-
".yarn/releases/*"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"displayName": "server-tests",
|
|
96
|
+
"testEnvironment": "node",
|
|
97
|
+
"testPathIgnorePatterns": [
|
|
98
|
+
"/__tests__/client/"
|
|
115
99
|
]
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"testRegex": [
|
|
103
|
+
"__tests__/.*\\.test\\.ts"
|
|
104
|
+
],
|
|
105
|
+
"coveragePathIgnorePatterns": [
|
|
106
|
+
"/node_modules/",
|
|
107
|
+
"/src/(client|server)/index.ts",
|
|
108
|
+
"/src/client/primitives.ts"
|
|
109
|
+
],
|
|
110
|
+
"reporters": [
|
|
111
|
+
"default",
|
|
112
|
+
"jest-junit"
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
"prettier": "arui-presets-lint/prettier",
|
|
116
|
+
"stylelint": {
|
|
117
|
+
"extends": "arui-presets-lint/stylelint",
|
|
118
|
+
"ignoreFiles": [
|
|
119
|
+
"coverage/**/*.js",
|
|
120
|
+
".yarn/releases/*"
|
|
121
|
+
]
|
|
122
|
+
},
|
|
123
|
+
"publishConfig": {
|
|
124
|
+
"registry": "https://registry.npmjs.org"
|
|
125
|
+
},
|
|
126
|
+
"packageManager": "yarn@4.12.0"
|
|
121
127
|
}
|