@alfalab/bridge-to-native 0.0.7 → 0.0.9

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.
@@ -0,0 +1,63 @@
1
+ import { NativeFallbacks } from './native-fallbacks';
2
+ import { NativeNavigationAndTitle } from './native-navigation-and-title';
3
+ import type { Environment, HandleRedirect, NativeFeatureKey, NativeParams, Theme } from './types';
4
+ /**
5
+ * Этот класс — абстракция для связи веб приложения с нативом и предназначен ТОЛЬКО
6
+ * для использования в вебвью окружении.
7
+ */
8
+ export declare class BridgeToNative {
9
+ readonly AndroidBridge: {
10
+ setPageSettings: (params: string) => void;
11
+ } | undefined;
12
+ readonly environment: Environment;
13
+ readonly nativeFallbacks: NativeFallbacks;
14
+ private nextPageId;
15
+ private readonly _blankPagePath;
16
+ private readonly _handleRedirect;
17
+ constructor(handleRedirect: HandleRedirect, blankPagePath: string, nativeParams?: NativeParams);
18
+ private _nativeNavigationAndTitle;
19
+ get nativeNavigationAndTitle(): NativeNavigationAndTitle;
20
+ private _originalWebviewParams;
21
+ get originalWebviewParams(): string;
22
+ private _appVersion;
23
+ get appVersion(): string;
24
+ private _iosAppId?;
25
+ get iosAppId(): string | undefined;
26
+ private _theme;
27
+ get theme(): Theme;
28
+ /**
29
+ * Метод, проверяющий, можно ли использовать нативную функциональность в текущей версии приложения.
30
+ *
31
+ * @param feature Название функциональности, которую нужно проверить.
32
+ */
33
+ canUseNativeFeature(feature: NativeFeatureKey): boolean;
34
+ /**
35
+ * Метод, отправляющий сигнал нативу, что нужно закрыть текущее вебвью.
36
+ */
37
+ closeWebview(): void;
38
+ /**
39
+ * Сравнивает текущую версию приложения с переданной.
40
+ *
41
+ * @param versionToCompare Версия, с которой нужно сравнить текущую.
42
+ * @returns `true` – текущая версия больше или равняется переданной,
43
+ * `false` – текущая версия ниже.
44
+ */
45
+ isCurrentVersionHigherOrEqual(versionToCompare: string): boolean;
46
+ checkAndroidAllowOpenInNewWebview(): boolean;
47
+ /**
48
+ * Сохраняет текущее состояние BridgeToNative в sessionStorage.
49
+ * Так же сохраняет текущее состояние nativeNavigationAndTitle.
50
+ */
51
+ private saveCurrentState;
52
+ /**
53
+ * Возвращает схему приложения в iOS окружении, на основе версии.
54
+ *
55
+ * @param knownIosAppId Тип iOS приложения, если он известен.
56
+ * @returns Тип приложения, `undefined` для Android окружения.
57
+ */
58
+ private getIosAppId;
59
+ /**
60
+ * Восстанавливает свое предыдущее состояние из sessionStorage
61
+ */
62
+ private restorePreviousState;
63
+ }
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /* eslint-disable no-underscore-dangle */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BridgeToNative = void 0;
5
+ const constants_1 = require("./constants");
6
+ const native_fallbacks_1 = require("./native-fallbacks");
7
+ const native_navigation_and_title_1 = require("./native-navigation-and-title");
8
+ const utils_1 = require("./utils");
9
+ /**
10
+ * Этот класс — абстракция для связи веб приложения с нативом и предназначен ТОЛЬКО
11
+ * для использования в вебвью окружении.
12
+ */
13
+ class BridgeToNative {
14
+ constructor(handleRedirect, blankPagePath, nativeParams) {
15
+ // Webview, запущенное в Android окружении имеет объект `Android` в window.
16
+ this.AndroidBridge = window.Android;
17
+ this.environment = this.AndroidBridge ? 'android' : 'ios';
18
+ const previousState = !!sessionStorage.getItem(constants_1.PREVIOUS_B2N_STATE_STORAGE_KEY);
19
+ if (previousState) {
20
+ this.restorePreviousState();
21
+ this.nativeFallbacks = new native_fallbacks_1.NativeFallbacks(this);
22
+ this._blankPagePath = blankPagePath;
23
+ return;
24
+ }
25
+ this._appVersion =
26
+ nativeParams && (0, utils_1.isValidVersionFormat)(nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.appVersion)
27
+ ? nativeParams.appVersion
28
+ : '0.0.0';
29
+ this._iosAppId = this.getIosAppId(nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.iosAppId);
30
+ this._theme = (nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.theme) === 'dark' ? 'dark' : 'light';
31
+ this._originalWebviewParams = (nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.originalWebviewParams) || '';
32
+ this._nativeNavigationAndTitle = new native_navigation_and_title_1.NativeNavigationAndTitle(this, nativeParams ? nativeParams.nextPageId : null, nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.title, handleRedirect);
33
+ this._handleRedirect = handleRedirect;
34
+ this.nextPageId = nativeParams ? nativeParams.nextPageId : null;
35
+ this.nativeFallbacks = new native_fallbacks_1.NativeFallbacks(this);
36
+ this._blankPagePath = blankPagePath;
37
+ }
38
+ get nativeNavigationAndTitle() {
39
+ return this._nativeNavigationAndTitle;
40
+ }
41
+ get originalWebviewParams() {
42
+ return this._originalWebviewParams;
43
+ }
44
+ get appVersion() {
45
+ return this._appVersion;
46
+ }
47
+ get iosAppId() {
48
+ return this._iosAppId;
49
+ }
50
+ get theme() {
51
+ return this._theme;
52
+ }
53
+ /**
54
+ * Метод, проверяющий, можно ли использовать нативную функциональность в текущей версии приложения.
55
+ *
56
+ * @param feature Название функциональности, которую нужно проверить.
57
+ */
58
+ canUseNativeFeature(feature) {
59
+ const { fromVersion } = constants_1.nativeFeaturesFromVersion[this.environment][feature];
60
+ return this.isCurrentVersionHigherOrEqual(fromVersion);
61
+ }
62
+ /**
63
+ * Метод, отправляющий сигнал нативу, что нужно закрыть текущее вебвью.
64
+ */
65
+ // eslint-disable-next-line class-methods-use-this
66
+ closeWebview() {
67
+ const originalPageUrl = new URL(window.location.href);
68
+ originalPageUrl.searchParams.set(constants_1.CLOSE_WEBVIEW_SEARCH_KEY, constants_1.CLOSE_WEBVIEW_SEARCH_VALUE);
69
+ window.location.href = originalPageUrl.toString();
70
+ }
71
+ /**
72
+ * Сравнивает текущую версию приложения с переданной.
73
+ *
74
+ * @param versionToCompare Версия, с которой нужно сравнить текущую.
75
+ * @returns `true` – текущая версия больше или равняется переданной,
76
+ * `false` – текущая версия ниже.
77
+ */
78
+ isCurrentVersionHigherOrEqual(versionToCompare) {
79
+ if (!(0, utils_1.isValidVersionFormat)(versionToCompare)) {
80
+ return false;
81
+ }
82
+ const matchPattern = /(\d+)\.(\d+)\.(\d+)/;
83
+ const [, ...appVersionComponents] = this._appVersion.match(matchPattern); // Формат версии проверен в конструкторе, можно смело убирать `null` из типа.
84
+ const [, ...versionToCompareComponents] = versionToCompare.match(matchPattern);
85
+ for (let i = 0; i < appVersionComponents.length; i++) {
86
+ if (appVersionComponents[i] !== versionToCompareComponents[i]) {
87
+ return appVersionComponents[i] >= versionToCompareComponents[i];
88
+ }
89
+ }
90
+ return true;
91
+ }
92
+ checkAndroidAllowOpenInNewWebview() {
93
+ const comparisonResult = this.isCurrentVersionHigherOrEqual(constants_1.START_VERSION_ANDROID_ALLOW_OPEN_NEW_WEBVIEW);
94
+ return this.environment === 'android' && comparisonResult;
95
+ }
96
+ /**
97
+ * Сохраняет текущее состояние BridgeToNative в sessionStorage.
98
+ * Так же сохраняет текущее состояние nativeNavigationAndTitle.
99
+ */
100
+ saveCurrentState() {
101
+ // В nativeNavigationAndTitle этот метод отмечен модификатором доступа private дабы не торчал наружу, но тут его нужно вызвать
102
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
103
+ // @ts-ignore
104
+ this._nativeNavigationAndTitle.saveCurrentState();
105
+ const currentState = {
106
+ appVersion: this._appVersion,
107
+ theme: this._theme,
108
+ nextPageId: this.nextPageId,
109
+ originalWebviewParams: this._originalWebviewParams || '',
110
+ iosAppId: this._iosAppId,
111
+ };
112
+ sessionStorage.setItem(constants_1.PREVIOUS_B2N_STATE_STORAGE_KEY, JSON.stringify(currentState));
113
+ }
114
+ /**
115
+ * Возвращает схему приложения в iOS окружении, на основе версии.
116
+ *
117
+ * @param knownIosAppId Тип iOS приложения, если он известен.
118
+ * @returns Тип приложения, `undefined` для Android окружения.
119
+ */
120
+ getIosAppId(knownIosAppId) {
121
+ if (this.environment !== 'ios') {
122
+ return undefined;
123
+ }
124
+ if (knownIosAppId) {
125
+ return knownIosAppId;
126
+ }
127
+ const keys = Object.keys(constants_1.versionToIosAppId);
128
+ const rightKey = [...keys].reverse().find((version) => this.isCurrentVersionHigherOrEqual(version)) ||
129
+ keys[0];
130
+ return atob(constants_1.versionToIosAppId[rightKey]);
131
+ }
132
+ /**
133
+ * Восстанавливает свое предыдущее состояние из sessionStorage
134
+ */
135
+ restorePreviousState() {
136
+ const previousState = JSON.parse(sessionStorage.getItem(constants_1.PREVIOUS_B2N_STATE_STORAGE_KEY) || '');
137
+ this._appVersion = previousState.appVersion;
138
+ this._iosAppId = previousState.iosAppId;
139
+ this._theme = previousState.theme;
140
+ this._originalWebviewParams = previousState.originalWebviewParams;
141
+ this.nextPageId = previousState.nextPageId;
142
+ this._nativeNavigationAndTitle = new native_navigation_and_title_1.NativeNavigationAndTitle(this, previousState.nextPageId, '', this._handleRedirect);
143
+ sessionStorage.removeItem(constants_1.PREVIOUS_B2N_STATE_STORAGE_KEY);
144
+ }
145
+ }
146
+ exports.BridgeToNative = BridgeToNative;
package/constants.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import { NativeFeaturesFromVersion } from './types';
2
+ export declare const START_VERSION_ANDROID_ALLOW_OPEN_NEW_WEBVIEW = "10.35.0";
3
+ export declare const ANDROID_APP_ID = "YWxmYWJhbms=";
2
4
  export declare const CLOSE_WEBVIEW_SEARCH_KEY = "closeWebView";
