@exodus/react-native-webview 11.26.1-exodus.9 → 13.16.0-exodus.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/README.md +36 -63
- package/android/build.gradle +83 -110
- package/android/gradle.properties +3 -4
- package/android/src/main/AndroidManifest.xml +12 -0
- package/android/src/main/AndroidManifestNew.xml +26 -0
- package/android/src/main/java/com/reactnativecommunity/webview/RNCBasicAuthCredential.java +11 -0
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebChromeClient.java +407 -0
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebView.java +468 -0
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewClient.java +330 -0
- package/android/src/main/java/com/reactnativecommunity/webview/{WebViewConfig.java → RNCWebViewConfig.java} +3 -4
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewFileProvider.java +1 -1
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManagerImpl.kt +746 -0
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewMessagingModule.kt +9 -0
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewModuleImpl.java +554 -0
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewPackage.java +57 -12
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewWrapper.kt +39 -0
- package/android/src/main/java/com/reactnativecommunity/webview/events/SubResourceErrorEvent.kt +25 -0
- package/android/src/main/java/com/reactnativecommunity/webview/events/TopCustomMenuSelectionEvent.kt +24 -0
- package/android/src/main/java/com/reactnativecommunity/webview/events/TopHttpErrorEvent.kt +25 -0
- package/android/src/main/java/com/reactnativecommunity/webview/events/TopNewWindowEvent.kt +25 -0
- package/android/src/main/java/com/reactnativecommunity/webview/events/TopRenderProcessGoneEvent.kt +25 -0
- package/android/src/newarch/com/reactnativecommunity/webview/RNCWebViewManager.java +570 -0
- package/android/src/newarch/com/reactnativecommunity/webview/RNCWebViewModule.java +57 -0
- package/android/src/oldarch/com/reactnativecommunity/webview/RNCWebViewManager.java +341 -0
- package/android/src/oldarch/com/reactnativecommunity/webview/RNCWebViewModule.java +59 -0
- package/apple/RCTConvert+WKDataDetectorTypes.h +11 -0
- package/apple/RCTConvert+WKDataDetectorTypes.m +27 -0
- package/apple/RNCWebView.h +26 -100
- package/apple/RNCWebView.mm +555 -0
- package/apple/RNCWebViewDecisionManager.h +20 -0
- package/apple/RNCWebViewDecisionManager.m +47 -0
- package/apple/RNCWebViewImpl.h +164 -0
- package/apple/{RNCWebView.m → RNCWebViewImpl.m} +803 -226
- package/apple/RNCWebViewManager.h +4 -8
- package/apple/RNCWebViewManager.mm +221 -0
- package/apple/RNCWebViewModule.h +23 -0
- package/apple/RNCWebViewModule.mm +34 -0
- package/index.d.ts +2 -3
- package/lib/NativeRNCWebViewModule.d.ts +8 -0
- package/lib/NativeRNCWebViewModule.js +1 -0
- package/lib/RNCWebViewNativeComponent.d.ts +245 -0
- package/lib/RNCWebViewNativeComponent.js +1 -0
- package/lib/WebView.android.d.ts +0 -1
- package/lib/WebView.android.js +1 -135
- package/lib/WebView.d.ts +2 -3
- package/lib/WebView.ios.d.ts +0 -1
- package/lib/WebView.ios.js +1 -114
- package/lib/WebView.js +1 -11
- package/lib/WebView.macos.d.ts +6 -0
- package/lib/WebView.macos.js +1 -0
- package/lib/WebView.styles.d.ts +37 -11
- package/lib/WebView.styles.js +1 -33
- package/lib/WebView.windows.d.ts +17 -0
- package/lib/WebView.windows.js +1 -0
- package/lib/WebViewNativeComponent.macos.d.ts +3 -0
- package/lib/WebViewNativeComponent.macos.js +1 -0
- package/lib/WebViewNativeComponent.windows.d.ts +3 -0
- package/lib/WebViewNativeComponent.windows.js +1 -0
- package/lib/WebViewShared.d.ts +30 -9
- package/lib/WebViewShared.js +1 -174
- package/lib/WebViewTypes.d.ts +514 -98
- package/lib/WebViewTypes.js +1 -6
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -3
- package/lib/validation.d.ts +3 -0
- package/lib/validation.js +1 -0
- package/package.json +57 -33
- package/react-native-webview.podspec +32 -5
- package/react-native.config.js +22 -18
- package/src/NativeRNCWebViewModule.ts +13 -0
- package/src/RNCWebViewNativeComponent.ts +348 -0
- package/src/WebView.android.tsx +345 -0
- package/src/WebView.ios.tsx +341 -0
- package/src/WebView.macos.tsx +252 -0
- package/src/WebView.styles.ts +41 -0
- package/src/WebView.tsx +25 -0
- package/src/WebView.windows.tsx +217 -0
- package/src/WebViewNativeComponent.macos.ts +7 -0
- package/src/WebViewNativeComponent.windows.ts +8 -0
- package/src/WebViewShared.tsx +476 -0
- package/src/WebViewTypes.ts +1402 -0
- package/src/__tests__/WebViewShared-test.js +323 -0
- package/src/__tests__/__snapshots__/WebViewShared-test.js.snap +8 -0
- package/src/__tests__/validation-test.js +38 -0
- package/src/index.ts +4 -0
- package/src/validation.ts +20 -0
- package/android/.editorconfig +0 -6
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewManager.java +0 -1408
- package/android/src/main/java/com/reactnativecommunity/webview/RNCWebViewModule.java +0 -506
- package/apple/RNCWebViewManager.m +0 -278
- package/lib/WebViewNativeComponent.android.d.ts +0 -4
- package/lib/WebViewNativeComponent.android.js +0 -3
- package/lib/WebViewNativeComponent.ios.d.ts +0 -4
- package/lib/WebViewNativeComponent.ios.js +0 -3
package/lib/WebViewShared.js
CHANGED
|
@@ -1,174 +1 @@
|
|
|
1
|
-
import escapeStringRegexp from 'escape-string-regexp';
|
|
2
|
-
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
|
3
|
-
import { Linking, View, ActivityIndicator, Text, Platform } from 'react-native';
|
|
4
|
-
import styles from './WebView.styles';
|
|
5
|
-
const defaultOriginWhitelist = ['https://*'];
|
|
6
|
-
const extractOrigin = (url) => {
|
|
7
|
-
const result = /^[A-Za-z][A-Za-z0-9+\-.]+:(\/\/)?[^/]*/.exec(url);
|
|
8
|
-
return result === null ? '' : result[0];
|
|
9
|
-
};
|
|
10
|
-
const originWhitelistToRegex = (originWhitelist) => `^${escapeStringRegexp(originWhitelist).replace(/\\\*/g, '.*')}$`;
|
|
11
|
-
const _passesWhitelist = (compiledWhitelist, url) => {
|
|
12
|
-
const origin = extractOrigin(url);
|
|
13
|
-
if (!origin)
|
|
14
|
-
return false;
|
|
15
|
-
if (origin !== new URL(url).origin)
|
|
16
|
-
return null;
|
|
17
|
-
return compiledWhitelist.some(x => new RegExp(x).test(origin));
|
|
18
|
-
};
|
|
19
|
-
const compileWhitelist = (originWhitelist) => ['about:blank', ...(originWhitelist || [])].map(originWhitelistToRegex);
|
|
20
|
-
const createOnShouldStartLoadWithRequest = (loadRequest, originWhitelist, onShouldStartLoadWithRequest) => {
|
|
21
|
-
return ({ nativeEvent }) => {
|
|
22
|
-
let shouldStart = true;
|
|
23
|
-
const { url, lockIdentifier } = nativeEvent;
|
|
24
|
-
if (!_passesWhitelist(compileWhitelist(originWhitelist), url)) {
|
|
25
|
-
Linking.canOpenURL(url).then((supported) => {
|
|
26
|
-
if (supported && /^https:\/\//.test(url)) {
|
|
27
|
-
return Linking.openURL(url);
|
|
28
|
-
}
|
|
29
|
-
console.warn(`Can't open url: ${url}`);
|
|
30
|
-
return undefined;
|
|
31
|
-
}).catch(e => {
|
|
32
|
-
console.warn('Error opening URL: ', e);
|
|
33
|
-
});
|
|
34
|
-
shouldStart = false;
|
|
35
|
-
}
|
|
36
|
-
else if (onShouldStartLoadWithRequest) {
|
|
37
|
-
shouldStart = onShouldStartLoadWithRequest(nativeEvent);
|
|
38
|
-
}
|
|
39
|
-
loadRequest(shouldStart, url, lockIdentifier);
|
|
40
|
-
};
|
|
41
|
-
};
|
|
42
|
-
const defaultRenderLoading = () => (<View style={styles.loadingOrErrorView}>
|
|
43
|
-
<ActivityIndicator />
|
|
44
|
-
</View>);
|
|
45
|
-
const defaultRenderError = (errorDomain, errorCode, errorDesc) => (<View style={styles.loadingOrErrorView}>
|
|
46
|
-
<Text style={styles.errorTextTitle}>Error loading page</Text>
|
|
47
|
-
<Text style={styles.errorText}>{`Domain: ${errorDomain}`}</Text>
|
|
48
|
-
<Text style={styles.errorText}>{`Error Code: ${errorCode}`}</Text>
|
|
49
|
-
<Text style={styles.errorText}>{`Description: ${errorDesc}`}</Text>
|
|
50
|
-
</View>);
|
|
51
|
-
export { defaultOriginWhitelist, createOnShouldStartLoadWithRequest, defaultRenderLoading, defaultRenderError, };
|
|
52
|
-
export const useWebWiewLogic = ({ startInLoadingState, onLoadStart, onLoad, onLoadEnd, onError, onMessageProp, originWhitelist, onShouldStartLoadWithRequestProp, onShouldStartLoadWithRequestCallback, validateMeta, validateData, }) => {
|
|
53
|
-
const [viewState, setViewState] = useState(startInLoadingState ? "LOADING" : "IDLE");
|
|
54
|
-
const [lastErrorEvent, setLastErrorEvent] = useState(null);
|
|
55
|
-
const startUrl = useRef(null);
|
|
56
|
-
const passesWhitelist = (url) => {
|
|
57
|
-
if (!url || typeof url !== 'string')
|
|
58
|
-
return false;
|
|
59
|
-
return _passesWhitelist(compileWhitelist(originWhitelist), url);
|
|
60
|
-
};
|
|
61
|
-
const passesWhitelistUse = useCallback(passesWhitelist, [originWhitelist]);
|
|
62
|
-
const extractMeta = (nativeEvent) => ({
|
|
63
|
-
url: String(nativeEvent.url),
|
|
64
|
-
loading: Boolean(nativeEvent.loading),
|
|
65
|
-
title: String(nativeEvent.title),
|
|
66
|
-
canGoBack: Boolean(nativeEvent.canGoBack),
|
|
67
|
-
canGoForward: Boolean(nativeEvent.canGoForward),
|
|
68
|
-
lockIdentifier: Number(nativeEvent.lockIdentifier),
|
|
69
|
-
});
|
|
70
|
-
const onLoadingStart = useCallback((event) => {
|
|
71
|
-
// Needed for android
|
|
72
|
-
startUrl.current = event.nativeEvent.url;
|
|
73
|
-
// !Needed for android
|
|
74
|
-
onLoadStart === null || onLoadStart === void 0 ? void 0 : onLoadStart(event);
|
|
75
|
-
}, [onLoadStart]);
|
|
76
|
-
const onLoadingError = useCallback((event) => {
|
|
77
|
-
event.persist();
|
|
78
|
-
if (onError) {
|
|
79
|
-
onError(event);
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
console.warn('Encountered an error loading page', event.nativeEvent);
|
|
83
|
-
}
|
|
84
|
-
onLoadEnd === null || onLoadEnd === void 0 ? void 0 : onLoadEnd(event);
|
|
85
|
-
if (event.isDefaultPrevented()) {
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
;
|
|
89
|
-
setViewState('ERROR');
|
|
90
|
-
setLastErrorEvent(event.nativeEvent);
|
|
91
|
-
}, [onError, onLoadEnd]);
|
|
92
|
-
const onLoadingFinish = useCallback((event) => {
|
|
93
|
-
onLoad === null || onLoad === void 0 ? void 0 : onLoad(event);
|
|
94
|
-
onLoadEnd === null || onLoadEnd === void 0 ? void 0 : onLoadEnd(event);
|
|
95
|
-
const { nativeEvent: { url } } = event;
|
|
96
|
-
if (!passesWhitelistUse(url))
|
|
97
|
-
return;
|
|
98
|
-
// on Android, only if url === startUrl
|
|
99
|
-
if (Platform.OS !== "android" || url === startUrl.current) {
|
|
100
|
-
setViewState('IDLE');
|
|
101
|
-
}
|
|
102
|
-
// !on Android, only if url === startUrl
|
|
103
|
-
// REMOVED: updateNavigationState(event);
|
|
104
|
-
}, [onLoad, onLoadEnd, passesWhitelistUse]);
|
|
105
|
-
const onMessage = useCallback((event) => {
|
|
106
|
-
const { nativeEvent } = event;
|
|
107
|
-
if (!passesWhitelistUse(nativeEvent.url))
|
|
108
|
-
return;
|
|
109
|
-
// TODO: can/should we perform any other validation?
|
|
110
|
-
const data = JSON.stringify(validateData(JSON.parse(nativeEvent.data)));
|
|
111
|
-
const meta = validateMeta(extractMeta(nativeEvent));
|
|
112
|
-
onMessageProp === null || onMessageProp === void 0 ? void 0 : onMessageProp({ ...meta, data });
|
|
113
|
-
}, [onMessageProp, passesWhitelistUse, validateData, validateMeta]);
|
|
114
|
-
const onLoadingProgress = useCallback((event) => {
|
|
115
|
-
const { nativeEvent: { progress } } = event;
|
|
116
|
-
if (!passesWhitelistUse(event.nativeEvent.url))
|
|
117
|
-
return;
|
|
118
|
-
// patch for Android only
|
|
119
|
-
if (Platform.OS === "android" && progress === 1) {
|
|
120
|
-
setViewState(prevViewState => prevViewState === 'LOADING' ? 'IDLE' : prevViewState);
|
|
121
|
-
}
|
|
122
|
-
// !patch for Android only
|
|
123
|
-
// REMOVED: onLoadProgress?.(event);
|
|
124
|
-
}, [passesWhitelistUse]);
|
|
125
|
-
const onShouldStartLoadWithRequest = useMemo(() => createOnShouldStartLoadWithRequest(onShouldStartLoadWithRequestCallback, originWhitelist, onShouldStartLoadWithRequestProp), [originWhitelist, onShouldStartLoadWithRequestProp, onShouldStartLoadWithRequestCallback]);
|
|
126
|
-
return {
|
|
127
|
-
onShouldStartLoadWithRequest,
|
|
128
|
-
onLoadingStart,
|
|
129
|
-
onLoadingProgress,
|
|
130
|
-
onLoadingError,
|
|
131
|
-
onLoadingFinish,
|
|
132
|
-
onMessage,
|
|
133
|
-
passesWhitelist,
|
|
134
|
-
viewState,
|
|
135
|
-
setViewState,
|
|
136
|
-
lastErrorEvent,
|
|
137
|
-
};
|
|
138
|
-
};
|
|
139
|
-
export const versionPasses = (version, minimum) => {
|
|
140
|
-
if (!version || !minimum)
|
|
141
|
-
return false;
|
|
142
|
-
if (typeof version !== 'string' || typeof minimum !== 'string')
|
|
143
|
-
return false;
|
|
144
|
-
if (minimum.includes(', ')) {
|
|
145
|
-
// We have a set of possible versions
|
|
146
|
-
const variants = minimum.split(', ');
|
|
147
|
-
// Every entry but the last one should be with an upper bound
|
|
148
|
-
if (!variants.slice(0, -1).every(x => x.includes(' <')))
|
|
149
|
-
return false;
|
|
150
|
-
return variants.some(x => versionPasses(version, x)); // Any match passes
|
|
151
|
-
}
|
|
152
|
-
if (minimum.includes(' <')) {
|
|
153
|
-
const [min, max, ...rest] = minimum.split(' <');
|
|
154
|
-
if (rest.length > 0)
|
|
155
|
-
return false;
|
|
156
|
-
// Last check is required for correctness/formatting validation
|
|
157
|
-
return versionPasses(version, min) && !versionPasses(version, max) && versionPasses(max, version);
|
|
158
|
-
}
|
|
159
|
-
const versionRegex = /^[0-9]+(\.[0-9]+)*$/;
|
|
160
|
-
if (!versionRegex.test(version) || !versionRegex.test(minimum))
|
|
161
|
-
return false;
|
|
162
|
-
const versionParts = version.split('.').map(Number);
|
|
163
|
-
const minimumParts = minimum.split('.').map(Number);
|
|
164
|
-
const len = Math.max(versionParts.length, minimumParts.length);
|
|
165
|
-
for (let i = 0; i < len; i += 1) {
|
|
166
|
-
const ver = versionParts[i] || 0;
|
|
167
|
-
const min = minimumParts[i] || 0;
|
|
168
|
-
if (ver > min)
|
|
169
|
-
return true;
|
|
170
|
-
if (ver < min)
|
|
171
|
-
return false;
|
|
172
|
-
}
|
|
173
|
-
return true; // equals
|
|
174
|
-
};
|
|
1
|
+
var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.versionPasses=exports.useWebViewLogic=exports.defaultRenderLoading=exports.defaultRenderError=exports.defaultOriginWhitelist=exports.defaultDeeplinkWhitelist=exports.createOnShouldStartLoadWithRequest=void 0;var _toArray2=_interopRequireDefault(require("@babel/runtime/helpers/toArray"));var _slicedToArray2=_interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));var _toConsumableArray2=_interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));var _escapeStringRegexp=_interopRequireDefault(require("escape-string-regexp"));var _react=_interopRequireWildcard(require("react"));var _reactNative=require("react-native");var _WebView=_interopRequireDefault(require("./WebView.styles"));var _jsxRuntime=require("react/jsx-runtime");var _this=this,_jsxFileName="/Users/raulgomezacuna/Development/react-native-webview/src/WebViewShared.tsx";function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap(),t=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(e){return e?t:r;})(e);}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&Object.prototype.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u];}return n.default=e,t&&t.set(e,n),n;}var defaultOriginWhitelist=exports.defaultOriginWhitelist=['http://*','https://*'];var defaultDeeplinkWhitelist=exports.defaultDeeplinkWhitelist=['https:'];var defaultDeeplinkBlocklist=['http:','file:','javascript:'];var urlToProtocolScheme=function urlToProtocolScheme(url){try{return new URL(url).protocol;}catch(_unused){return null;}};var matchWithStringList=function matchWithStringList(prefixes,value){if(typeof value!=='string'){throw new Error('value was not a string');}return Array.prototype.includes.call(prefixes,value);};var stringWhitelistToRegex=function stringWhitelistToRegex(originWhitelist){return new RegExp(`^${(0,_escapeStringRegexp.default)(originWhitelist).replace(/\\\*/g,'.*')}$`);};var matchWithRegexList=function matchWithRegexList(compiledRegexList,value){return compiledRegexList.some(function(x){return x.test(value);});};var compileWhitelist=function compileWhitelist(originWhitelist){return['about:blank'].concat((0,_toConsumableArray2.default)(originWhitelist||[])).map(stringWhitelistToRegex);};var passesWhitelist=function passesWhitelist(compiledWhitelist,url){try{var _URL=new URL(url),href=_URL.href,origin=_URL.origin;if(origin&&origin!=='null'){return matchWithRegexList(compiledWhitelist,origin);}return matchWithRegexList(compiledWhitelist,href);}catch(_unused2){return false;}};var createOnShouldStartLoadWithRequest=exports.createOnShouldStartLoadWithRequest=function createOnShouldStartLoadWithRequest(loadRequest,originWhitelist,deeplinkWhitelist,onShouldStartLoadWithRequest){var compiledWhitelist=compileWhitelist(originWhitelist);return function(_ref){var nativeEvent=_ref.nativeEvent;var shouldStart=true;var url=nativeEvent.url,lockIdentifier=nativeEvent.lockIdentifier,isTopFrame=nativeEvent.isTopFrame;if(!passesWhitelist(compiledWhitelist,url)){var protocol=urlToProtocolScheme(url);if(protocol!==null){var foundMatchInBlocklist=matchWithStringList(defaultDeeplinkBlocklist,protocol);if(!foundMatchInBlocklist){var foundMatchInAllowlist=matchWithStringList(deeplinkWhitelist,protocol);if(foundMatchInAllowlist){_reactNative.Linking.canOpenURL(url).then(function(supported){if(supported&&isTopFrame||protocol.startsWith('mailto:')){return _reactNative.Linking.openURL(url);}console.warn(`Can't open url: ${url}`);return undefined;}).catch(function(e){console.warn('Error opening URL: ',e);});}else{console.warn(`Failed to pass whitelist for deep link url: ${url}`);}}else{console.warn(`Failed to pass default block list for deep link url: ${url}`);}}shouldStart=false;}else if(onShouldStartLoadWithRequest){shouldStart=onShouldStartLoadWithRequest(nativeEvent);}loadRequest(shouldStart,url,lockIdentifier);};};var defaultRenderLoading=exports.defaultRenderLoading=function defaultRenderLoading(){return(0,_jsxRuntime.jsx)(_reactNative.View,{style:_WebView.default.loadingOrErrorView,children:(0,_jsxRuntime.jsx)(_reactNative.ActivityIndicator,{})});};var defaultRenderError=exports.defaultRenderError=function defaultRenderError(errorDomain,errorCode,errorDesc){return(0,_jsxRuntime.jsxs)(_reactNative.View,{style:_WebView.default.loadingOrErrorView,children:[(0,_jsxRuntime.jsx)(_reactNative.Text,{style:_WebView.default.errorTextTitle,children:"Error loading page"}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:_WebView.default.errorText,children:`Domain: ${errorDomain}`}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:_WebView.default.errorText,children:`Error Code: ${errorCode}`}),(0,_jsxRuntime.jsx)(_reactNative.Text,{style:_WebView.default.errorText,children:`Description: ${errorDesc}`})]});};var useWebViewLogic=exports.useWebViewLogic=function useWebViewLogic(_ref2){var startInLoadingState=_ref2.startInLoadingState,onNavigationStateChange=_ref2.onNavigationStateChange,onLoadStart=_ref2.onLoadStart,onLoad=_ref2.onLoad,onLoadProgress=_ref2.onLoadProgress,onLoadEnd=_ref2.onLoadEnd,onError=_ref2.onError,onLoadSubResourceError=_ref2.onLoadSubResourceError,onHttpErrorProp=_ref2.onHttpErrorProp,onMessageProp=_ref2.onMessageProp,onOpenWindowProp=_ref2.onOpenWindowProp,onRenderProcessGoneProp=_ref2.onRenderProcessGoneProp,onContentProcessDidTerminateProp=_ref2.onContentProcessDidTerminateProp,originWhitelist=_ref2.originWhitelist,deeplinkWhitelist=_ref2.deeplinkWhitelist,onShouldStartLoadWithRequestProp=_ref2.onShouldStartLoadWithRequestProp,onShouldStartLoadWithRequestCallback=_ref2.onShouldStartLoadWithRequestCallback,validateMeta=_ref2.validateMeta,validateData=_ref2.validateData;var _useState=(0,_react.useState)(startInLoadingState?'LOADING':'IDLE'),_useState2=(0,_slicedToArray2.default)(_useState,2),viewState=_useState2[0],setViewState=_useState2[1];var _useState3=(0,_react.useState)(null),_useState4=(0,_slicedToArray2.default)(_useState3,2),lastErrorEvent=_useState4[0],setLastErrorEvent=_useState4[1];var startUrl=(0,_react.useRef)(null);var passesWhitelistCallback=(0,_react.useCallback)(function(url){if(!url||typeof url!=='string')return false;return passesWhitelist(compileWhitelist(originWhitelist),url);},[originWhitelist]);var extractMeta=function extractMeta(nativeEvent){return{url:String(nativeEvent.url),loading:Boolean(nativeEvent.loading),title:String(nativeEvent.title).slice(0,512),canGoBack:Boolean(nativeEvent.canGoBack),canGoForward:Boolean(nativeEvent.canGoForward),lockIdentifier:Number(nativeEvent.lockIdentifier)};};var updateNavigationState=(0,_react.useCallback)(function(event){onNavigationStateChange==null?void 0:onNavigationStateChange(event.nativeEvent);},[onNavigationStateChange]);var onLoadingStart=(0,_react.useCallback)(function(event){startUrl.current=event.nativeEvent.url;onLoadStart==null?void 0:onLoadStart(event);updateNavigationState(event);},[onLoadStart,updateNavigationState]);var onLoadingError=(0,_react.useCallback)(function(event){event.persist();if(onError){onError(event);}else{console.warn('Encountered an error loading page',event.nativeEvent);}onLoadEnd==null?void 0:onLoadEnd(event);if(event.isDefaultPrevented()){return;}setViewState('ERROR');setLastErrorEvent(event.nativeEvent);},[onError,onLoadEnd]);var onLoadingSubResourceError=(0,_react.useCallback)(function(event){onLoadSubResourceError==null?void 0:onLoadSubResourceError(event);},[onLoadSubResourceError]);var onHttpError=(0,_react.useCallback)(function(event){onHttpErrorProp==null?void 0:onHttpErrorProp(event);},[onHttpErrorProp]);var onRenderProcessGone=(0,_react.useCallback)(function(event){onRenderProcessGoneProp==null?void 0:onRenderProcessGoneProp(event);},[onRenderProcessGoneProp]);var onContentProcessDidTerminate=(0,_react.useCallback)(function(event){onContentProcessDidTerminateProp==null?void 0:onContentProcessDidTerminateProp(event);},[onContentProcessDidTerminateProp]);var onLoadingFinish=(0,_react.useCallback)(function(event){onLoad==null?void 0:onLoad(event);onLoadEnd==null?void 0:onLoadEnd(event);var url=event.nativeEvent.url;if(_reactNative.Platform.OS!=='android'||url===startUrl.current){setViewState('IDLE');}updateNavigationState(event);},[onLoad,onLoadEnd,updateNavigationState]);var onMessage=(0,_react.useCallback)(function(event){var nativeEvent=event.nativeEvent;if(!passesWhitelistCallback(nativeEvent.url))return;try{var parsedData=JSON.parse(nativeEvent.data);var _data=JSON.stringify(validateData(parsedData));var meta=validateMeta(extractMeta(nativeEvent));onMessageProp==null?void 0:onMessageProp(Object.assign({},meta,{data:_data}));}catch(err){console.error('Error parsing WebView message',err);}},[onMessageProp,passesWhitelistCallback,validateData,validateMeta]);var onLoadingProgress=(0,_react.useCallback)(function(event){var progress=event.nativeEvent.progress;if(_reactNative.Platform.OS==='android'&&progress===1){setViewState(function(prevViewState){return prevViewState==='LOADING'?'IDLE':prevViewState;});}onLoadProgress==null?void 0:onLoadProgress(event);},[onLoadProgress]);var onShouldStartLoadWithRequest=(0,_react.useMemo)(function(){return createOnShouldStartLoadWithRequest(onShouldStartLoadWithRequestCallback,originWhitelist,deeplinkWhitelist,onShouldStartLoadWithRequestProp);},[originWhitelist,deeplinkWhitelist,onShouldStartLoadWithRequestProp,onShouldStartLoadWithRequestCallback]);var onOpenWindow=(0,_react.useCallback)(function(event){onOpenWindowProp==null?void 0:onOpenWindowProp(event);},[onOpenWindowProp]);return{onShouldStartLoadWithRequest:onShouldStartLoadWithRequest,onLoadingStart:onLoadingStart,onLoadingProgress:onLoadingProgress,onLoadingError:onLoadingError,onLoadingSubResourceError:onLoadingSubResourceError,onLoadingFinish:onLoadingFinish,onHttpError:onHttpError,onRenderProcessGone:onRenderProcessGone,onContentProcessDidTerminate:onContentProcessDidTerminate,onMessage:onMessage,onOpenWindow:onOpenWindow,viewState:viewState,setViewState:setViewState,lastErrorEvent:lastErrorEvent};};var versionPasses=exports.versionPasses=function versionPasses(version,minimum){if(!version||!minimum)return false;if(typeof version!=='string'||typeof minimum!=='string')return false;if(minimum.includes(', ')){var variants=minimum.split(', ');if(!variants.slice(0,-1).every(function(x){return x.includes(' <');}))return false;return variants.some(function(x){return versionPasses(version,x);});}if(minimum.includes(' <')){var _minimum$split=minimum.split(' <'),_minimum$split2=(0,_toArray2.default)(_minimum$split),min=_minimum$split2[0],max=_minimum$split2[1],rest=_minimum$split2.slice(2);if(rest.length>0)return false;return versionPasses(version,min)&&!versionPasses(version,max)&&versionPasses(max,version);}var versionRegex=/^[0-9]+(\.[0-9]+)*$/;if(!versionRegex.test(version)||!versionRegex.test(minimum))return false;var versionParts=version.split('.').map(Number);var minimumParts=minimum.split('.').map(Number);var len=Math.max(versionParts.length,minimumParts.length);for(var i=0;i<len;i+=1){var ver=versionParts[i]||0;var _min=minimumParts[i]||0;if(ver>_min)return true;if(ver<_min)return false;}return true;};
|