-
Notifications
You must be signed in to change notification settings - Fork 427
/
Copy pathCustomWebComponent.js
95 lines (87 loc) · 2.95 KB
/
CustomWebComponent.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import React, {Component} from 'react';
import {
Dimensions,
Linking
} from 'react-native';
import PropTypes from 'prop-types';
import { WebView } from 'react-native-webview';
import {Actions} from 'react-native-router-flux'
import {launchUrl} from '../../utils/htmlUtils'
let WebCurrent = WebView;
const injectedScript = function () {
function waitForBridge() {
if (window.postMessage.length !== 1) {
setTimeout(waitForBridge, 200);
}
else {
let height = 0;
if (document.documentElement.clientHeight > document.body.clientHeight) {
height = document.documentElement.clientHeight
}
else {
height = document.body.clientHeight
}
postMessage(height)
}
}
waitForBridge();
};
/**
* web控件
*/
export default class WebComponent extends Component {
constructor(props: Object) {
super(props);
this.state = {
loading: true,
}
}
reload() {
if (this.webview) {
this.webview.reload();
}
}
static propTypes = {
gsygithubLink: PropTypes.func,
};
render() {
const _w = this.props.width || Dimensions.get('window').width;
const _h = this.props.width || Dimensions.get('window').height;
return (
<WebCurrent
ref={(ref) => {
this.webview = ref;
}}
onShouldStartLoadWithRequest={(event) => {
if (event.url.indexOf('gsygithub://') === 0 ) {
this.props.gsygithubLink && this.props.gsygithubLink(event.url);
} else if (event.url && event.url.indexOf("https://github.com/") === 0) {
launchUrl(event.url)
} else if (event.url && (event.url.indexOf('http') === 0 || event.url.indexOf('www') === 0)) {
Actions.WebPage({uri: event.url});
} else if (event.url !== 'about:blank') {
Linking.openURL(event.url)
}
return event.url === 'about:blank';
}}
injectedJavaScript={'(' + String(injectedScript) + ')();'}
scrollEnabled={this.props.scrollEnabled || true}
javaScriptEnabled={true}
dataDetectorTypes={'none'}
domStorageEnabled={true}
automaticallyAdjustContentInsets={true}
mixedContentMode={'always'}
allowUniversalAccessFromFileURLs={true}
mediaPlaybackRequiresUserAction={true}
startInLoadingState={true}
onLoadEnd={() => {
this.setState({
loading: false,
})
}}
{...this.props}
style={[{width: _w}, {flex: 1},]}
/>
)
}
}