3
5
  export declare const CLOSE_WEBVIEW_SEARCH_VALUE = "true";
4
6
  export declare const PREVIOUS_B2N_STATE_STORAGE_KEY = "previousBridgeToNativeState";
@@ -10,3 +12,4 @@ export declare const versionToIosAppId: {
10
12
  readonly '12.31.0': "YXdlYXNzaXN0";
11
13
  };
12
14
  export declare const nativeFeaturesFromVersion: NativeFeaturesFromVersion;
15
+ export declare const DEEP_LINK_PATTERN: RegExp;
package/constants.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.nativeFeaturesFromVersion = exports.versionToIosAppId = exports.PREVIOUS_NATIVE_NAVIGATION_AND_TITLE_STATE_STORAGE_KEY = exports.PREVIOUS_B2N_STATE_STORAGE_KEY = exports.CLOSE_WEBVIEW_SEARCH_VALUE = exports.CLOSE_WEBVIEW_SEARCH_KEY = void 0;
3
+ exports.DEEP_LINK_PATTERN = exports.nativeFeaturesFromVersion = exports.versionToIosAppId = exports.PREVIOUS_NATIVE_NAVIGATION_AND_TITLE_STATE_STORAGE_KEY = exports.PREVIOUS_B2N_STATE_STORAGE_KEY = exports.CLOSE_WEBVIEW_SEARCH_VALUE = exports.CLOSE_WEBVIEW_SEARCH_KEY = exports.ANDROID_APP_ID = exports.START_VERSION_ANDROID_ALLOW_OPEN_NEW_WEBVIEW = void 0;
4
+ exports.START_VERSION_ANDROID_ALLOW_OPEN_NEW_WEBVIEW = '10.35.0';
5
+ exports.ANDROID_APP_ID = 'YWxmYWJhbms=';
4
6
  exports.CLOSE_WEBVIEW_SEARCH_KEY = 'closeWebView';
5
7
  exports.CLOSE_WEBVIEW_SEARCH_VALUE = 'true';
6
8
  exports.PREVIOUS_B2N_STATE_STORAGE_KEY = 'previousBridgeToNativeState';
