forked from lucasferreira/react-native-webview-android
-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.android.js
125 lines (105 loc) · 2.91 KB
/
index.android.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/**
* @providesModule WebViewAndroid
*/
import React, { Component } from 'react';
import {
requireNativeComponent,
NativeModules,
findNodeHandle,
View,
} from 'react-native';
const {
UIManager,
// RNWebViewAndroid,
} = NativeModules;
const RNWebViewAndroid = requireNativeComponent('RNWebViewAndroid', null);
const WebViewState = {
IDLE: 0,
LOADING: 1,
ERROR: 2,
};
// const WEBVIEW_REF = 'androidWebView';
class WebViewAndroid extends Component {
static propTypes = {
url: React.PropTypes.string,
source: React.PropTypes.object,
baseUrl: React.PropTypes.string,
html: React.PropTypes.string,
htmlCharset: React.PropTypes.string,
userAgent: React.PropTypes.string,
injectedJavaScript: React.PropTypes.string,
disablePlugins: React.PropTypes.bool,
disableCookies: React.PropTypes.bool,
javaScriptEnabled: React.PropTypes.bool,
geolocationEnabled: React.PropTypes.bool,
allowUrlRedirect: React.PropTypes.bool,
builtInZoomControls: React.PropTypes.bool,
onNavigationStateChange: React.PropTypes.func,
startInLoadingState: React.PropTypes.bool,
renderLoading: React.PropTypes.func,
};
static defaultProps = {
startInLoadingState: false,
};
constructor(props) {
super(props);
this.state = {
viewState: props.startInLoadingState ? WebViewState.LOADING : WebViewState.IDLE,
};
this._onNavigationStateChange = this._onNavigationStateChange.bind(this);
}
_onNavigationStateChange(event) {
if (event.loading && this.state.viewState !== WebViewState.LOADING) {
this.setState({ viewState: WebViewState.LOADING });
} else if (!event.loading && this.state.viewState === WebViewState.LOADING) {
this.setState({ viewState: WebViewState.IDLE });
}
if (this.props.onNavigationStateChange) {
this.props.onNavigationStateChange(event.nativeEvent);
}
}
goBack() {
UIManager.dispatchViewManagerCommand(
this._getWebViewHandle(),
UIManager.RNWebViewAndroid.Commands.goBack,
null
);
}
goForward() {
UIManager.dispatchViewManagerCommand(
this._getWebViewHandle(),
UIManager.RNWebViewAndroid.Commands.goForward,
null
);
}
reload() {
UIManager.dispatchViewManagerCommand(
this._getWebViewHandle(),
UIManager.RNWebViewAndroid.Commands.reload,
null
);
}
render() {
let otherView = null;
if (this.state.viewState === WebViewState.LOADING && this.props.renderLoading) {
otherView = this.props.renderLoading;
}
const webView = (
<RNWebViewAndroid
ref={(vw) => this.webViewRef = vw}
{...this.props}
onNavigationStateChange={this._onNavigationStateChange}
/>
);
return (
<View style={{ flex: 1 }}>
{webView}
{otherView}
</View>
);
}
_getWebViewHandle() {
return findNodeHandle(this.webViewRef);
}
}
export default WebViewAndroid;