@dynamic-labs/react-native-extension 4.55.0 → 4.57.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/index.cjs CHANGED
@@ -33,7 +33,7 @@ function _interopNamespace(e) {
33
33
  return Object.freeze(n);
34
34
  }
35
35
 
36
- var version = "4.55.0";
36
+ var version = "4.57.0";
37
37
 
38
38
  function _extends() {
39
39
  return _extends = Object.assign ? Object.assign.bind() : function (n) {
@@ -45,6 +45,12 @@ function _extends() {
45
45
  }, _extends.apply(null, arguments);
46
46
  }
47
47
 
48
+ class WebViewFailedToLoadError extends Error {
49
+ constructor() {
50
+ super('Could not load Dynamic WebView');
51
+ }
52
+ }
53
+
48
54
  const logger = new logger$1.Logger('react-native-extension');
49
55
 
50
56
  const useMessageTransportWebViewBridge = (core, webViewRef) => {
@@ -160,9 +166,12 @@ const useWebViewRecoveryTimeout = ({
160
166
  webViewUrl,
161
167
  disableRecovery,
162
168
  recoveryTimeout,
163
- setWebViewUrl
169
+ setWebViewUrl,
170
+ onFailedToLoadAfterClearState: _onFailedToLoadAfterClearState = () => {}
164
171
  }) => {
165
172
  const timeoutRef = react.useRef(null);
173
+ const onFailedToLoadAfterClearStateRef = react.useRef(_onFailedToLoadAfterClearState);
174
+ onFailedToLoadAfterClearStateRef.current = _onFailedToLoadAfterClearState;
166
175
  /**
167
176
  * Clear timeout on unmount
168
177
  */
@@ -179,6 +188,7 @@ const useWebViewRecoveryTimeout = ({
179
188
  }
180
189
  if (hasClearStateInUrl(webViewUrl)) {
181
190
  logger.debug('timeout recovery: disabled because webview already cleared its state', webViewUrl.toString());
191
+ onFailedToLoadAfterClearStateRef.current();
182
192
  return;
183
193
  }
184
194
  logger.debug('timeout recovery: registering timeout', webViewUrl.toString());
@@ -300,6 +310,11 @@ const WebView = ({
300
310
  });
301
311
  }, [core]);
302
312
  react.useEffect(() => core.messageTransport.recoveryManager.onRecoveryRequested(blockAndReloadWebView), [core, blockAndReloadWebView]);
313
+ const setWebViewLoadError = react.useCallback(() => {
314
+ // Error was already thrown, do not throw again
315
+ if (core.initialization.error instanceof WebViewFailedToLoadError) return;
316
+ core.initialization.error = new WebViewFailedToLoadError();
317
+ }, [core]);
303
318
  /**
304
319
  * Reload the webview with a clean state when a timeout is reached
305
320
  * and the webview did not get to the loaded state yet
@@ -307,13 +322,21 @@ const WebView = ({
307
322
  const startRecoveryTimeout = useWebViewRecoveryTimeout({
308
323
  core,
309
324
  disableRecovery: _disableRecovery,
325
+ onFailedToLoadAfterClearState: setWebViewLoadError,
310
326
  recoveryTimeout: _recoveryTimeout,
311
327
  setWebViewUrl,
312
328
  webViewUrl
313
329
  });
314
- const setWebViewLoadError = react.useCallback(() => {
315
- core.initialization.error = new Error('Could not load Dynamic WebView');
316
- }, [core]);
330
+ const webViewLoadErrorCountRef = react.useRef(0);
331
+ const onWebViewLoadError = react.useCallback(() => {
332
+ webViewLoadErrorCountRef.current = webViewLoadErrorCountRef.current + 1;
333
+ /**
334
+ * This is the first attempt to load the webview, do not throw an error
335
+ * because the recovery system will attempt to reload the webview
336
+ */
337
+ if (webViewLoadErrorCountRef.current === 1) return;
338
+ setWebViewLoadError();
339
+ }, [setWebViewLoadError]);
317
340
  const {
318
341
  onLoad,
319
342
  onLoadStart
@@ -333,7 +356,7 @@ const WebView = ({
333
356
  webviewDebuggingEnabled: _webviewDebuggingEnabled,
334
357
  onContentProcessDidTerminate: blockAndReloadWebView,
335
358
  onRenderProcessGone: blockAndReloadWebView,
336
- onError: () => setWebViewLoadError(),
359
+ onError: onWebViewLoadError,
337
360
  setSupportMultipleWindows: false,
338
361
  onShouldStartLoadWithRequest: request => {
339
362
  const requestUrl = getUrl(request.url);
@@ -660,3 +683,4 @@ const ReactNativeExtension = ({
660
683
  assertPackageVersion.assertPackageVersion('@dynamic-labs/react-native-extension', version);
661
684
 
662
685
  exports.ReactNativeExtension = ReactNativeExtension;
686
+ exports.WebViewFailedToLoadError = WebViewFailedToLoadError;
package/index.js CHANGED
@@ -11,7 +11,7 @@ import { openAuthSessionAsync } from 'expo-web-browser';
11
11
  import { getItemAsync, deleteItemAsync, setItemAsync } from 'expo-secure-store';
12
12
  import { createPasskey, PasskeyStamper } from '@turnkey/react-native-passkey-stamper';
13
13
 
14
- var version = "4.55.0";
14
+ var version = "4.57.0";
15
15
 
16
16
  function _extends() {
17
17
  return _extends = Object.assign ? Object.assign.bind() : function (n) {
@@ -23,6 +23,12 @@ function _extends() {
23
23
  }, _extends.apply(null, arguments);
24
24
  }
25
25
 
26
+ class WebViewFailedToLoadError extends Error {
27
+ constructor() {
28
+ super('Could not load Dynamic WebView');
29
+ }
30
+ }
31
+
26
32
  const logger = new Logger('react-native-extension');
27
33
 
28
34
  const useMessageTransportWebViewBridge = (core, webViewRef) => {
@@ -138,9 +144,12 @@ const useWebViewRecoveryTimeout = ({
138
144
  webViewUrl,
139
145
  disableRecovery,
140
146
  recoveryTimeout,
141
- setWebViewUrl
147
+ setWebViewUrl,
148
+ onFailedToLoadAfterClearState: _onFailedToLoadAfterClearState = () => {}
142
149
  }) => {
143
150
  const timeoutRef = useRef(null);
151
+ const onFailedToLoadAfterClearStateRef = useRef(_onFailedToLoadAfterClearState);
152
+ onFailedToLoadAfterClearStateRef.current = _onFailedToLoadAfterClearState;
144
153
  /**
145
154
  * Clear timeout on unmount
146
155
  */
@@ -157,6 +166,7 @@ const useWebViewRecoveryTimeout = ({
157
166
  }
158
167
  if (hasClearStateInUrl(webViewUrl)) {
159
168
  logger.debug('timeout recovery: disabled because webview already cleared its state', webViewUrl.toString());
169
+ onFailedToLoadAfterClearStateRef.current();
160
170
  return;
161
171
  }
162
172
  logger.debug('timeout recovery: registering timeout', webViewUrl.toString());
@@ -278,6 +288,11 @@ const WebView = ({
278
288
  });
279
289
  }, [core]);
280
290
  useEffect(() => core.messageTransport.recoveryManager.onRecoveryRequested(blockAndReloadWebView), [core, blockAndReloadWebView]);
291
+ const setWebViewLoadError = useCallback(() => {
292
+ // Error was already thrown, do not throw again
293
+ if (core.initialization.error instanceof WebViewFailedToLoadError) return;
294
+ core.initialization.error = new WebViewFailedToLoadError();
295
+ }, [core]);
281
296
  /**
282
297
  * Reload the webview with a clean state when a timeout is reached
283
298
  * and the webview did not get to the loaded state yet
@@ -285,13 +300,21 @@ const WebView = ({
285
300
  const startRecoveryTimeout = useWebViewRecoveryTimeout({
286
301
  core,
287
302
  disableRecovery: _disableRecovery,
303
+ onFailedToLoadAfterClearState: setWebViewLoadError,
288
304
  recoveryTimeout: _recoveryTimeout,
289
305
  setWebViewUrl,
290
306
  webViewUrl
291
307
  });
292
- const setWebViewLoadError = useCallback(() => {
293
- core.initialization.error = new Error('Could not load Dynamic WebView');
294
- }, [core]);
308
+ const webViewLoadErrorCountRef = useRef(0);
309
+ const onWebViewLoadError = useCallback(() => {
310
+ webViewLoadErrorCountRef.current = webViewLoadErrorCountRef.current + 1;
311
+ /**
312
+ * This is the first attempt to load the webview, do not throw an error
313
+ * because the recovery system will attempt to reload the webview
314
+ */
315
+ if (webViewLoadErrorCountRef.current === 1) return;
316
+ setWebViewLoadError();
317
+ }, [setWebViewLoadError]);
295
318
  const {
296
319
  onLoad,
297
320
  onLoadStart
@@ -311,7 +334,7 @@ const WebView = ({
311
334
  webviewDebuggingEnabled: _webviewDebuggingEnabled,
312
335
  onContentProcessDidTerminate: blockAndReloadWebView,
313
336
  onRenderProcessGone: blockAndReloadWebView,
314
- onError: () => setWebViewLoadError(),
337
+ onError: onWebViewLoadError,
315
338
  setSupportMultipleWindows: false,
316
339
  onShouldStartLoadWithRequest: request => {
317
340
  const requestUrl = getUrl(request.url);
@@ -637,4 +660,4 @@ const ReactNativeExtension = ({
637
660
 
638
661
  assertPackageVersion('@dynamic-labs/react-native-extension', version);
639
662
 
640
- export { ReactNativeExtension };
663
+ export { ReactNativeExtension, WebViewFailedToLoadError };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs/react-native-extension",
3
- "version": "4.55.0",
3
+ "version": "4.57.0",
4
4
  "main": "./index.cjs",
5
5
  "module": "./index.js",
6
6
  "types": "./src/index.d.ts",
@@ -18,11 +18,11 @@
18
18
  "@turnkey/react-native-passkey-stamper": "1.1.3",
19
19
  "@react-native-documents/picker": "^11.0.0",
20
20
  "react-native-fs": ">=2.20.0",
21
- "@dynamic-labs/assert-package-version": "4.55.0",
22
- "@dynamic-labs/client": "4.55.0",
23
- "@dynamic-labs/logger": "4.55.0",
24
- "@dynamic-labs/message-transport": "4.55.0",
25
- "@dynamic-labs/webview-messages": "4.55.0"
21
+ "@dynamic-labs/assert-package-version": "4.57.0",
22
+ "@dynamic-labs/client": "4.57.0",
23
+ "@dynamic-labs/logger": "4.57.0",
24
+ "@dynamic-labs/message-transport": "4.57.0",
25
+ "@dynamic-labs/webview-messages": "4.57.0"
26
26
  },
27
27
  "peerDependencies": {
28
28
  "react": ">=18.0.0 <20.0.0",
@@ -6,6 +6,7 @@ type UseWebViewRecoveryTimeoutProps = {
6
6
  disableRecovery: boolean;
7
7
  recoveryTimeout: number;
8
8
  setWebViewUrl: Dispatch<SetStateAction<URL>>;
9
+ onFailedToLoadAfterClearState?: () => void;
9
10
  };
10
- export declare const useWebViewRecoveryTimeout: ({ core, webViewUrl, disableRecovery, recoveryTimeout, setWebViewUrl, }: UseWebViewRecoveryTimeoutProps) => () => void;
11
+ export declare const useWebViewRecoveryTimeout: ({ core, webViewUrl, disableRecovery, recoveryTimeout, setWebViewUrl, onFailedToLoadAfterClearState, }: UseWebViewRecoveryTimeoutProps) => () => void;
11
12
  export {};
@@ -0,0 +1,3 @@
1
+ export declare class WebViewFailedToLoadError extends Error {
2
+ constructor();
3
+ }
package/src/index.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export { ReactNativeExtension, type IReactNativeExtension, } from './ReactNativeExtension';
2
+ export { WebViewFailedToLoadError } from './errors/WebViewFailedToLoadError';