@@ -14,16 +16,15 @@ exports.versionToIosAppId = {
14
16
  exports.nativeFeaturesFromVersion = {
15
17
  android: {
16
18
  linksInBrowser: {
17
- nativeFeatureFtKey: 'linksInBrowserAndroid',
18
19
  fromVersion: '11.71.0',
19
20
  },
20
21
  geolocation: { fromVersion: '11.71.0' },
21
22
  },
22
23
  ios: {
23
24
  linksInBrowser: {
24
- nativeFeatureFtKey: 'linksInBrowserIos',
25
25
  fromVersion: '13.3.0',
26
26
  },
27
27
  geolocation: { fromVersion: '0.0.0' },
28
28
  },
29
29
  };
30
+ exports.DEEP_LINK_PATTERN = /^(\/|\x61\x6c\x66\x61\x62\x61\x6e\x6b:\/{3}dashboard\/|\x61\x6c\x66\x61\x62\x61\x6e\x6b:\/{3}|\x61\x6c\x66\x61\x62\x61\x6e\x6b:\/{2}|https:\/{2}\x6f\x6e\x6c\x69\x6e\x65\x2e\x61\x6c\x66\x61\x62\x61\x6e\x6b\x2e\x72\x75\/)/;
package/index.d.ts CHANGED
@@ -1,64 +1,2 @@
1
- import { NativeFallbacks } from './native-fallbacks';
2
- import { HandleRedirect, NativeNavigationAndTitle } from './native-navigation-and-title';
3
- import type { Environment, NativeFeatureKey, NativeFeaturesFts, NativeParams } from './types';
4
- declare type Theme = 'light' | 'dark';
5
- /**
6
- * Этот класс - абстракция для связи веб приложения с нативом и предназначен ТОЛЬКО
7
- * для использования в вебвью окружении.
8
- */
9
- export declare class BridgeToNative {
10
- nativeFeaturesFts: NativeFeaturesFts;
11
- readonly AndroidBridge: {
12
- setPageSettings: (params: string) => void;
13
- } | undefined;
14
- readonly environment: Environment;
15
- readonly nativeFallbacks: NativeFallbacks;
16
- private nextPageId;
17
- private _nativeNavigationAndTitle;
18
- private _originalWebviewParams;
19
- private _appVersion;
20
- private _iosAppId?;
21
- private _theme;
22
- private _handleRedirect;
23
- constructor(nativeFeaturesFts: NativeFeaturesFts, handleRedirect: HandleRedirect, nativeParams?: NativeParams);
24
- get theme(): Theme;
25
- get appVersion(): string;
26
- get iosAppId(): string | undefined;
27
- get nativeNavigationAndTitle(): NativeNavigationAndTitle;
28
- get originalWebviewParams(): string;
29
- /**
30
- * Метод, проверяющий, можно ли использовать нативную функциональность в текущей версии приложения.
31
- *
32
- * @param feature Название функциональности, которую нужно проверить.
33
- */
34
- canUseNativeFeature(feature: NativeFeatureKey): boolean;
35
- /**
36
- * Метод, отправляющий сигнал нативу, что нужно закрыть текущее вебвью.
37
- */
38
- closeWebview(): void;
39
- /**
40
- * Сравнивает текущую версию приложения с переданной.
41
- *
42
- * @param versionToCompare Версия, с которой нужно сравнить текущую.
43
- * @returns `true` – текущая версия больше или равняется переданной,
44
- * `false` – текущая версия ниже.
45
- */
46
- isCurrentVersionHigherOrEqual(versionToCompare: string): boolean;
47
- /**
48
- * Сохраняет текущее состояние BridgeToNative в sessionStorage.
49
- * Так же сохраняет текущее состояние nativeNavigationAndTitle.
50
- */
51
- private saveCurrentState;
52
- /**
53
- * Возвращает схему приложения в iOS окружении, на основе версии.
54
- *
55
- * @param knownIosAppId Тип iOS приложения, если он известен.
56
- * @returns Тип приложения, `undefined` для Android окружения.
57
- */
58
- private getIosAppId;
59
- /**
60
- * Восстанавливает свое предыдущее состояние из sessionStorage
61
- */
62
- private restorePreviousState;
63
- }
64
- export {};
1
+ export { BridgeToNative } from './bridge-to-native';
2
+ export { NativeParams, Theme, Environment, NativeFeatureKey, PdfType } from './types';
package/index.js CHANGED
@@ -1,144 +1,5 @@
1
1
  "use strict";
2
- /* eslint-disable no-underscore-dangle */
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  exports.BridgeToNative = void 0;
5
- const constants_1 = require("./constants");
6
- const native_fallbacks_1 = require("./native-fallbacks");
7
- const native_navigation_and_title_1 = require("./native-navigation-and-title");
8
- const utils_1 = require("./utils");
9
- /**
10
- * Этот класс - абстракция для связи веб приложения с нативом и предназначен ТОЛЬКО
11
- * для использования в вебвью окружении.
12
- */
13
- class BridgeToNative {
14
- constructor(nativeFeaturesFts = { 'linksInBrowserAndroid': true, 'linksInBrowserIos': true }, handleRedirect, nativeParams) {
15
- this.nativeFeaturesFts = nativeFeaturesFts;
16
- // Webview, запущенное в Android окружении имеет объект `Android` в window.
17
- this.AndroidBridge = window.Android;
18
- this.environment = this.AndroidBridge ? 'android' : 'ios';
19
- const previousState = !!sessionStorage.getItem(constants_1.PREVIOUS_B2N_STATE_STORAGE_KEY);
20
- if (previousState) {
21
- this.restorePreviousState();
22
- this.nativeFallbacks = new native_fallbacks_1.NativeFallbacks(this);
23
- return;
24
- }
25
- this._appVersion =
26
- nativeParams && (0, utils_1.isValidVersionFormat)(nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.appVersion)
27
- ? nativeParams.appVersion
28
- : '0.0.0';
29
- this._iosAppId = this.getIosAppId(nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.iosAppId);
30
- this._theme = (nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.theme) === 'dark' ? 'dark' : 'light';
31
- this._originalWebviewParams = (nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.originalWebviewParams) || '';
32
- this._nativeNavigationAndTitle = new native_navigation_and_title_1.NativeNavigationAndTitle(this, nativeParams ? nativeParams.nextPageId : null, nativeParams === null || nativeParams === void 0 ? void 0 : nativeParams.title, handleRedirect);
33
- this._handleRedirect = handleRedirect;
34
- this.nextPageId = nativeParams ? nativeParams.nextPageId : null;
35
- this.nativeFallbacks = new native_fallbacks_1.NativeFallbacks(this);
36
- }
37
- get theme() {
38
- return this._theme;
39
- }
40
- get appVersion() {
41
- return this._appVersion;
42
- }
43
- get iosAppId() {
44
- return this._iosAppId;
45
- }
46
- get nativeNavigationAndTitle() {
47
- return this._nativeNavigationAndTitle;
48
- }
49
- get originalWebviewParams() {
50
- return this._originalWebviewParams;
51
- }
52
- /**
53
- * Метод, проверяющий, можно ли использовать нативную функциональность в текущей версии приложения.
54
- *
55
- * @param feature Название функциональности, которую нужно проверить.
56
- */
57
- canUseNativeFeature(feature) {
58
- const { nativeFeatureFtKey, fromVersion } = constants_1.nativeFeaturesFromVersion[this.environment][feature];
59
- if (nativeFeatureFtKey && !this.nativeFeaturesFts[nativeFeatureFtKey]) {
60
- return false;
61
- }
62
- return this.isCurrentVersionHigherOrEqual(fromVersion);
63
- }
64
- /**
65
- * Метод, отправляющий сигнал нативу, что нужно закрыть текущее вебвью.
66
- */
67
- // eslint-disable-next-line class-methods-use-this
68
- closeWebview() {
69
- const originalPageUrl = new URL(window.location.href);
70
- originalPageUrl.searchParams.set(constants_1.CLOSE_WEBVIEW_SEARCH_KEY, constants_1.CLOSE_WEBVIEW_SEARCH_VALUE);
71
- window.location.href = originalPageUrl.toString();
72
- }
73
- /**
74
- * Сравнивает текущую версию приложения с переданной.
75
- *
76
- * @param versionToCompare Версия, с которой нужно сравнить текущую.
77
- * @returns `true` – текущая версия больше или равняется переданной,
78
- * `false` – текущая версия ниже.
79
- */
80
- isCurrentVersionHigherOrEqual(versionToCompare) {
81
- if (!(0, utils_1.isValidVersionFormat)(versionToCompare)) {
82
- return false;
83
- }
84
- const matchPattern = /(\d+)\.(\d+)\.(\d+)/;
85
- const [, ...appVersionComponents] = this._appVersion.match(matchPattern); // Формат версии проверен в конструкторе, можно смело убирать `null` из типа.
86
- const [, ...versionToCompareComponents] = versionToCompare.match(matchPattern);
87
- for (let i = 0; i < appVersionComponents.length; i++) {
88
- if (appVersionComponents[i] !== versionToCompareComponents[i]) {
89
- return appVersionComponents[i] >= versionToCompareComponents[i];
90
- }
91
- }
92
- return true;
93
- }
94
- /**
95
- * Сохраняет текущее состояние BridgeToNative в sessionStorage.
96
- * Так же сохраняет текущее состояние nativeNavigationAndTitle.
97
- */
98
- saveCurrentState() {
99
- // В nativeNavigationAndTitle этот метод отмечен модификатором доступа private дабы не торчал наружу, но тут его нужно вызвать
100
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
101
- // @ts-ignore
102
- this._nativeNavigationAndTitle.saveCurrentState();
103
- const currentState = {
104
- appVersion: this._appVersion,
105
- theme: this._theme,
106
- nextPageId: this.nextPageId,
107
- originalWebviewParams: this._originalWebviewParams || '',
108
- iosAppId: this._iosAppId,
109
- };
110
- sessionStorage.setItem(constants_1.PREVIOUS_B2N_STATE_STORAGE_KEY, JSON.stringify(currentState));
111
- }
112
- /**
113
- * Возвращает схему приложения в iOS окружении, на основе версии.
114
- *
115
- * @param knownIosAppId Тип iOS приложения, если он известен.
116
- * @returns Тип приложения, `undefined` для Android окружения.
117
- */
118
- getIosAppId(knownIosAppId) {
119
- if (this.environment !== 'ios') {
120
- return undefined;
121
- }
122
- if (knownIosAppId) {
123
- return knownIosAppId;
124
- }
125
- const keys = Object.keys(constants_1.versionToIosAppId);
126
- const rightKey = [...keys].reverse().find((version) => this.isCurrentVersionHigherOrEqual(version)) ||
127
- keys[0];
128
- return atob(constants_1.versionToIosAppId[rightKey]);
129
- }
130
- /**
131
- * Восстанавливает свое предыдущее состояние из sessionStorage
132
- */
133
- restorePreviousState() {
134
- const previousState = JSON.parse(sessionStorage.getItem(constants_1.PREVIOUS_B2N_STATE_STORAGE_KEY) || '');
135
- this._appVersion = previousState.appVersion;
136
- this._iosAppId = previousState.iosAppId;
137
- this._theme = previousState.theme;
138
- this._originalWebviewParams = previousState.originalWebviewParams;
139
- this.nextPageId = previousState.nextPageId;
140
- this._nativeNavigationAndTitle = new native_navigation_and_title_1.NativeNavigationAndTitle(this, previousState.nextPageId, '', this._handleRedirect);
141
- sessionStorage.removeItem(constants_1.PREVIOUS_B2N_STATE_STORAGE_KEY);
142
- }
143
- }
144
- exports.BridgeToNative = BridgeToNative;
4
+ var bridge_to_native_1 = require("./bridge-to-native");
5
+ Object.defineProperty(exports, "BridgeToNative", { enumerable: true, get: function () { return bridge_to_native_1.BridgeToNative; } });
@@ -1,5 +1,5 @@
1
- import type { BridgeToNative } from '.';
2
- import { PdfType } from './types';
1
+ import { ExternalNavigationOptions, PdfType } from './types';
2
+ import type { BridgeToNative } from './bridge-to-native';
3
3
  /**
4
4
  * Класс содержит реализацию обходных путей для веб-фич, которые не работают в нативном-вебвью.
5
5
  */
@@ -21,7 +21,7 @@ export declare class NativeFallbacks {
21
21
  * ```
22
22
  * В разных OS и разных версиях приложения, открытие ресурса будет работать по-разному:
23
23
  *
24
- * - Если текущая версия приложения может открыть ссылку в браузере,
24
+ * - Если текущая версия приложения может открыть ссылку в браузере и не задан параметр `forceOpenInWebview`,
25
25
  * обогащаем URL специальным query-параметром (`target=_blank` в приложении не работает).
26
26
  * - Если это iOS, меняем URL на диплинк, который откроет ссылку в новом вебвью, поверх текущего.
27
27
  * К первому-вебвью, пользователь вернётся, когда закроет второе вебвью с внешним ресурсом.
@@ -29,11 +29,14 @@ export declare class NativeFallbacks {
29
29
  * навигации с приложением. Это «фолбэк-сценарий» с плохим UX (сайт полностью выпадает из истории), но другого способа нет.
30
30
  *
31
31
  * @param link Строка - валидный урл.
32
- * @param onClick Дополнительный обработчик на клик, например, для отправки метрики.
32
+ * @param options - опции
33
+ * @param options.forceOpenInWebview Boolean - по умолчанию = false, если передать true,
34
+ * все ссылки будут открываться в рамках webview, иначе открытие по возможности будет происходить в браузере.
35
+ * @param options.onClick Дополнительный обработчик на клик, например, для отправки метрики.
33
36
  * Внимание! Не факт, что в «фолбэк-сценарии» асинхронная операция будет выполнена (метрика отправлена)!
34
37
  * @returns Пропсы для ссылки в вебвью окружении.
35
38
  */
36
- getExternalLinkProps(link: string, onClick?: () => void): {
39
+ getExternalLinkProps(link: string, options?: ExternalNavigationOptions): {
37
40
  href: string;
38
41
  onClick: (() => void) | undefined;
39
42
  };
@@ -54,6 +57,8 @@ export declare class NativeFallbacks {
54
57
  * См. описание в `getExternalLinkProps`, чтобы узнать, как выбирается способ для перехода.
55
58
  *
56
59
  * @param link Строка - валидный урл.
60
+ * @param forceOpenInWebview Boolean - по умолчанию = false, если передать true,
61
+ * все ссылки будут открываться в рамках webview, иначе открытие по возможности будет происходить в браузере.
57
62
  */
58
- visitExternalResource(link: string): void;
63
+ visitExternalResource(link: string, forceOpenInWebview?: boolean): void;
59
64
  }
@@ -24,7 +24,7 @@ class NativeFallbacks {
24
24
  * ```
25
25
  * В разных OS и разных версиях приложения, открытие ресурса будет работать по-разному:
26
26
  *
27
- * - Если текущая версия приложения может открыть ссылку в браузере,
27
+ * - Если текущая версия приложения может открыть ссылку в браузере и не задан параметр `forceOpenInWebview`,
28
28
  * обогащаем URL специальным query-параметром (`target=_blank` в приложении не работает).
29
29
  * - Если это iOS, меняем URL на диплинк, который откроет ссылку в новом вебвью, поверх текущего.
30
30
  * К первому-вебвью, пользователь вернётся, когда закроет второе вебвью с внешним ресурсом.
@@ -32,21 +32,26 @@ class NativeFallbacks {
32
32
  * навигации с приложением. Это «фолбэк-сценарий» с плохим UX (сайт полностью выпадает из истории), но другого способа нет.
33
33
  *
34
34
  * @param link Строка - валидный урл.
35
- * @param onClick Дополнительный обработчик на клик, например, для отправки метрики.
35
+ * @param options - опции
36
+ * @param options.forceOpenInWebview Boolean - по умолчанию = false, если передать true,
37
+ * все ссылки будут открываться в рамках webview, иначе открытие по возможности будет происходить в браузере.
38
+ * @param options.onClick Дополнительный обработчик на клик, например, для отправки метрики.
36
39
  * Внимание! Не факт, что в «фолбэк-сценарии» асинхронная операция будет выполнена (метрика отправлена)!
37
40
  * @returns Пропсы для ссылки в вебвью окружении.
38
41
  */
39
- getExternalLinkProps(link, onClick) {
40
- const { iosAppId } = this.b2n;
42
+ getExternalLinkProps(link, options = {}) {
43
+ const { onClick, forceOpenInWebview } = options;
44
+ const { iosAppId, environment, appVersion, checkAndroidAllowOpenInNewWebview } = this.b2n;
41
45
  const url = (0, utils_1.getUrlInstance)(link);
42
- if (this.b2n.canUseNativeFeature('linksInBrowser')) {
46
+ const appId = (0, utils_1.getAppId)(environment, iosAppId);
47
+ if (!forceOpenInWebview && this.b2n.canUseNativeFeature('linksInBrowser')) {
43
48
  url.searchParams.append('openInBrowser', 'true');
44
49
  return { href: url.href, onClick };
45
50
  }
46
- if (iosAppId) {
51
+ if (iosAppId || checkAndroidAllowOpenInNewWebview()) {
47
52
  return {
48
- href: `${iosAppId}://webFeature?type=recommendation&url=${encodeURIComponent(url.href)}`,
49
- onClick,
53
+ href: `${appId}://webFeature?type=recommendation&url=${encodeURIComponent(url.href)}`,
54
+ onClick: options === null || options === void 0 ? void 0 : options.onClick,
50
55
  };
51
56
  }
52
57
  return {
@@ -95,17 +100,20 @@ class NativeFallbacks {
95
100
  * См. описание в `getExternalLinkProps`, чтобы узнать, как выбирается способ для перехода.
96
101
  *
97
102
  * @param link Строка - валидный урл.
103
+ * @param forceOpenInWebview Boolean - по умолчанию = false, если передать true,
104
+ * все ссылки будут открываться в рамках webview, иначе открытие по возможности будет происходить в браузере.
98
105
  */
99
- visitExternalResource(link) {
106
+ visitExternalResource(link, forceOpenInWebview = false) {
100
107
  var _a;
101
- const { iosAppId } = this.b2n;
108
+ const { iosAppId, appVersion, environment, checkAndroidAllowOpenInNewWebview } = this.b2n;
102
109
  const url = (0, utils_1.getUrlInstance)(link);
103
- if (this.b2n.canUseNativeFeature('linksInBrowser')) {
110
+ const appId = (0, utils_1.getAppId)(environment, iosAppId);
111
+ if (!forceOpenInWebview && this.b2n.canUseNativeFeature('linksInBrowser')) {
104
112
  url.searchParams.append('openInBrowser', 'true');
105
113
  window.location.replace(url.href);
106
114
  }
107
- else if (iosAppId) {
108
- window.location.replace(`${iosAppId}://webFeature?type=recommendation&url=${encodeURIComponent(url.href)}`);
115
+ else if (iosAppId || checkAndroidAllowOpenInNewWebview()) {
116
+ window.location.replace(`${appId}://webFeature?type=recommendation&url=${encodeURIComponent(url.href)}`);
109
117
  }
110
118
  else {
111
119
  (_a = this.b2n.nativeNavigationAndTitle) === null || _a === void 0 ? void 0 : _a.setInitialView('');
@@ -1,15 +1,14 @@
1
- import { BridgeToNative } from '.';
2
- export declare type HandleRedirect = (appName: string, path?: string, params?: Record<string, string>) => void;
1
+ import { HandleRedirect } from './types';
2
+ import { BridgeToNative } from './bridge-to-native';
3
3
  /**
4
- * Класс, отвечающий за взаимодействие с нативными элементами в приложении – заголовком
5
- * и нативной кнопкой назад.
4
+ * Класс, отвечающий за взаимодействие с нативными элементами в приложении – заголовком и нативной кнопкой назад.
6
5
  */
7
6
  export declare class NativeNavigationAndTitle {
8
7
  private b2n;
9
8
  private nativeHistoryStack;
10
9
  private numOfBackSteps;
11
10
  private lastSetPageSettingsParams;
12
- private handleWindowRedirect;
11
+ private readonly _handleWindowRedirect;
13
12
  constructor(b2n: BridgeToNative, pageId: number | null, initialNativeTitle: string | undefined, handleWindowRedirect: HandleRedirect);
14
13
  /**
15
14
  * Метод, вызывающий `history.back()` или закрывающий вебвью, если нет записей
@@ -18,15 +17,15 @@ export declare class NativeNavigationAndTitle {
18
17
  goBack(): void;
19
18
  /**
20
19
  * Метод, вызывающий history.go(-колл. шагов назад) и модифицирует внутреннее
21
- * состояние, чтобы в дальнейшем зарегистририровать этот переход в приложении.
20
+ * состояние, чтобы в дальнейшем зарегистрировать этот переход в приложении.
22
21
  *
23
22
  * @param stepsNumber Количество шагов назад.
24
23
  * Возможно передача как положительного, так и отрицательного числа.
25
24
  * 0 будет проигнорирован.
26
- * @param autocloseWebview Флаг – закрывать ли вебвью автоматически,
27
- * если переданное кол-во шагов будет больше, чем записей в истории.
25
+ * @param autoCloseWebview Флаг – закрывать ли вебвью автоматически,
26
+ * если переданное кол-во шагов будет больше чем записей в истории.
28
27
  */
29
- goBackAFewSteps(stepsNumber: number, autocloseWebview?: boolean): void;
28
+ goBackAFewSteps(stepsNumber: number, autoCloseWebview?: boolean): void;
30
29
  /**
31
30
  * @param path Путь для перехода на функциональность внутри приложения.
32
31
  */
@@ -42,7 +41,7 @@ export declare class NativeNavigationAndTitle {
42
41
  handleRedirect(pageTitle: string, appName: string, path?: string, params?: Record<string, string>): void;
43
42
  /**
44
43
  * Информирует натив, что веб находится на первом экране (сбрасывает историю переходов, не влияя на браузерную
45
- * историю), а значит следующее нажатие на кнопку "Назад" в нативне закроет вебвью.
44
+ * историю), а значит следующее нажатие на кнопку "Назад" в нативе закроет вебвью.
46
45
  *
47
46
  * @param pageTitle Заголовок, который нужно отрисовать в нативе.
48
47
  */
@@ -54,24 +53,28 @@ export declare class NativeNavigationAndTitle {
54
53
  */
55
54
  setTitle(pageTitle: string): void;
56
55
  /**
57
- * Метод для открытия второго web приложения в рамках
58
- * одной вебвью сессии
59
- * сохраняет все текущее состояние текущего экземпляра bridgeToAm и AmNavigationAndTitle в sessionStorage, а
56
+ * Метод для открытия второго web приложения в рамках одной вебвью сессии.
57
+ * Сохраняет все текущее состояние текущего экземпляра bridgeToAm и AmNavigationAndTitle в sessionStorage, а
60
58
  * так же наполняет url необходимыми query параметрами. Работает только в Android окружении.
61
59
  * В IOS окружении будет открыто новое webview поверх текущего.
62
- * @param url адрес второго web приложения к которому перед переходом на него будут добавлены
60
+ *
61
+ * @param url адрес второго web приложения, к которому перед переходом на него будут добавлены
63
62
  * все initial query параметры от натива и параметр nextPageId (Android)
64
63
  */
65
64
  navigateInsideASharedSession(url: string): void;
66
65
  /**
67
- * ПОКА НЕ ИСПОЛЬЗОВАТЬ В ПРОДЕ (МЕТОД НЕ РАБОТАЕТ КОРРЕКТНО НА ANDROID)
68
- * НА ANDROID ПРИ ПЕРЕЗАГРУЗКЕ СТРАНИЦЫ В ИСТРИЮ ЛОЖИТСЯ + ЕЩЕ ОДИН ЛИШНИЙ ЭЛЕМЕНТ
69
- * Данный метод будет дорабатываться отдельной задачей
70
66
  * Безопасный способ для перезагрузки страницы.
71
- * Производит предварительное сохранение текущего состояния
72
- * BridgeToNative и NativeNavigationAndTitle перед вызовом location.reload()
73
67
  */
74
- reloadPage(): void;
68
+ pseudoReloadPage(): void;
69
+ /**
70
+ * Вызывает обработчик deeplinks в нативе (АМ) и передает туда переданный deeplink.
71
+ * На Android текущее webview будет закрыто из-за технических особенностей.
72
+ * На IOS нативная фича открывается в следующем по стеку экране и при выходе из нее пользователь вернется обратно в webview.
73
+ * На IOS есть возможность закрыть webview перед открытием нативной фичи, передав второй параметр closeIOSWebviewBeforeCallNativeDeeplinkHandler = true
74
+ * @param deeplink диплинк на нативную АМ фичу в AM
75
+ * @param [closeIOSWebviewBeforeCallNativeDeeplinkHandler = false] закрыть текущее webview после открытия нативной фичи (применимо только для IOS на Android по техническим причинам webview всегда будет закрываться)
76
+ */
77
+ handleNativeDeeplink(deeplink: string, closeIOSWebviewBeforeCallNativeDeeplinkHandler?: boolean): void;
75
78
  /**
76
79
  * Метод для сохранения текущего состояния NativeNavigationAndTitle в sessionStorage.
77
80
  */
@@ -136,7 +139,7 @@ export declare class NativeNavigationAndTitle {
136
139
  * рамках одной вебвью сессии
137
140
  * @param url - url иного веб приложения
138
141
  * @return подготовленная согласно контракту ссылка на иное веб приложение с initial query
139
- * параметрами от нативе, а так же nextPageId
142
+ * параметрами от натива, а так же nextPageId.
140
143
  */
141
144
  private prepareExternalLinkBeforeOpen;
142
145
  }
@@ -4,8 +4,7 @@ exports.NativeNavigationAndTitle = void 0;
4
4
  const constants_1 = require("./constants");
5
5
  const utils_1 = require("./utils");
6
6
  /**
7
- * Класс, отвечающий за взаимодействие с нативными элементами в приложении – заголовком
8
- * и нативной кнопкой назад.
7
+ * Класс, отвечающий за взаимодействие с нативными элементами в приложении – заголовком и нативной кнопкой назад.
9
8
  */
10
9
  class NativeNavigationAndTitle {
11
10
  constructor(b2n, pageId, initialNativeTitle = '', handleWindowRedirect) {
@@ -16,7 +15,7 @@ class NativeNavigationAndTitle {
16
15
  // Просто, чтобы не слать одинаковые сигналы в приложение.
17
16
  this.lastSetPageSettingsParams = '';
18
17
  this.handleBack = this.handleBack.bind(this);
19
- this.handleWindowRedirect = handleWindowRedirect;
18
+ this._handleWindowRedirect = handleWindowRedirect;
20
19
  const previousState = !!sessionStorage.getItem(constants_1.PREVIOUS_NATIVE_NAVIGATION_AND_TITLE_STATE_STORAGE_KEY);
21
20
  if (pageId) {
22
21
  this.supportSharedSession(pageId, initialNativeTitle);
@@ -37,22 +36,22 @@ class NativeNavigationAndTitle {
37
36
  }
38
37
  /**
39
38
  * Метод, вызывающий history.go(-колл. шагов назад) и модифицирует внутреннее
40
- * состояние, чтобы в дальнейшем зарегистририровать этот переход в приложении.
39
+ * состояние, чтобы в дальнейшем зарегистрировать этот переход в приложении.
41
40
  *
42
41
  * @param stepsNumber Количество шагов назад.
43
42
  * Возможно передача как положительного, так и отрицательного числа.
44
43
  * 0 будет проигнорирован.
45
- * @param autocloseWebview Флаг – закрывать ли вебвью автоматически,
46
- * если переданное кол-во шагов будет больше, чем записей в истории.
44
+ * @param autoCloseWebview Флаг – закрывать ли вебвью автоматически,
45
+ * если переданное кол-во шагов будет больше чем записей в истории.
47
46
  */
48
- goBackAFewSteps(stepsNumber, autocloseWebview = false) {
47
+ goBackAFewSteps(stepsNumber, autoCloseWebview = false) {
49
48
  if (!stepsNumber) {
50
49
  return;
51
50
  }
52
51
  const stepsToBack = Math.abs(stepsNumber);
53
52
  const maxStepsToBack = this.nativeHistoryStack.length - 1;
54
53
  if (stepsToBack > maxStepsToBack) {
55
- if (autocloseWebview) {
54
+ if (autoCloseWebview) {
56
55
  this.b2n.closeWebview();
57
56
  return;
58
57
  }
@@ -70,11 +69,11 @@ class NativeNavigationAndTitle {
70
69
  */
71
70
  handleRedirect(pageTitleOrPath, appName, path, params) {
72
71
  if (appName) {
73
- this.handleWindowRedirect(appName, path, params);
72
+ this._handleWindowRedirect(appName, path, params);
74
73
  }
75
74
  else {
76
75
  const { appName: extractedAppName, path: extractedPath, query: extractedQuery, } = (0, utils_1.extractAppNameRouteAndQuery)(pageTitleOrPath);
77
- this.handleWindowRedirect(extractedAppName, extractedPath, extractedQuery);
76
+ this._handleWindowRedirect(extractedAppName, extractedPath, extractedQuery);
78
77
  }
79
78
  const title = appName ? pageTitleOrPath : '';
80
79
  this.nativeHistoryStack.push(title);
@@ -82,7 +81,7 @@ class NativeNavigationAndTitle {
82
81
  }
83
82
  /**
84
83
  * Информирует натив, что веб находится на первом экране (сбрасывает историю переходов, не влияя на браузерную
85
- * историю), а значит следующее нажатие на кнопку "Назад" в нативне закроет вебвью.
84
+ * историю), а значит следующее нажатие на кнопку "Назад" в нативе закроет вебвью.
86
85
  *
87
86
  * @param pageTitle Заголовок, который нужно отрисовать в нативе.
88
87
  */
@@ -101,17 +100,18 @@ class NativeNavigationAndTitle {
101
100
  this.syncHistoryWithNative(pageTitle, 'title-replacing');
102
101
  }
103
102
  /**
104
- * Метод для открытия второго web приложения в рамках
105
- * одной вебвью сессии
106
- * сохраняет все текущее состояние текущего экземпляра bridgeToAm и AmNavigationAndTitle в sessionStorage, а
103
+ * Метод для открытия второго web приложения в рамках одной вебвью сессии.
104
+ * Сохраняет все текущее состояние текущего экземпляра bridgeToAm и AmNavigationAndTitle в sessionStorage, а
107
105
  * так же наполняет url необходимыми query параметрами. Работает только в Android окружении.
108
106
  * В IOS окружении будет открыто новое webview поверх текущего.
109
- * @param url адрес второго web приложения к которому перед переходом на него будут добавлены
107
+ *
108
+ * @param url адрес второго web приложения, к которому перед переходом на него будут добавлены
110
109
  * все initial query параметры от натива и параметр nextPageId (Android)
111
110
  */
112
111
  navigateInsideASharedSession(url) {
113
112
  if (this.b2n.environment === 'ios') {
114
- this.b2n.nativeFallbacks.visitExternalResource(url);
113
+ const nativeDeeplink = `/webFeature?type=recommendation&url=${encodeURIComponent(url)}`;
114
+ this.handleNativeDeeplink(nativeDeeplink);
115
115
  return;
116
116
  }
117
117
  // В b2n этот метод отмечен модификатором доступа private, но тут его нужно вызвать
@@ -121,19 +121,36 @@ class NativeNavigationAndTitle {
121
121
  window.location.assign(this.prepareExternalLinkBeforeOpen(url));
122
122
  }
123
123
  /**
124
- * ПОКА НЕ ИСПОЛЬЗОВАТЬ В ПРОДЕ (МЕТОД НЕ РАБОТАЕТ КОРРЕКТНО НА ANDROID)
125
- * НА ANDROID ПРИ ПЕРЕЗАГРУЗКЕ СТРАНИЦЫ В ИСТРИЮ ЛОЖИТСЯ + ЕЩЕ ОДИН ЛИШНИЙ ЭЛЕМЕНТ
126
- * Данный метод будет дорабатываться отдельной задачей
127
124
  * Безопасный способ для перезагрузки страницы.
128
- * Производит предварительное сохранение текущего состояния
129
- * BridgeToNative и NativeNavigationAndTitle перед вызовом location.reload()
130
125
  */
131
- reloadPage() {
126
+ pseudoReloadPage() {
132
127
  // В b2n этот метод отмечен модификатором доступа private, но тут его нужно вызвать
133
128
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
134
129
  // @ts-ignore
135
- this.b2n.saveCurrentState();
136
- window.location.reload();
130
+ this.handleRedirect(this.b2n._blankPagePath);
131
+ this.goBack();
132
+ }
133
+ /**
134
+ * Вызывает обработчик deeplinks в нативе (АМ) и передает туда переданный deeplink.
135
+ * На Android текущее webview будет закрыто из-за технических особенностей.
136
+ * На IOS нативная фича открывается в следующем по стеку экране и при выходе из нее пользователь вернется обратно в webview.
137
+ * На IOS есть возможность закрыть webview перед открытием нативной фичи, передав второй параметр closeIOSWebviewBeforeCallNativeDeeplinkHandler = true
138
+ * @param deeplink диплинк на нативную АМ фичу в AM
139
+ * @param [closeIOSWebviewBeforeCallNativeDeeplinkHandler = false] закрыть текущее webview после открытия нативной фичи (применимо только для IOS на Android по техническим причинам webview всегда будет закрываться)
140
+ */
141
+ handleNativeDeeplink(deeplink, closeIOSWebviewBeforeCallNativeDeeplinkHandler = false) {
142
+ const clearedDeeplinkPath = deeplink.replace(constants_1.DEEP_LINK_PATTERN, '');
143
+ if (this.b2n.environment === 'ios') {
144
+ if (closeIOSWebviewBeforeCallNativeDeeplinkHandler) {
145
+ this.b2n.closeWebview();
146
+ setTimeout(() => window.location.replace(`${this.b2n.iosAppId}://${clearedDeeplinkPath}`), 0);
147
+ return;
148
+ }
149
+ window.location.replace(`${this.b2n.iosAppId}://${clearedDeeplinkPath}`);
150
+ }
151
+ else {
152
+ window.location.replace(`alfabank://${clearedDeeplinkPath}`);
153
+ }
137
154
  }
138
155
  /**
139
156
  * Метод для сохранения текущего состояния NativeNavigationAndTitle в sessionStorage.
@@ -191,7 +208,7 @@ class NativeNavigationAndTitle {
191
208
  getNativePageIdForNavigation() {
192
209
  const stackSize = this.nativeHistoryStack.length;
193
210
  // Нажимая на кнопку назад, можно дойти до "первой" страницы,
194
- // в iOS для "первой" страницы не нужно слать `pageId`
211
+ // в iOS для "первой" страницы не нужно слать `pageId`.
195
212
  return this.b2n.environment === 'ios' && stackSize <= 1 ? null : stackSize;
196
213
  }
197
214
  /**
@@ -297,7 +314,7 @@ class NativeNavigationAndTitle {
297
314
  * рамках одной вебвью сессии
298
315
  * @param url - url иного веб приложения
299
316
  * @return подготовленная согласно контракту ссылка на иное веб приложение с initial query
300
- * параметрами от нативе, а так же nextPageId
317
+ * параметрами от натива, а так же nextPageId.
301
318
  */
302
319
  prepareExternalLinkBeforeOpen(url) {
303
320
  const currentPageId = this.nativeHistoryStack.length;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "license": "UNLICENSED",
3
3
  "name": "@alfalab/bridge-to-native",
4
- "version": "0.0.7",
4
+ "version": "0.0.9",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/core-ds/bridge-to-native.git"
@@ -15,7 +15,7 @@
15
15
  "changelog": "bash bin/fill-changelog-file-and-notify-github.sh",
16
16
  "compile": "yarn compile:clean && yarn compile:ts && yarn compile:copy-resources",
17
17
  "compile:copy-package-json": "shx cp package.json .publish/package.json",
18
- "compile:copy-resources": "yarn copyfiles -e \"**/*.{[jt]s*(x),snap}\" -e \"**/*.json\" -e \"src/mock/**/*\" -u 1 \"src/**/*\" .publish",
18
+ "compile:copy-resources": "yarn copyfiles -e \"**/*.{[jt]s*(x),snap}\" -e \"**/*.json\" -u 1 \"src/**/*\" .publish",
19
19
  "compile:clean": "shx rm -rf .publish",
20
20
  "compile:ts": "tsc --project tsconfig.build.json",
21
21
  "lint:scripts": "eslint \"**/*.{js,jsx,ts,tsx}\" --ext .js,.jsx,.ts,.tsx",
@@ -67,13 +67,15 @@
67
67
  ],
68
68
  "coveragePathIgnorePatterns": [
69
69
  "/node_modules/",
70
- "/test/"
70
+ "/test/",
71
+ "/src/index.ts"
71
72
  ],
72
73
  "transformIgnorePatterns": [
73
74
  "node_modules/(?!(uuid)/)"
74
75
  ],
75
76
  "testPathIgnorePatterns": [
76
- "/node_modules/"
77
+ "/node_modules/",
78
+ "/test/mock"
77
79
  ],
78
80
  "reporters": [
79
81
  "jest-junit",
package/types.d.ts CHANGED
@@ -6,11 +6,8 @@ export declare type NativeParams = {
6
6
  nextPageId: number | null;
7
7
  originalWebviewParams: string;
8
8
  };
9
- declare type NativeFeatureFtKey = 'linksInBrowserAndroid' | 'linksInBrowserIos';
10
- export declare type NativeFeaturesFts = Record<NativeFeatureFtKey, boolean>;
11
9
  export declare type NativeFeatureKey = 'geolocation' | 'linksInBrowser';
12
10
  declare type NativeFeaturesParams = Readonly<Record<NativeFeatureKey, {
13
- nativeFeatureFtKey?: NativeFeatureFtKey;
14
11
  fromVersion: string;
15
12
  }>>;
16
13
  export declare type NativeFeaturesFromVersion = Readonly<{
@@ -32,4 +29,11 @@ export declare type PreviousNativeNavigationAndTitleState = {
32
29
  nativeHistoryStack: string[];
33
30
  title: string;
34
31
  };
32
+ export declare type SyncPurpose = 'initialization' | 'navigation' | 'title-replacing';
33
+ export declare type HandleRedirect = (appName: string, path?: string, params?: Record<string, string>) => void;
34
+ export declare type Theme = 'light' | 'dark';
35
+ export declare type ExternalNavigationOptions = {
36
+ onClick?: () => void;
37
+ forceOpenInWebview?: boolean;
38
+ };
35
39
  export {};
package/utils.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { Environment } from './types';
1
2
  /**
2
3
  * Разделяет веб ссылку на компоненты
3
4
  * @param route внутренний путь для навигации
@@ -19,3 +20,4 @@ export declare const getUrlInstance: (link: string) => URL;
19
20
  * @returns Правильный формат или нет.
20
21
  */
21
22
  export declare const isValidVersionFormat: (version?: string | undefined) => boolean;
23
+ export declare const getAppId: (environment: Environment, iosAppId?: string | undefined) => string | null;
package/utils.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isValidVersionFormat = exports.getUrlInstance = exports.extractAppNameRouteAndQuery = void 0;
3
+ exports.getAppId = exports.isValidVersionFormat = exports.getUrlInstance = exports.extractAppNameRouteAndQuery = void 0;
4
+ const constants_1 = require("./constants");
4
5
  /**
5
6
  * Разделяет веб ссылку на компоненты
6
7
  * @param route внутренний путь для навигации
@@ -57,3 +58,13 @@ const isValidVersionFormat = (version) => {
57
58
  return versionPattern.test(version);
58
59
  };
59
60
  exports.isValidVersionFormat = isValidVersionFormat;
61
+ const getAppId = (environment, iosAppId) => {
62
+ if (environment === 'android') {
63
+ return atob(constants_1.ANDROID_APP_ID);
64
+ }
65
+ if (environment === 'ios' && iosAppId && typeof iosAppId === 'string') {
66
+ return iosAppId;
67
+ }
68
+ return null;
69
+ };
70
+ exports.getAppId = getAppId;