Skip to content

Commit 1714f78

Browse files
committed
follow ui component event pattern to dispatch webview messages to RN
1 parent 6271366 commit 1714f78

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed
Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
package com.github.alinz.reactnativewebviewbridge;
22

33
import android.webkit.JavascriptInterface;
4+
import android.webkit.WebView;
45

56
import com.facebook.react.bridge.Arguments;
67
import com.facebook.react.bridge.ReactContext;
78
import com.facebook.react.bridge.WritableMap;
89
import com.facebook.react.modules.core.DeviceEventManagerModule;
10+
import com.facebook.react.uimanager.events.RCTEventEmitter;
911

1012
class JavascriptBridge {
11-
private ReactContext context;
13+
private WebView webView;
1214

13-
public JavascriptBridge(ReactContext context) {
14-
this.context = context;
15-
}
15+
public JavascriptBridge(WebView webView) {
16+
this.webView = webView;
17+
}
1618

17-
@JavascriptInterface
18-
public void send(String message) {
19-
WritableMap params = Arguments.createMap();
20-
params.putString("message", message);
21-
context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
22-
.emit("webViewBridgeMessage", params);
23-
}
24-
}
19+
@JavascriptInterface
20+
public void send(String message) {
21+
WritableMap event = Arguments.createMap();
22+
event.putString("message", message);
23+
ReactContext reactContext = (ReactContext) this.webView.getContext();
24+
reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
25+
this.webView.getId(),
26+
"topChange",
27+
event);
28+
}
29+
}

webview-bridge/index.android.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ var WebViewBridge = React.createClass({
6565
};
6666
},
6767

68+
6869
componentWillMount: function() {
6970
DeviceEventEmitter.addListener("webViewBridgeMessage", (body) => {
7071
const { onBridgeMessage } = this.props;
@@ -117,12 +118,14 @@ var WebViewBridge = React.createClass({
117118
<RCTWebViewBridge
118119
ref={RCT_WEBVIEWBRIDGE_REF}
119120
key="webViewKey"
121+
javaScriptEnabled={true}
120122
{...props}
121123
source={resolveAssetSource(source)}
122124
style={webViewStyles}
123125
onLoadingStart={this.onLoadingStart}
124126
onLoadingFinish={this.onLoadingFinish}
125127
onLoadingError={this.onLoadingError}
128+
onChange={this.onMessage}
126129
/>;
127130

128131
return (
@@ -133,6 +136,12 @@ var WebViewBridge = React.createClass({
133136
);
134137
},
135138

139+
onMessage(event) {
140+
if (this.props.onBridgeMessage != null && event.nativeEvent != null) {
141+
this.props.onBridgeMessage(event.nativeEvent.message)
142+
}
143+
},
144+
136145
goForward: function() {
137146
UIManager.dispatchViewManagerCommand(
138147
this.getWebViewBridgeHandle(),
@@ -199,7 +208,6 @@ var WebViewBridge = React.createClass({
199208
var {onError, onLoadEnd} = this.props;
200209
onError && onError(event);
201210
onLoadEnd && onLoadEnd(event);
202-
console.error('Encountered an error loading page', event.nativeEvent);
203211

204212
this.setState({
205213
lastErrorEvent: event.nativeEvent,
@@ -230,4 +238,4 @@ var styles = StyleSheet.create({
230238
},
231239
});
232240

233-
module.exports = WebViewBridge;
241+
module.exports = WebViewBridge;

0 commit comments

Comments
 (0)