Skip to content

Commit 4a2db56

Browse files
committed
feat: handle errors happening in webview
1 parent 5e6e2d6 commit 4a2db56

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

src/__tests__/ClaimsList/index.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { render, screen } from '@testing-library/react-native';
2-
import { ClaimsList } from '../../trustBadge/ClaimsList';
2+
import { ClaimsList } from '@src/trustBadge/ClaimsList';
33
import React from 'react';
44

55
const validImageUrl = (number: number) => `https://cdn.io/img${number}`;

src/bundle/index.tsx

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,9 @@ import * as React from 'react';
33
import { View, StyleSheet, Linking } from 'react-native';
44
import { WebView } from 'react-native-webview';
55
import { bundleUrl } from '../api';
6-
import type {
7-
WebViewErrorEvent,
8-
WebViewMessageEvent,
9-
WebViewRenderProcessGoneEvent,
10-
} from 'react-native-webview/lib/WebViewTypes';
6+
import type { WebViewMessageEvent } from 'react-native-webview/lib/WebViewTypes';
117
import ErrorBoundary from '../ErrorBoundary';
12-
import * as Errors from '../services/Errors';
8+
import { webviewErrorHandler } from './webviewErrorHandler';
139

1410
const handleShouldStartLoadWithRequest = (request: any) => {
1511
// Intercept URL loading
@@ -57,20 +53,20 @@ function BundleComponent({
5753
<View style={styles.webViewContainer}>
5854
<WebView
5955
ref={(r: any) => (webview.current = r)}
60-
source={{ uri: bundleUrl(bundleId, sku) }}
56+
source={{
57+
uri: bundleUrl(bundleId, sku),
58+
// There's no way to unit test Webview. So uncomment the following lines to test manually
59+
// uri: 'https://wrongdomainlol.io',
60+
// uri: 'https://staging.provenance.org/webviews/123/123',
61+
}}
6162
style={{ flex: 1 }}
6263
startInLoadingState={true}
6364
nestedScrollEnabled={true}
64-
onError={(syntheticEvent: WebViewErrorEvent) => {
65-
const { nativeEvent } = syntheticEvent;
66-
Errors.handle(`WebView error: ${nativeEvent}`);
67-
}}
68-
onRenderProcessGone={(
69-
syntheticEvent: WebViewRenderProcessGoneEvent
70-
) => {
71-
const { nativeEvent } = syntheticEvent;
72-
Errors.handle(`WebView crashed: ${nativeEvent.didCrash}`);
73-
}}
65+
onError={webviewErrorHandler('WebViewErrorEvent')}
66+
onHttpError={webviewErrorHandler('WebViewHttpErrorEvent')}
67+
onRenderProcessGone={webviewErrorHandler(
68+
'WebViewRenderProcessGoneEvent'
69+
)}
7470
injectedJavaScript={`
7571
window.ReactNativeWebView.postMessage("JS injected");
7672

src/bundle/webviewErrorHandler.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { type NativeSyntheticEvent } from 'react-native';
2+
import * as Errors from '../services/Errors';
3+
4+
class ProvenanceWebviewError extends Error {
5+
constructor(message: string, event: any) {
6+
let eventDetails: string = '';
7+
try {
8+
eventDetails = JSON.stringify(event);
9+
} catch (e) {
10+
eventDetails =
11+
'Could not stringify event, please inspect cause on the error';
12+
}
13+
super([message, eventDetails].join(': '), { cause: event });
14+
}
15+
}
16+
17+
export function webviewErrorHandler(errorEventName: string) {
18+
return (syntheticEvent: NativeSyntheticEvent<any>) => {
19+
const { nativeEvent } = syntheticEvent;
20+
Errors.handle(new ProvenanceWebviewError(errorEventName, nativeEvent));
21+
};
22+
}

0 commit comments

Comments
 (0)