@alfalab/bridge-to-native 0.2.1 → 1.0.0
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 +220 -0
- package/client/bridge-to-native.js +267 -0
- package/client/constants.d.ts +13 -0
- package/client/constants.js +30 -0
- package/client/services-and-utils/close-webview-util.d.ts +1 -0
- package/client/services-and-utils/close-webview-util.js +11 -0
- package/client/services-and-utils/external-links-service.d.ts +15 -0
- package/client/services-and-utils/external-links-service.js +71 -0
- package/client/services-and-utils/native-navigation-and-title-service.d.ts +70 -0
- package/client/services-and-utils/native-navigation-and-title-service.js +234 -0
- package/client/services-and-utils/native-params-service.d.ts +24 -0
- package/client/services-and-utils/native-params-service.js +79 -0
- package/client/types.d.ts +19 -0
- package/client/types.js +2 -0
- package/package.json +79 -79
- package/query-and-headers-keys.d.ts +11 -0
- package/query-and-headers-keys.js +45 -0
- package/server/extract-native-service-queries.d.ts +9 -0
- package/server/extract-native-service-queries.js +41 -0
- package/server/index.d.ts +2 -0
- package/server/index.js +7 -0
- package/server/is-webview-env.d.ts +7 -0
- package/server/is-webview-env.js +29 -0
- package/server/prepare-native-app-details-for-client.d.ts +13 -0
- package/server/prepare-native-app-details-for-client.js +78 -0
- package/server/regexp-patterns.d.ts +4 -0
- package/server/regexp-patterns.js +10 -0
- package/server/types.d.ts +2 -0
- package/server/types.js +2 -0
- package/server/utils.d.ts +24 -0
- package/server/utils.js +44 -0
- package/types.d.ts +1 -32
- package/bridge-to-native.d.ts +0 -63
- package/bridge-to-native.js +0 -147
- package/constants.d.ts +0 -15
- package/constants.js +0 -32
- package/esm/bridge-to-native.d.ts +0 -63
- package/esm/bridge-to-native.js +0 -154
- package/esm/constants.d.ts +0 -15
- package/esm/constants.js +0 -29
- package/esm/index.d.ts +0 -2
- package/esm/native-fallbacks.d.ts +0 -64
- package/esm/native-fallbacks.js +0 -119
- package/esm/native-navigation-and-title.d.ts +0 -147
- package/esm/native-navigation-and-title.js +0 -326
- package/esm/types.d.ts +0 -39
- package/esm/types.js +0 -1
- package/esm/utils.d.ts +0 -23
- package/esm/utils.js +0 -62
- package/index.d.ts +0 -2
- package/native-fallbacks.d.ts +0 -64
- package/native-fallbacks.js +0 -124
- package/native-navigation-and-title.d.ts +0 -147
- package/native-navigation-and-title.js +0 -329
- package/utils.d.ts +0 -23
- package/utils.js +0 -70
- /package/{esm/index.js → client/index.d.ts} +0 -0
- /package/{index.js → client/index.js} +0 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
|
|
2
|
+
import { type BrowserHistoryApiWrappers, type HistoryPushStateParams, type LocationAssignParam, type LogError, type NativeFeatureKey, type PdfType } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Сервис, предоставляет методы для WA, работающего внутри NA.
|
|
5
|
+
*/
|
|
6
|
+
export declare class BridgeToNative {
|
|
7
|
+
private options?;
|
|
8
|
+
/**
|
|
9
|
+
* @param options.browserHistoryApiWrappers Объект с методами,
|
|
10
|
+
* которые вызовут методы обертки (например из react-router) над
|
|
11
|
+
* [History](https://developer.mozilla.org/en-US/docs/Web/API/History),
|
|
12
|
+
* если ваше WA такие использует. Если аргумент не передать,
|
|
13
|
+
* будут использованы стандартные `History: pushState()` и `History: go()`.
|
|
14
|
+
* @param options.logError Функция с помощью которой B2N может залогировать ошибку,
|
|
15
|
+
* если не передать, B2N не будет логировать ошибки.
|
|
16
|
+
*/
|
|
17
|
+
constructor(options?: {
|
|
18
|
+
browserHistoryApiWrappers?: BrowserHistoryApiWrappers;
|
|
19
|
+
logError?: LogError;
|
|
20
|
+
} | undefined);
|
|
21
|
+
private nativeParamsService;
|
|
22
|
+
private externalLinksService;
|
|
23
|
+
private nativeNavigationAndTitleService;
|
|
24
|
+
/**
|
|
25
|
+
* Схема NA.
|
|
26
|
+
*/
|
|
27
|
+
get appId(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Версия NA.
|
|
30
|
+
*/
|
|
31
|
+
get appVersion(): string;
|
|
32
|
+
/**
|
|
33
|
+
* Платформа, в окружении которой работает NA и WA.
|
|
34
|
+
*/
|
|
35
|
+
get environment(): import("./types").Environment;
|
|
36
|
+
/**
|
|
37
|
+
* Индикатор проблемы чтения данных о NA. Если `true`, используются умолчания,
|
|
38
|
+
* возможно ошибочные (например, версия будет `0.0.0`).
|
|
39
|
+
*/
|
|
40
|
+
get wasNativeParamsDataFailedToRead(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Сохранённые query-параметры, которыми NA обогощает URL при открытии WV.
|
|
43
|
+
*/
|
|
44
|
+
get originalWebviewParams(): string | null;
|
|
45
|
+
/**
|
|
46
|
+
* Тема (светлая/тёмная), в котором работает NA.
|
|
47
|
+
*/
|
|
48
|
+
get theme(): import("./types").Theme;
|
|
49
|
+
/**
|
|
50
|
+
* Метод, проверяющий, можно ли использовать ли указанную функциональность
|
|
51
|
+
* в текущей версии NA.
|
|
52
|
+
*
|
|
53
|
+
* @param feature Ключ (ID) функциональности, которую нужно проверить.
|
|
54
|
+
* @returns Результат проверки.
|
|
55
|
+
*/
|
|
56
|
+
canUseNativeFeature(feature: NativeFeatureKey): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Метод, отправляющий сигнал NA, что нужно закрыть текущее WV.
|
|
59
|
+
*/
|
|
60
|
+
closeWebview(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Модифицирует ссылку таким образом, чтобы NA открыл её в браузере.
|
|
63
|
+
*
|
|
64
|
+
* ВАЖНО!
|
|
65
|
+
* В ранних версиях NA в браузере ссылку открыть НЕВОЗМОЖНО!
|
|
66
|
+
* В таких версиях в качестве фолбэка этот метод вернет диплинк, открывающий
|
|
67
|
+
* ресурс в новом WV.
|
|
68
|
+
* Версии, с которых можно открыть ссылку в браузере:
|
|
69
|
+
* Android 11.71.0
|
|
70
|
+
* iOS 13.3.0
|
|
71
|
+
*
|
|
72
|
+
* @param link Абсолютная ссылка со всеми компонентами (включая протокол).
|
|
73
|
+
* @returns Модифицированная ссылка для открытия в браузере или диплинк, открывающий
|
|
74
|
+
* ресурс в новом WV.
|
|
75
|
+
*/
|
|
76
|
+
getHrefToOpenInBrowser(link: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* Делает один шаг назад по браузерной истории и модифицирует внутреннее состояние B2N,
|
|
79
|
+
* чтобы в дальнейшем зарегистрировать этот переход в NA.
|
|
80
|
+
*
|
|
81
|
+
* Метод автоматически закрывает WV, если отсутствуют записи в истории переходов B2N.
|
|
82
|
+
*/
|
|
83
|
+
goBack(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Делает несколько шагов назад по браузерной истории и модифицирует внутреннее состояние,
|
|
86
|
+
* чтобы в дальнейшем зарегистрировать этот переход в NA.
|
|
87
|
+
*
|
|
88
|
+
* ВАЖНО!
|
|
89
|
+
* Метод можно использовать только в рамках истории по SPA WA! Движение назад
|
|
90
|
+
* server-side переходом на несколько шагов не поддерживается.
|
|
91
|
+
*
|
|
92
|
+
* Снять это ограничение возможно, но нужны доработки.
|
|
93
|
+
*
|
|
94
|
+
* @param stepsNumber Количество шагов назад.
|
|
95
|
+
* Возможно передача как положительного, так и отрицательного числа. `0` будет проигнорирован.
|
|
96
|
+
* @param autoCloseWebview Флаг — закрывать ли WV автоматически,
|
|
97
|
+
* если переданное кол-во шагов будет больше, чем записей в истории.
|
|
98
|
+
*/
|
|
99
|
+
goBackAFewStepsClientSide(stepsNumber: number, autoCloseWebview?: boolean): void;
|
|
100
|
+
/**
|
|
101
|
+
* Вызывает обработчик диплинков NA для обработки переданного диплинка.
|
|
102
|
+
*
|
|
103
|
+
* Если диплинк приводит к открытию нового экрана, он открывается «поверх» текущего WV.
|
|
104
|
+
* При выходе из нового экрана, пользователь возвращается обратно в WV.
|
|
105
|
+
*
|
|
106
|
+
* ВАЖНО!
|
|
107
|
+
* В NA на Android до версии `12.30.0` текущее WV закрывается при открытии нового экрана,
|
|
108
|
+
* поэтому в закрытое WV невозможно вернуться back-навигацией.
|
|
109
|
+
*
|
|
110
|
+
* @param deeplink Диплинк для передачи на обработку NA.
|
|
111
|
+
* @param closeWebviewBeforeCallNativeDeeplinkHandler Флаг принудительного закрытия текущего WV перед открытием нового экрана.
|
|
112
|
+
* Применимо для всех версий на iOS и в новых версиях на Android (>=12.30.0), в более старых WV закрывается всегда автоматически.
|
|
113
|
+
*/
|
|
114
|
+
handleNativeDeeplink(deeplink: string, closeWebviewBeforeCallNativeDeeplinkHandler?: boolean): void;
|
|
115
|
+
/**
|
|
116
|
+
* Сравнивает текущую версию приложения с переданной.
|
|
117
|
+
*
|
|
118
|
+
* @param versionToCompare Версия, с которой нужно сравнить текущую.
|
|
119
|
+
* @returns `true` – текущая версия больше или равняется переданной,
|
|
120
|
+
* `false` – текущая версия ниже.
|
|
121
|
+
*/
|
|
122
|
+
isCurrentVersionHigherOrEqual(versionToCompare: string): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Для client-side навигации необходимо воспользоваться этим методом,
|
|
125
|
+
* чтобы зарегистрировать навигацию WA в NA. В результате кнопка «Назад» в NA
|
|
126
|
+
* сработает как кнопка «Назад» в Браузере, иначе эта кнопка закрывает WV.
|
|
127
|
+
* Кол-во вызовов метода === кол-ву поведений кнопки, как «Назад» в браузере.
|
|
128
|
+
*
|
|
129
|
+
* Для сброса можно использовать метод `setInitialView`.
|
|
130
|
+
*
|
|
131
|
+
* Метод использует функцию `push` параметра `browserHistoryAbstractions`,
|
|
132
|
+
* если такой был передан в конструктор. Иначе вызывает
|
|
133
|
+
* `History: pushState()` <https://developer.mozilla.org/en-US/docs/Web/API/History/pushState>.
|
|
134
|
+
*
|
|
135
|
+
* @param url URL для перехода внутри WA client-side навигацией.
|
|
136
|
+
* @param state <https://developer.mozilla.org/en-US/docs/Web/API/History/state> для новой записи в истории.
|
|
137
|
+
* @param nativeTitle Текст заголовка, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
138
|
+
*/
|
|
139
|
+
navigateClientSide(url: HistoryPushStateParams[2], state?: HistoryPushStateParams[0], nativeTitle?: string): void;
|
|
140
|
+
/**
|
|
141
|
+
* Для seriver-side навигации необходимо воспользоваться этим методом,
|
|
142
|
+
* чтобы корректно передать информацию экземпляру B2N следующего WA или
|
|
143
|
+
* экзепляру B2N следующей страницы текущего WA (в случае multi-page application).
|
|
144
|
+
*
|
|
145
|
+
* ВАЖНО!
|
|
146
|
+
*
|
|
147
|
+
* Не поддерживаются такие сценарии:
|
|
148
|
+
*
|
|
149
|
+
* 1. Микс client-side навигации и server-side навигации в рамках одного WA.
|
|
150
|
+
* т.е. одно WA должно использовать либо только `navigateClientSide`, либо только `navigateServerSide`.
|
|
151
|
+
* 2. Старт в WA 1 → переход к WA 2 → переход к WA 1,
|
|
152
|
+
* т.е. при использовании server-side навигации, история переходов разных WA не должна смешиваться.
|
|
153
|
+
*
|
|
154
|
+
* Снять эти ограничения возможно, но нужны доработки.
|
|
155
|
+
*
|
|
156
|
+
* @param url URL для перехода внутри WA server-side навигацией.
|
|
157
|
+
* @param nativeTitle Текст заголовка, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
158
|
+
*/
|
|
159
|
+
navigateServerSide(url: LocationAssignParam, nativeTitle?: string): void;
|
|
160
|
+
/**
|
|
161
|
+
* Открывает переданную ссылку в браузере.
|
|
162
|
+
*
|
|
163
|
+
* ВАЖНО!
|
|
164
|
+
* В ранних версиях NA в браузере ссылку открыть НЕВОЗМОЖНО!
|
|
165
|
+
* В таких версиях в качестве фолбэка этот метод открывает ссылку в новом WV.
|
|
166
|
+
* Версии, с которых можно открыть ссылку в браузере:
|
|
167
|
+
* Android 11.71.0
|
|
168
|
+
* iOS 13.3.0
|
|
169
|
+
*
|
|
170
|
+
* @param link Абсолютная ссылка со всеми компонентами (включая протокол).
|
|
171
|
+
*/
|
|
172
|
+
openInBrowser(link: string): void;
|
|
173
|
+
/**
|
|
174
|
+
* Открывает переданную ссылку в новом WV, которое открывается «поверх» текущего WV.
|
|
175
|
+
* При выходе из «нового WV», пользователь возвращается в текущее WV.
|
|
176
|
+
*
|
|
177
|
+
* ВАЖНО!
|
|
178
|
+
* В NA на Android до версии `12.30.0` текущее WV закрывается при открытии нового
|
|
179
|
+
* и в него будет невозможно вернуться back-навигацией.
|
|
180
|
+
*
|
|
181
|
+
* ВАЖНО!
|
|
182
|
+
* В NA планируют внедрить «Белые списки» URL (на основе регулярных выражений),
|
|
183
|
+
* которые разрешено открывать в WV. URL не подпадающие под «Белые списки» NA будет
|
|
184
|
+
* принудительно открывать в браузере.
|
|
185
|
+
*
|
|
186
|
+
* @param link Абсолютная ссылка со всеми компонентами (включая протокол).
|
|
187
|
+
* @param nativeTitle Текст заголовока, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
188
|
+
* @param closeCurrentWebview Флаг принудительного закрытия текущего WV перед открытием нового вебвью.
|
|
189
|
+
* Применимо для всех версий на iOS и в новых версиях на Android (>=12.30.0), в более старых WV закрывается всегда автоматически.
|
|
190
|
+
*/
|
|
191
|
+
openInNewWebview(link: string, nativeTitle?: string, closeCurrentWebview?: boolean): void;
|
|
192
|
+
/**
|
|
193
|
+
* Метод для открытия PDF в нативном вьювере.
|
|
194
|
+
* TODO: Есть нюансы с версиями приложения, OS устройства. Надо тестировать по моде статистики.
|
|
195
|
+
* Надо тщательно изучить вопрос и доработать реализацию.
|
|
196
|
+
*
|
|
197
|
+
* @param url Ссылка на PDF.
|
|
198
|
+
* @param type Тип PDF ссылки (игнорируется в Android окружении).
|
|
199
|
+
* @param title Название PDF файла (игнорируется в Android окружении).
|
|
200
|
+
*/
|
|
201
|
+
openPdf(url: string, type?: PdfType, title?: string): void;
|
|
202
|
+
/**
|
|
203
|
+
* Для перезагрузки страницы необходимо использовать этот метод.
|
|
204
|
+
* Иначе синхронизация состояния с NA будет потеряна.
|
|
205
|
+
*/
|
|
206
|
+
reload(): void;
|
|
207
|
+
/**
|
|
208
|
+
* Информирует NA, что WA находится на первом экране. Это приведёт к тому,
|
|
209
|
+
* что следующее нажатие на кнопку «Назад» в NA закроет WV.
|
|
210
|
+
*
|
|
211
|
+
* @param pageTitle Текст заголовка, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
212
|
+
*/
|
|
213
|
+
setInitialView(nativeTitle?: string): void;
|
|
214
|
+
/**
|
|
215
|
+
* Метод для смены заголовка в NA.
|
|
216
|
+
*
|
|
217
|
+
* @param nativeTitle Текст заголовка, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
218
|
+
*/
|
|
219
|
+
setTitle(nativeTitle: string): void;
|
|
220
|
+
}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint max-lines: ["error", {"skipComments": true}] */ // Много комментариев.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.BridgeToNative = void 0;
|
|
5
|
+
const external_links_service_1 = require("./services-and-utils/external-links-service");
|
|
6
|
+
const native_navigation_and_title_service_1 = require("./services-and-utils/native-navigation-and-title-service");
|
|
7
|
+
const native_params_service_1 = require("./services-and-utils/native-params-service");
|
|
8
|
+
/**
|
|
9
|
+
* Сервис, предоставляет методы для WA, работающего внутри NA.
|
|
10
|
+
*/
|
|
11
|
+
class BridgeToNative {
|
|
12
|
+
/**
|
|
13
|
+
* @param options.browserHistoryApiWrappers Объект с методами,
|
|
14
|
+
* которые вызовут методы обертки (например из react-router) над
|
|
15
|
+
* [History](https://developer.mozilla.org/en-US/docs/Web/API/History),
|
|
16
|
+
* если ваше WA такие использует. Если аргумент не передать,
|
|
17
|
+
* будут использованы стандартные `History: pushState()` и `History: go()`.
|
|
18
|
+
* @param options.logError Функция с помощью которой B2N может залогировать ошибку,
|
|
19
|
+
* если не передать, B2N не будет логировать ошибки.
|
|
20
|
+
*/
|
|
21
|
+
constructor(options) {
|
|
22
|
+
var _a, _b, _c;
|
|
23
|
+
this.options = options;
|
|
24
|
+
this.nativeParamsService = new native_params_service_1.NativeParamsService((_a = this.options) === null || _a === void 0 ? void 0 : _a.logError);
|
|
25
|
+
this.externalLinksService = new external_links_service_1.ExternalLinksService(this.nativeParamsService);
|
|
26
|
+
this.nativeNavigationAndTitleService = new native_navigation_and_title_service_1.NativeNavigationAndTitleService(this.nativeParamsService, (_b = this.options) === null || _b === void 0 ? void 0 : _b.browserHistoryApiWrappers, (_c = this.options) === null || _c === void 0 ? void 0 : _c.logError);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Схема NA.
|
|
30
|
+
*/
|
|
31
|
+
get appId() {
|
|
32
|
+
return this.nativeParamsService.appId;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Версия NA.
|
|
36
|
+
*/
|
|
37
|
+
get appVersion() {
|
|
38
|
+
return this.nativeParamsService.appVersion;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Платформа, в окружении которой работает NA и WA.
|
|
42
|
+
*/
|
|
43
|
+
get environment() {
|
|
44
|
+
return this.nativeParamsService.environment;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Индикатор проблемы чтения данных о NA. Если `true`, используются умолчания,
|
|
48
|
+
* возможно ошибочные (например, версия будет `0.0.0`).
|
|
49
|
+
*/
|
|
50
|
+
get wasNativeParamsDataFailedToRead() {
|
|
51
|
+
return this.nativeParamsService.nativeParamsReadErrorFlag;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Сохранённые query-параметры, которыми NA обогощает URL при открытии WV.
|
|
55
|
+
*/
|
|
56
|
+
get originalWebviewParams() {
|
|
57
|
+
return this.nativeParamsService.originalWebviewParams;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Тема (светлая/тёмная), в котором работает NA.
|
|
61
|
+
*/
|
|
62
|
+
get theme() {
|
|
63
|
+
return this.nativeParamsService.theme;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Метод, проверяющий, можно ли использовать ли указанную функциональность
|
|
67
|
+
* в текущей версии NA.
|
|
68
|
+
*
|
|
69
|
+
* @param feature Ключ (ID) функциональности, которую нужно проверить.
|
|
70
|
+
* @returns Результат проверки.
|
|
71
|
+
*/
|
|
72
|
+
canUseNativeFeature(feature) {
|
|
73
|
+
return this.nativeParamsService.canUseNativeFeature(feature);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Метод, отправляющий сигнал NA, что нужно закрыть текущее WV.
|
|
77
|
+
*/
|
|
78
|
+
closeWebview() {
|
|
79
|
+
this.nativeNavigationAndTitleService.closeWebview();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Модифицирует ссылку таким образом, чтобы NA открыл её в браузере.
|
|
83
|
+
*
|
|
84
|
+
* ВАЖНО!
|
|
85
|
+
* В ранних версиях NA в браузере ссылку открыть НЕВОЗМОЖНО!
|
|
86
|
+
* В таких версиях в качестве фолбэка этот метод вернет диплинк, открывающий
|
|
87
|
+
* ресурс в новом WV.
|
|
88
|
+
* Версии, с которых можно открыть ссылку в браузере:
|
|
89
|
+
* Android 11.71.0
|
|
90
|
+
* iOS 13.3.0
|
|
91
|
+
*
|
|
92
|
+
* @param link Абсолютная ссылка со всеми компонентами (включая протокол).
|
|
93
|
+
* @returns Модифицированная ссылка для открытия в браузере или диплинк, открывающий
|
|
94
|
+
* ресурс в новом WV.
|
|
95
|
+
*/
|
|
96
|
+
getHrefToOpenInBrowser(link) {
|
|
97
|
+
return this.externalLinksService.getHrefToOpenInBrowser(link);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Делает один шаг назад по браузерной истории и модифицирует внутреннее состояние B2N,
|
|
101
|
+
* чтобы в дальнейшем зарегистрировать этот переход в NA.
|
|
102
|
+
*
|
|
103
|
+
* Метод автоматически закрывает WV, если отсутствуют записи в истории переходов B2N.
|
|
104
|
+
*/
|
|
105
|
+
goBack() {
|
|
106
|
+
this.nativeNavigationAndTitleService.goBack();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Делает несколько шагов назад по браузерной истории и модифицирует внутреннее состояние,
|
|
110
|
+
* чтобы в дальнейшем зарегистрировать этот переход в NA.
|
|
111
|
+
*
|
|
112
|
+
* ВАЖНО!
|
|
113
|
+
* Метод можно использовать только в рамках истории по SPA WA! Движение назад
|
|
114
|
+
* server-side переходом на несколько шагов не поддерживается.
|
|
115
|
+
*
|
|
116
|
+
* Снять это ограничение возможно, но нужны доработки.
|
|
117
|
+
*
|
|
118
|
+
* @param stepsNumber Количество шагов назад.
|
|
119
|
+
* Возможно передача как положительного, так и отрицательного числа. `0` будет проигнорирован.
|
|
120
|
+
* @param autoCloseWebview Флаг — закрывать ли WV автоматически,
|
|
121
|
+
* если переданное кол-во шагов будет больше, чем записей в истории.
|
|
122
|
+
*/
|
|
123
|
+
goBackAFewStepsClientSide(stepsNumber, autoCloseWebview = false) {
|
|
124
|
+
this.nativeNavigationAndTitleService.goBackAFewStepsClientSide(stepsNumber, autoCloseWebview);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Вызывает обработчик диплинков NA для обработки переданного диплинка.
|
|
128
|
+
*
|
|
129
|
+
* Если диплинк приводит к открытию нового экрана, он открывается «поверх» текущего WV.
|
|
130
|
+
* При выходе из нового экрана, пользователь возвращается обратно в WV.
|
|
131
|
+
*
|
|
132
|
+
* ВАЖНО!
|
|
133
|
+
* В NA на Android до версии `12.30.0` текущее WV закрывается при открытии нового экрана,
|
|
134
|
+
* поэтому в закрытое WV невозможно вернуться back-навигацией.
|
|
135
|
+
*
|
|
136
|
+
* @param deeplink Диплинк для передачи на обработку NA.
|
|
137
|
+
* @param closeWebviewBeforeCallNativeDeeplinkHandler Флаг принудительного закрытия текущего WV перед открытием нового экрана.
|
|
138
|
+
* Применимо для всех версий на iOS и в новых версиях на Android (>=12.30.0), в более старых WV закрывается всегда автоматически.
|
|
139
|
+
*/
|
|
140
|
+
handleNativeDeeplink(deeplink, closeWebviewBeforeCallNativeDeeplinkHandler = false) {
|
|
141
|
+
this.externalLinksService.handleNativeDeeplink(deeplink, closeWebviewBeforeCallNativeDeeplinkHandler);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Сравнивает текущую версию приложения с переданной.
|
|
145
|
+
*
|
|
146
|
+
* @param versionToCompare Версия, с которой нужно сравнить текущую.
|
|
147
|
+
* @returns `true` – текущая версия больше или равняется переданной,
|
|
148
|
+
* `false` – текущая версия ниже.
|
|
149
|
+
*/
|
|
150
|
+
isCurrentVersionHigherOrEqual(versionToCompare) {
|
|
151
|
+
return this.nativeParamsService.isCurrentVersionHigherOrEqual(versionToCompare);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Для client-side навигации необходимо воспользоваться этим методом,
|
|
155
|
+
* чтобы зарегистрировать навигацию WA в NA. В результате кнопка «Назад» в NA
|
|
156
|
+
* сработает как кнопка «Назад» в Браузере, иначе эта кнопка закрывает WV.
|
|
157
|
+
* Кол-во вызовов метода === кол-ву поведений кнопки, как «Назад» в браузере.
|
|
158
|
+
*
|
|
159
|
+
* Для сброса можно использовать метод `setInitialView`.
|
|
160
|
+
*
|
|
161
|
+
* Метод использует функцию `push` параметра `browserHistoryAbstractions`,
|
|
162
|
+
* если такой был передан в конструктор. Иначе вызывает
|
|
163
|
+
* `History: pushState()` <https://developer.mozilla.org/en-US/docs/Web/API/History/pushState>.
|
|
164
|
+
*
|
|
165
|
+
* @param url URL для перехода внутри WA client-side навигацией.
|
|
166
|
+
* @param state <https://developer.mozilla.org/en-US/docs/Web/API/History/state> для новой записи в истории.
|
|
167
|
+
* @param nativeTitle Текст заголовка, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
168
|
+
*/
|
|
169
|
+
navigateClientSide(url, state, nativeTitle = '') {
|
|
170
|
+
this.nativeNavigationAndTitleService.navigateClientSide(url, state, nativeTitle);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Для seriver-side навигации необходимо воспользоваться этим методом,
|
|
174
|
+
* чтобы корректно передать информацию экземпляру B2N следующего WA или
|
|
175
|
+
* экзепляру B2N следующей страницы текущего WA (в случае multi-page application).
|
|
176
|
+
*
|
|
177
|
+
* ВАЖНО!
|
|
178
|
+
*
|
|
179
|
+
* Не поддерживаются такие сценарии:
|
|
180
|
+
*
|
|
181
|
+
* 1. Микс client-side навигации и server-side навигации в рамках одного WA.
|
|
182
|
+
* т.е. одно WA должно использовать либо только `navigateClientSide`, либо только `navigateServerSide`.
|
|
183
|
+
* 2. Старт в WA 1 → переход к WA 2 → переход к WA 1,
|
|
184
|
+
* т.е. при использовании server-side навигации, история переходов разных WA не должна смешиваться.
|
|
185
|
+
*
|
|
186
|
+
* Снять эти ограничения возможно, но нужны доработки.
|
|
187
|
+
*
|
|
188
|
+
* @param url URL для перехода внутри WA server-side навигацией.
|
|
189
|
+
* @param nativeTitle Текст заголовка, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
190
|
+
*/
|
|
191
|
+
navigateServerSide(url, nativeTitle = '') {
|
|
192
|
+
this.nativeNavigationAndTitleService.navigateServerSide(url, nativeTitle);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Открывает переданную ссылку в браузере.
|
|
196
|
+
*
|
|
197
|
+
* ВАЖНО!
|
|
198
|
+
* В ранних версиях NA в браузере ссылку открыть НЕВОЗМОЖНО!
|
|
199
|
+
* В таких версиях в качестве фолбэка этот метод открывает ссылку в новом WV.
|
|
200
|
+
* Версии, с которых можно открыть ссылку в браузере:
|
|
201
|
+
* Android 11.71.0
|
|
202
|
+
* iOS 13.3.0
|
|
203
|
+
*
|
|
204
|
+
* @param link Абсолютная ссылка со всеми компонентами (включая протокол).
|
|
205
|
+
*/
|
|
206
|
+
openInBrowser(link) {
|
|
207
|
+
this.externalLinksService.openInBrowser(link);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Открывает переданную ссылку в новом WV, которое открывается «поверх» текущего WV.
|
|
211
|
+
* При выходе из «нового WV», пользователь возвращается в текущее WV.
|
|
212
|
+
*
|
|
213
|
+
* ВАЖНО!
|
|
214
|
+
* В NA на Android до версии `12.30.0` текущее WV закрывается при открытии нового
|
|
215
|
+
* и в него будет невозможно вернуться back-навигацией.
|
|
216
|
+
*
|
|
217
|
+
* ВАЖНО!
|
|
218
|
+
* В NA планируют внедрить «Белые списки» URL (на основе регулярных выражений),
|
|
219
|
+
* которые разрешено открывать в WV. URL не подпадающие под «Белые списки» NA будет
|
|
220
|
+
* принудительно открывать в браузере.
|
|
221
|
+
*
|
|
222
|
+
* @param link Абсолютная ссылка со всеми компонентами (включая протокол).
|
|
223
|
+
* @param nativeTitle Текст заголовока, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
224
|
+
* @param closeCurrentWebview Флаг принудительного закрытия текущего WV перед открытием нового вебвью.
|
|
225
|
+
* Применимо для всех версий на iOS и в новых версиях на Android (>=12.30.0), в более старых WV закрывается всегда автоматически.
|
|
226
|
+
*/
|
|
227
|
+
openInNewWebview(link, nativeTitle = '', closeCurrentWebview = false) {
|
|
228
|
+
this.externalLinksService.openInNewWebview(link, nativeTitle, closeCurrentWebview);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Метод для открытия PDF в нативном вьювере.
|
|
232
|
+
* TODO: Есть нюансы с версиями приложения, OS устройства. Надо тестировать по моде статистики.
|
|
233
|
+
* Надо тщательно изучить вопрос и доработать реализацию.
|
|
234
|
+
*
|
|
235
|
+
* @param url Ссылка на PDF.
|
|
236
|
+
* @param type Тип PDF ссылки (игнорируется в Android окружении).
|
|
237
|
+
* @param title Название PDF файла (игнорируется в Android окружении).
|
|
238
|
+
*/
|
|
239
|
+
openPdf(url, type = 'pdfFile', title) {
|
|
240
|
+
this.externalLinksService.openPdf(url, type, title);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Для перезагрузки страницы необходимо использовать этот метод.
|
|
244
|
+
* Иначе синхронизация состояния с NA будет потеряна.
|
|
245
|
+
*/
|
|
246
|
+
reload() {
|
|
247
|
+
this.nativeNavigationAndTitleService.reload();
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Информирует NA, что WA находится на первом экране. Это приведёт к тому,
|
|
251
|
+
* что следующее нажатие на кнопку «Назад» в NA закроет WV.
|
|
252
|
+
*
|
|
253
|
+
* @param pageTitle Текст заголовка, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
254
|
+
*/
|
|
255
|
+
setInitialView(nativeTitle = '') {
|
|
256
|
+
this.nativeNavigationAndTitleService.setInitialView(nativeTitle);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Метод для смены заголовка в NA.
|
|
260
|
+
*
|
|
261
|
+
* @param nativeTitle Текст заголовка, для «нативной» части WV, пустая строка — отсутствие заголовка.
|
|
262
|
+
*/
|
|
263
|
+
setTitle(nativeTitle) {
|
|
264
|
+
this.nativeNavigationAndTitleService.setTitle(nativeTitle);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
exports.BridgeToNative = BridgeToNative;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type NativeFeaturesFromVersion } from './types';
|
|
2
|
+
export declare const ANDROID_APP_ID = "alfabank";
|
|
3
|
+
export declare const DEEP_LINK_PATTERN: RegExp;
|
|
4
|
+
export declare const NATIVE_FEATURES_FROM_VERSION: NativeFeaturesFromVersion;
|
|
5
|
+
export declare const VERSION_TO_IOS_APP_ID: {
|
|
6
|
+
readonly '0.0.0': "alfabank";
|
|
7
|
+
readonly '12.22.0': "aconcierge";
|
|
8
|
+
readonly '12.26.0': "kittycash";
|
|
9
|
+
readonly '13.2.0': "triptally";
|
|
10
|
+
readonly '13.4.0': "cashline";
|
|
11
|
+
readonly '13.5.0': "assistmekz";
|
|
12
|
+
readonly '14.5.0': "smartfinancementor";
|
|
13
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VERSION_TO_IOS_APP_ID = exports.NATIVE_FEATURES_FROM_VERSION = exports.DEEP_LINK_PATTERN = exports.ANDROID_APP_ID = void 0;
|
|
4
|
+
exports.ANDROID_APP_ID = 'alfabank';
|
|
5
|
+
exports.DEEP_LINK_PATTERN = /^(\/|alfabank:\/{3}dashboard\/|alfabank:\/{3}|alfabank:\/{2}|https:\/{2}online.alfabank.ru\/)/;
|
|
6
|
+
exports.NATIVE_FEATURES_FROM_VERSION = {
|
|
7
|
+
android: {
|
|
8
|
+
linksInBrowser: {
|
|
9
|
+
fromVersion: '11.71.0',
|
|
10
|
+
},
|
|
11
|
+
geolocation: { fromVersion: '11.71.0' },
|
|
12
|
+
savedBackStack: { fromVersion: '12.30.0' },
|
|
13
|
+
},
|
|
14
|
+
ios: {
|
|
15
|
+
linksInBrowser: {
|
|
16
|
+
fromVersion: '13.3.0',
|
|
17
|
+
},
|
|
18
|
+
geolocation: { fromVersion: '0.0.0' },
|
|
19
|
+
savedBackStack: { fromVersion: '0.0.0' },
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
exports.VERSION_TO_IOS_APP_ID = {
|
|
23
|
+
'0.0.0': 'alfabank',
|
|
24
|
+
'12.22.0': 'aconcierge',
|
|
25
|
+
'12.26.0': 'kittycash',
|
|
26
|
+
'13.2.0': 'triptally',
|
|
27
|
+
'13.4.0': 'cashline',
|
|
28
|
+
'13.5.0': 'assistmekz',
|
|
29
|
+
'14.5.0': 'smartfinancementor',
|
|
30
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const closeWebviewUtil: () => void;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.closeWebviewUtil = void 0;
|
|
4
|
+
const QUERY_CLOSE_WEBVIEW_KEY = 'closeWebView';
|
|
5
|
+
const QUERY_CLOSE_WEBVIEW_VALUE = 'true';
|
|
6
|
+
const closeWebviewUtil = () => {
|
|
7
|
+
const originalPageUrl = new URL(window.location.href);
|
|
8
|
+
originalPageUrl.searchParams.set(QUERY_CLOSE_WEBVIEW_KEY, QUERY_CLOSE_WEBVIEW_VALUE);
|
|
9
|
+
window.location.href = originalPageUrl.toString();
|
|
10
|
+
};
|
|
11
|
+
exports.closeWebviewUtil = closeWebviewUtil;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type PdfType } from '../types';
|
|
2
|
+
import { type NativeParamsService } from './native-params-service';
|
|
3
|
+
/**
|
|
4
|
+
* Сервис, предоставляющий методы для открытия внешних для текущего WA экранов
|
|
5
|
+
* и связанных с этим действий.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ExternalLinksService {
|
|
8
|
+
private nativeParamsService;
|
|
9
|
+
constructor(nativeParamsService: NativeParamsService);
|
|
10
|
+
handleNativeDeeplink(deeplink: string, closeWebviewBeforeCallNativeDeeplinkHandler?: boolean): void;
|
|
11
|
+
getHrefToOpenInBrowser(link: string): string;
|
|
12
|
+
openInBrowser(link: string): void;
|
|
13
|
+
openInNewWebview(link: string, nativeTitle?: string, closeCurrentWebview?: boolean): void;
|
|
14
|
+
openPdf(url: string, type?: PdfType, title?: string): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExternalLinksService = void 0;
|
|
4
|
+
const query_and_headers_keys_1 = require("../../query-and-headers-keys");
|
|
5
|
+
const constants_1 = require("../constants");
|
|
6
|
+
const close_webview_util_1 = require("./close-webview-util");
|
|
7
|
+
const QUERY_OPEN_IN_BROWSER_KEY = 'openInBrowser';
|
|
8
|
+
const QUERY_OPEN_IN_BROWSER_VALUE = 'true';
|
|
9
|
+
/**
|
|
10
|
+
* Сервис, предоставляющий методы для открытия внешних для текущего WA экранов
|
|
11
|
+
* и связанных с этим действий.
|
|
12
|
+
*/
|
|
13
|
+
class ExternalLinksService {
|
|
14
|
+
constructor(nativeParamsService) {
|
|
15
|
+
this.nativeParamsService = nativeParamsService;
|
|
16
|
+
}
|
|
17
|
+
handleNativeDeeplink(deeplink, closeWebviewBeforeCallNativeDeeplinkHandler = false) {
|
|
18
|
+
const clearedDeeplinkPath = deeplink.replace(constants_1.DEEP_LINK_PATTERN, '');
|
|
19
|
+
if (closeWebviewBeforeCallNativeDeeplinkHandler &&
|
|
20
|
+
this.nativeParamsService.canUseNativeFeature('savedBackStack')) {
|
|
21
|
+
(0, close_webview_util_1.closeWebviewUtil)();
|
|
22
|
+
// Проверено, ОС получает диплинк и передаёт его NA, не смотря на то,
|
|
23
|
+
// что это происходит в следующей макрозадаче после команды на закрытие WV.
|
|
24
|
+
setTimeout(() => window.location.replace(`${this.nativeParamsService.appId}://${clearedDeeplinkPath}`), 0);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
window.location.replace(`${this.nativeParamsService.appId}://${clearedDeeplinkPath}`);
|
|
28
|
+
}
|
|
29
|
+
getHrefToOpenInBrowser(link) {
|
|
30
|
+
if (!this.nativeParamsService.canUseNativeFeature('linksInBrowser')) {
|
|
31
|
+
return `${this.nativeParamsService.appId}://webFeature?type=recommendation&url=${encodeURIComponent(link)}`;
|
|
32
|
+
}
|
|
33
|
+
const url = new URL(link);
|
|
34
|
+
url.searchParams.append(QUERY_OPEN_IN_BROWSER_KEY, QUERY_OPEN_IN_BROWSER_VALUE);
|
|
35
|
+
return url.href;
|
|
36
|
+
}
|
|
37
|
+
openInBrowser(link) {
|
|
38
|
+
if (!this.nativeParamsService.canUseNativeFeature('linksInBrowser')) {
|
|
39
|
+
this.openInNewWebview(link);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const url = new URL(link);
|
|
43
|
+
url.searchParams.append(QUERY_OPEN_IN_BROWSER_KEY, QUERY_OPEN_IN_BROWSER_VALUE);
|
|
44
|
+
window.location.replace(url.href);
|
|
45
|
+
}
|
|
46
|
+
openInNewWebview(link, nativeTitle = '', closeCurrentWebview = false) {
|
|
47
|
+
const url = new URL(link);
|
|
48
|
+
if (nativeTitle) {
|
|
49
|
+
url.searchParams.set(query_and_headers_keys_1.QUERY_B2N_TITLE, nativeTitle);
|
|
50
|
+
}
|
|
51
|
+
this.handleNativeDeeplink(`/webFeature?type=recommendation&url=${encodeURIComponent(url.toString())}`, closeCurrentWebview);
|
|
52
|
+
}
|
|
53
|
+
openPdf(url, type = 'pdfFile', title) {
|
|
54
|
+
let replaceUrl = url;
|
|
55
|
+
if (this.nativeParamsService.environment === 'ios') {
|
|
56
|
+
const params = new URLSearchParams();
|
|
57
|
+
params.append('type', type);
|
|
58
|
+
params.append('url', decodeURIComponent(url));
|
|
59
|
+
if (title) {
|
|
60
|
+
params.append('title', title.replace(/\s/g, '_'));
|
|
61
|
+
}
|
|
62
|
+
const paramsStr = params.toString();
|
|
63
|
+
replaceUrl = `${this.nativeParamsService.appId}:///dashboard/pdf_viewer?${paramsStr}`;
|
|
64
|
+
}
|
|
65
|
+
const windowObjectReference = window.open(replaceUrl);
|
|
66
|
+
if (windowObjectReference === null) {
|
|
67
|
+
window.location.replace(replaceUrl);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.ExternalLinksService = ExternalLinksService;
|