@alfalab/bridge-to-native 0.0.7-beta-11d7ff7 → 0.0.7-beta-5df3687

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/constants.d.ts CHANGED
@@ -10,3 +10,4 @@ export declare const versionToIosAppId: {
10
10
  readonly '12.31.0': "YXdlYXNzaXN0";
11
11
  };
12
12
  export declare const nativeFeaturesFromVersion: NativeFeaturesFromVersion;
13
+ export declare const DEEP_LINK_PATTERN: RegExp;
package/constants.js CHANGED
@@ -1,6 +1,6 @@
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 = void 0;
4
4
  exports.CLOSE_WEBVIEW_SEARCH_KEY = 'closeWebView';
5
5
  exports.CLOSE_WEBVIEW_SEARCH_VALUE = 'true';
6
6
  exports.PREVIOUS_B2N_STATE_STORAGE_KEY = 'previousBridgeToNativeState';
@@ -25,3 +25,4 @@ exports.nativeFeaturesFromVersion = {
25
25
  geolocation: { fromVersion: '0.0.0' },
26
26
  },
27
27
  };
28
+ 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,6 +1,6 @@
1
1
  import { NativeFallbacks } from './native-fallbacks';
2
- import { HandleRedirect, NativeNavigationAndTitle } from './native-navigation-and-title';
3
- import type { Environment, NativeFeatureKey, NativeParams } from './types';
2
+ import { NativeNavigationAndTitle } from './native-navigation-and-title';
3
+ import type { Environment, HandleRedirect, NativeFeatureKey, NativeParams } from './types';
4
4
  declare type Theme = 'light' | 'dark';
5
5
  /**
6
6
  * Этот класс — абстракция для связи веб приложения с нативом и предназначен ТОЛЬКО
@@ -1,15 +1,14 @@
1
+ import { HandleRedirect } from './types';
1
2
  import { BridgeToNative } from '.';
2
- export declare type HandleRedirect = (appName: string, path?: string, params?: Record<string, string>) => void;
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 readonly handleWindowRedirect;
11
+ private readonly _handleWindowRedirect;
13
12
  constructor(b2n: BridgeToNative, pageId: number | null, initialNativeTitle: string | undefined, handleWindowRedirect: HandleRedirect);
14
13
  /**
15
14
  * Метод, вызывающий `history.back()` или закрывающий вебвью, если нет записей
@@ -67,6 +66,15 @@ export declare class NativeNavigationAndTitle {
67
66
  * Безопасный способ для перезагрузки страницы.
68
67
  */
69
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;
70
78
  /**
71
79
  * Метод для сохранения текущего состояния NativeNavigationAndTitle в sessionStorage.
72
80
  */
@@ -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);
@@ -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);
@@ -111,7 +110,8 @@ class NativeNavigationAndTitle {
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, но тут его нужно вызвать
@@ -130,6 +130,28 @@ class NativeNavigationAndTitle {
130
130
  this.handleRedirect(this.b2n._blankPagePath);
131
131
  this.goBack();
132
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
+ }
154
+ }
133
155
  /**
134
156
  * Метод для сохранения текущего состояния NativeNavigationAndTitle в sessionStorage.
135
157
  */
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-beta-11d7ff7",
4
+ "version": "0.0.7-beta-5df3687",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/core-ds/bridge-to-native.git"
package/types.d.ts CHANGED
@@ -29,4 +29,6 @@ export declare type PreviousNativeNavigationAndTitleState = {
29
29
  nativeHistoryStack: string[];
30
30
  title: string;
31
31
  };
32
+ export declare type SyncPurpose = 'initialization' | 'navigation' | 'title-replacing';
33
+ export declare type HandleRedirect = (appName: string, path?: string, params?: Record<string, string>) => void;
32
34
  export {};