@dynamic-labs/react-native-extension 4.11.1 → 4.12.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.
Files changed (3) hide show
  1. package/index.cjs +33 -2
  2. package/index.js +33 -2
  3. package/package.json +5 -5
package/index.cjs CHANGED
@@ -6,15 +6,15 @@ var assertPackageVersion = require('@dynamic-labs/assert-package-version');
6
6
  var reactNative = require('react-native');
7
7
  var react = require('react');
8
8
  var reactNativeWebview = require('react-native-webview');
9
- var messageTransport = require('@dynamic-labs/message-transport');
10
9
  var logger$1 = require('@dynamic-labs/logger');
10
+ var messageTransport = require('@dynamic-labs/message-transport');
11
11
  var jsxRuntime = require('react/jsx-runtime');
12
12
  var reactNativePasskeyStamper = require('@turnkey/react-native-passkey-stamper');
13
13
  var expoLinking = require('expo-linking');
14
14
  var expoWebBrowser = require('expo-web-browser');
15
15
  var expoSecureStore = require('expo-secure-store');
16
16
 
17
- var version = "4.11.1";
17
+ var version = "4.12.0";
18
18
 
19
19
  function _extends() {
20
20
  return _extends = Object.assign ? Object.assign.bind() : function (n) {
@@ -136,6 +136,15 @@ const WebView = ({
136
136
  onMessageHandler
137
137
  } = useMessageTransportWebViewBridge(core, webViewRef);
138
138
  const containerStyles = [styles['container'], visible ? styles.show : styles.hide];
139
+ /**
140
+ * Block the message transport when the webview is unmounted
141
+ */
142
+ react.useEffect(() => () => {
143
+ logger.warn(unmountWebViewWarningMessage);
144
+ core.messageTransport.block();
145
+ },
146
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- we only care about the unmount callback
147
+ []);
139
148
  return /*#__PURE__*/jsxRuntime.jsx(reactNativeWebview.WebView, {
140
149
  ref: webViewRef,
141
150
  source: {
@@ -146,6 +155,19 @@ const WebView = ({
146
155
  onMessage: onMessageHandler,
147
156
  hideKeyboardAccessoryView: true,
148
157
  webviewDebuggingEnabled: _webviewDebuggingEnabled,
158
+ onContentProcessDidTerminate: () => {
159
+ var _a;
160
+ /**
161
+ * iOS and Android both may trigger this event when the webview
162
+ * is removed due to memory pressure.
163
+ *
164
+ * When the webview is killed by the OS, the message transport must
165
+ * be blocked to prevent the "No handlers registered" error while
166
+ * the webview is reloading
167
+ */
168
+ core.messageTransport.block();
169
+ (_a = webViewRef.current) === null || _a === void 0 ? void 0 : _a.reload();
170
+ },
149
171
  onError: () => core.initialization.error = new Error('Could not load Dynamic WebView')
150
172
  }, 'webview');
151
173
  };
@@ -153,6 +175,15 @@ const createWebView = props => {
153
175
  const WebViewWrapper = () => /*#__PURE__*/jsxRuntime.jsx(WebView, _extends({}, props));
154
176
  return WebViewWrapper;
155
177
  };
178
+ const unmountWebViewWarningMessage = `WebView unmounted.
179
+
180
+ The Dynamic WebView may malfunction if it is unmounted.
181
+
182
+ Render the WebView at the top level of your component tree to ensure it is not unmounted.
183
+
184
+ For more information, please refer to the documentation:
185
+ https://docs.dynamic.xyz/react-native/react-native-extension
186
+ `;
156
187
 
157
188
  /******************************************************************************
158
189
  Copyright (c) Microsoft Corporation.
package/index.js CHANGED
@@ -2,15 +2,15 @@ import { assertPackageVersion } from '@dynamic-labs/assert-package-version';
2
2
  import { StyleSheet, Platform } from 'react-native';
3
3
  import { useRef, useEffect, useCallback, useState } from 'react';
4
4
  import { WebView as WebView$1 } from 'react-native-webview';
5
- import { parseMessageTransportData, createRequestChannel } from '@dynamic-labs/message-transport';
6
5
  import { Logger } from '@dynamic-labs/logger';
6
+ import { parseMessageTransportData, createRequestChannel } from '@dynamic-labs/message-transport';
7
7
  import { jsx } from 'react/jsx-runtime';
8
8
  import { createPasskey, PasskeyStamper } from '@turnkey/react-native-passkey-stamper';
9
9
  import { createURL, openURL } from 'expo-linking';
10
10
  import { openAuthSessionAsync } from 'expo-web-browser';
11
11
  import { getItemAsync, deleteItemAsync, setItemAsync } from 'expo-secure-store';
12
12
 
13
- var version = "4.11.1";
13
+ var version = "4.12.0";
14
14
 
15
15
  function _extends() {
16
16
  return _extends = Object.assign ? Object.assign.bind() : function (n) {
@@ -132,6 +132,15 @@ const WebView = ({
132
132
  onMessageHandler
133
133
  } = useMessageTransportWebViewBridge(core, webViewRef);
134
134
  const containerStyles = [styles['container'], visible ? styles.show : styles.hide];
135
+ /**
136
+ * Block the message transport when the webview is unmounted
137
+ */
138
+ useEffect(() => () => {
139
+ logger.warn(unmountWebViewWarningMessage);
140
+ core.messageTransport.block();
141
+ },
142
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- we only care about the unmount callback
143
+ []);
135
144
  return /*#__PURE__*/jsx(WebView$1, {
136
145
  ref: webViewRef,
137
146
  source: {
@@ -142,6 +151,19 @@ const WebView = ({
142
151
  onMessage: onMessageHandler,
143
152
  hideKeyboardAccessoryView: true,
144
153
  webviewDebuggingEnabled: _webviewDebuggingEnabled,
154
+ onContentProcessDidTerminate: () => {
155
+ var _a;
156
+ /**
157
+ * iOS and Android both may trigger this event when the webview
158
+ * is removed due to memory pressure.
159
+ *
160
+ * When the webview is killed by the OS, the message transport must
161
+ * be blocked to prevent the "No handlers registered" error while
162
+ * the webview is reloading
163
+ */
164
+ core.messageTransport.block();
165
+ (_a = webViewRef.current) === null || _a === void 0 ? void 0 : _a.reload();
166
+ },
145
167
  onError: () => core.initialization.error = new Error('Could not load Dynamic WebView')
146
168
  }, 'webview');
147
169
  };
@@ -149,6 +171,15 @@ const createWebView = props => {
149
171
  const WebViewWrapper = () => /*#__PURE__*/jsx(WebView, _extends({}, props));
150
172
  return WebViewWrapper;
151
173
  };
174
+ const unmountWebViewWarningMessage = `WebView unmounted.
175
+
176
+ The Dynamic WebView may malfunction if it is unmounted.
177
+
178
+ Render the WebView at the top level of your component tree to ensure it is not unmounted.
179
+
180
+ For more information, please refer to the documentation:
181
+ https://docs.dynamic.xyz/react-native/react-native-extension
182
+ `;
152
183
 
153
184
  /******************************************************************************
154
185
  Copyright (c) Microsoft Corporation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs/react-native-extension",
3
- "version": "4.11.1",
3
+ "version": "4.12.0",
4
4
  "main": "./index.cjs",
5
5
  "module": "./index.js",
6
6
  "types": "./src/index.d.ts",
@@ -15,10 +15,10 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@turnkey/react-native-passkey-stamper": "0.2.15",
18
- "@dynamic-labs/assert-package-version": "4.11.1",
19
- "@dynamic-labs/client": "4.11.1",
20
- "@dynamic-labs/logger": "4.11.1",
21
- "@dynamic-labs/message-transport": "4.11.1"
18
+ "@dynamic-labs/assert-package-version": "4.12.0",
19
+ "@dynamic-labs/client": "4.12.0",
20
+ "@dynamic-labs/logger": "4.12.0",
21
+ "@dynamic-labs/message-transport": "4.12.0"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "react": "^18.2.0",