|  | @@ -1,6 +1,6 @@
 | 
	
		
			
			| 1 |  | -"use strict";
 | 
	
		
			
			|  | 1 | +'use strict';
 | 
	
		
			
			| 2 | 2 |  
 | 
	
		
			
			| 3 |  | -import React, { PureComponent } from "react";
 | 
	
		
			
			|  | 3 | +import React, { PureComponent } from 'react';
 | 
	
		
			
			| 4 | 4 |  
 | 
	
		
			
			| 5 | 5 |  import {
 | 
	
		
			
			| 6 | 6 |    findNodeHandle,
 | 
	
	
		
			
			|  | @@ -14,26 +14,22 @@ import {
 | 
	
		
			
			| 14 | 14 |    View,
 | 
	
		
			
			| 15 | 15 |    ViewPropTypes,
 | 
	
		
			
			| 16 | 16 |    WebView
 | 
	
		
			
			| 17 |  | -} from "react-native";
 | 
	
		
			
			|  | 17 | +} from 'react-native';
 | 
	
		
			
			| 18 | 18 |  
 | 
	
		
			
			| 19 |  | -import PropTypes from "prop-types";
 | 
	
		
			
			|  | 19 | +import PropTypes from 'prop-types';
 | 
	
		
			
			| 20 | 20 |  
 | 
	
		
			
			| 21 |  | -import Immutable from "immutable";
 | 
	
		
			
			|  | 21 | +import Immutable from 'immutable';
 | 
	
		
			
			| 22 | 22 |  
 | 
	
		
			
			| 23 |  | -const RCTAutoHeightWebView = requireNativeComponent(
 | 
	
		
			
			| 24 |  | -  "RCTAutoHeightWebView",
 | 
	
		
			
			| 25 |  | -  AutoHeightWebView,
 | 
	
		
			
			| 26 |  | -  { nativeOnly:
 | 
	
		
			
			| 27 |  | -    {
 | 
	
		
			
			| 28 |  | -      nativeOnly: {
 | 
	
		
			
			| 29 |  | -        onLoadingStart: true,
 | 
	
		
			
			| 30 |  | -        onLoadingError: true,
 | 
	
		
			
			| 31 |  | -        onLoadingFinish: true,
 | 
	
		
			
			| 32 |  | -        messagingEnabled: PropTypes.bool
 | 
	
		
			
			| 33 |  | -      }
 | 
	
		
			
			|  | 23 | +const RCTAutoHeightWebView = requireNativeComponent('RCTAutoHeightWebView', AutoHeightWebView, {
 | 
	
		
			
			|  | 24 | +  nativeOnly: {
 | 
	
		
			
			|  | 25 | +    nativeOnly: {
 | 
	
		
			
			|  | 26 | +      onLoadingStart: true,
 | 
	
		
			
			|  | 27 | +      onLoadingError: true,
 | 
	
		
			
			|  | 28 | +      onLoadingFinish: true,
 | 
	
		
			
			|  | 29 | +      messagingEnabled: PropTypes.bool
 | 
	
		
			
			| 34 | 30 |      }
 | 
	
		
			
			| 35 |  | -   }
 | 
	
		
			
			| 36 |  | -);
 | 
	
		
			
			|  | 31 | +  }
 | 
	
		
			
			|  | 32 | +});
 | 
	
		
			
			| 37 | 33 |  
 | 
	
		
			
			| 38 | 34 |  export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 39 | 35 |    static propTypes = {
 | 
	
	
		
			
			|  | @@ -46,7 +42,7 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 46 | 42 |      scalesPageToFit: PropTypes.bool,
 | 
	
		
			
			| 47 | 43 |      // only works on enable animation
 | 
	
		
			
			| 48 | 44 |      animationDuration: PropTypes.number,
 | 
	
		
			
			| 49 |  | -    // offset of rn webview margin
 | 
	
		
			
			|  | 45 | +    // offset of rn webView margin
 | 
	
		
			
			| 50 | 46 |      heightOffset: PropTypes.number,
 | 
	
		
			
			| 51 | 47 |      // baseUrl not work in android 4.3 or below version
 | 
	
		
			
			| 52 | 48 |      enableBaseUrl: PropTypes.bool,
 | 
	
	
		
			
			|  | @@ -81,16 +77,10 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 81 | 77 |        this.opacityAnimatedValue = new Animated.Value(0);
 | 
	
		
			
			| 82 | 78 |      }
 | 
	
		
			
			| 83 | 79 |      if (IsBelowKitKat) {
 | 
	
		
			
			| 84 |  | -      this.listenWebViewBridgeMessage = this.listenWebViewBridgeMessage.bind(
 | 
	
		
			
			| 85 |  | -        this
 | 
	
		
			
			| 86 |  | -      );
 | 
	
		
			
			|  | 80 | +      this.listenWebViewBridgeMessage = this.listenWebViewBridgeMessage.bind(this);
 | 
	
		
			
			| 87 | 81 |      }
 | 
	
		
			
			| 88 |  | -    let initialScript = props.files
 | 
	
		
			
			| 89 |  | -      ? this.appendFilesToHead(props.files, BaseScript)
 | 
	
		
			
			| 90 |  | -      : BaseScript;
 | 
	
		
			
			| 91 |  | -    initialScript = props.customStyle
 | 
	
		
			
			| 92 |  | -      ? this.appendStylesToHead(props.customStyle, initialScript)
 | 
	
		
			
			| 93 |  | -      : initialScript;
 | 
	
		
			
			|  | 82 | +    let initialScript = props.files ? this.appendFilesToHead(props.files, BaseScript) : BaseScript;
 | 
	
		
			
			|  | 83 | +    initialScript = props.customStyle ? this.appendStylesToHead(props.customStyle, initialScript) : initialScript;
 | 
	
		
			
			| 94 | 84 |      this.state = {
 | 
	
		
			
			| 95 | 85 |        isChangingSource: false,
 | 
	
		
			
			| 96 | 86 |        height: 0,
 | 
	
	
		
			
			|  | @@ -101,10 +91,7 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 101 | 91 |  
 | 
	
		
			
			| 102 | 92 |    componentWillMount() {
 | 
	
		
			
			| 103 | 93 |      if (IsBelowKitKat) {
 | 
	
		
			
			| 104 |  | -      DeviceEventEmitter.addListener(
 | 
	
		
			
			| 105 |  | -        "webViewBridgeMessage",
 | 
	
		
			
			| 106 |  | -        this.listenWebViewBridgeMessage
 | 
	
		
			
			| 107 |  | -      );
 | 
	
		
			
			|  | 94 | +      DeviceEventEmitter.addListener('webViewBridgeMessage', this.listenWebViewBridgeMessage);
 | 
	
		
			
			| 108 | 95 |      }
 | 
	
		
			
			| 109 | 96 |    }
 | 
	
		
			
			| 110 | 97 |  
 | 
	
	
		
			
			|  | @@ -113,13 +100,8 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 113 | 100 |    }
 | 
	
		
			
			| 114 | 101 |  
 | 
	
		
			
			| 115 | 102 |    componentWillReceiveProps(nextProps) {
 | 
	
		
			
			| 116 |  | -    // injectedJavaScript only works when webview reload (source changed)
 | 
	
		
			
			| 117 |  | -    if (
 | 
	
		
			
			| 118 |  | -      Immutable.is(
 | 
	
		
			
			| 119 |  | -        Immutable.fromJS(this.props.source),
 | 
	
		
			
			| 120 |  | -        Immutable.fromJS(nextProps.source)
 | 
	
		
			
			| 121 |  | -      )
 | 
	
		
			
			| 122 |  | -    ) {
 | 
	
		
			
			|  | 103 | +    // injectedJavaScript only works when webView reload (source changed)
 | 
	
		
			
			|  | 104 | +    if (Immutable.is(Immutable.fromJS(this.props.source), Immutable.fromJS(nextProps.source))) {
 | 
	
		
			
			| 123 | 105 |        return;
 | 
	
		
			
			| 124 | 106 |      } else {
 | 
	
		
			
			| 125 | 107 |        this.setState(
 | 
	
	
		
			
			|  | @@ -147,10 +129,7 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 147 | 129 |    componentWillUnmount() {
 | 
	
		
			
			| 148 | 130 |      this.stopInterval();
 | 
	
		
			
			| 149 | 131 |      if (IsBelowKitKat) {
 | 
	
		
			
			| 150 |  | -      DeviceEventEmitter.removeListener(
 | 
	
		
			
			| 151 |  | -        "webViewBridgeMessage",
 | 
	
		
			
			| 152 |  | -        this.listenWebViewBridgeMessage
 | 
	
		
			
			| 153 |  | -      );
 | 
	
		
			
			|  | 132 | +      DeviceEventEmitter.removeListener('webViewBridgeMessage', this.listenWebViewBridgeMessage);
 | 
	
		
			
			| 154 | 133 |      }
 | 
	
		
			
			| 155 | 134 |    }
 | 
	
		
			
			| 156 | 135 |  
 | 
	
	
		
			
			|  | @@ -162,7 +141,7 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 162 | 141 |    // below kitkat
 | 
	
		
			
			| 163 | 142 |    sendToWebView(message) {
 | 
	
		
			
			| 164 | 143 |      UIManager.dispatchViewManagerCommand(
 | 
	
		
			
			| 165 |  | -      findNodeHandle(this.webview),
 | 
	
		
			
			|  | 144 | +      findNodeHandle(this.webView),
 | 
	
		
			
			| 166 | 145 |        UIManager.RCTAutoHeightWebView.Commands.sendToWebView,
 | 
	
		
			
			| 167 | 146 |        [String(message)]
 | 
	
		
			
			| 168 | 147 |      );
 | 
	
	
		
			
			|  | @@ -170,7 +149,7 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 170 | 149 |  
 | 
	
		
			
			| 171 | 150 |    postMessage(data) {
 | 
	
		
			
			| 172 | 151 |      UIManager.dispatchViewManagerCommand(
 | 
	
		
			
			| 173 |  | -      findNodeHandle(this.webview),
 | 
	
		
			
			|  | 152 | +      findNodeHandle(this.webView),
 | 
	
		
			
			| 174 | 153 |        UIManager.RCTAutoHeightWebView.Commands.postMessage,
 | 
	
		
			
			| 175 | 154 |        [String(data)]
 | 
	
		
			
			| 176 | 155 |      );
 | 
	
	
		
			
			|  | @@ -180,9 +159,7 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 180 | 159 |      this.finishInterval = false;
 | 
	
		
			
			| 181 | 160 |      this.interval = setInterval(() => {
 | 
	
		
			
			| 182 | 161 |        if (!this.finishInterval) {
 | 
	
		
			
			| 183 |  | -        IsBelowKitKat
 | 
	
		
			
			| 184 |  | -          ? this.sendToWebView("getBodyHeight")
 | 
	
		
			
			| 185 |  | -          : this.postMessage("getBodyHeight");
 | 
	
		
			
			|  | 162 | +        IsBelowKitKat ? this.sendToWebView('getBodyHeight') : this.postMessage('getBodyHeight');
 | 
	
		
			
			| 186 | 163 |        }
 | 
	
		
			
			| 187 | 164 |      }, 205);
 | 
	
		
			
			| 188 | 165 |    }
 | 
	
	
		
			
			|  | @@ -199,9 +176,7 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 199 | 176 |    }
 | 
	
		
			
			| 200 | 177 |  
 | 
	
		
			
			| 201 | 178 |    onMessage(e) {
 | 
	
		
			
			| 202 |  | -    const height = parseInt(
 | 
	
		
			
			| 203 |  | -      IsBelowKitKat ? e.nativeEvent.message : e.nativeEvent.data
 | 
	
		
			
			| 204 |  | -    );
 | 
	
		
			
			|  | 179 | +    const height = parseInt(IsBelowKitKat ? e.nativeEvent.message : e.nativeEvent.data);
 | 
	
		
			
			| 205 | 180 |      if (height) {
 | 
	
		
			
			| 206 | 181 |        if (this.props.enableAnimation) {
 | 
	
		
			
			| 207 | 182 |          this.opacityAnimatedValue.setValue(0);
 | 
	
	
		
			
			|  | @@ -230,14 +205,17 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 230 | 205 |      if (!files) {
 | 
	
		
			
			| 231 | 206 |        return script;
 | 
	
		
			
			| 232 | 207 |      }
 | 
	
		
			
			| 233 |  | -    return files.reduceRight((file, combinedScript) => `
 | 
	
		
			
			|  | 208 | +    return files.reduceRight(
 | 
	
		
			
			|  | 209 | +      (file, combinedScript) => `
 | 
	
		
			
			| 234 | 210 |        var link  = document.createElement('link');
 | 
	
		
			
			| 235 | 211 |        link.rel  = '${file.rel}';
 | 
	
		
			
			| 236 | 212 |        link.type = '${file.type}';
 | 
	
		
			
			| 237 | 213 |        link.href = '${file.href}';
 | 
	
		
			
			| 238 | 214 |        document.head.appendChild(link);
 | 
	
		
			
			| 239 | 215 |        ${combinedScript}
 | 
	
		
			
			| 240 |  | -    `, script);
 | 
	
		
			
			|  | 216 | +    `,
 | 
	
		
			
			|  | 217 | +      script
 | 
	
		
			
			|  | 218 | +    );
 | 
	
		
			
			| 241 | 219 |    }
 | 
	
		
			
			| 242 | 220 |  
 | 
	
		
			
			| 243 | 221 |    appendStylesToHead(styles, script) {
 | 
	
	
		
			
			|  | @@ -245,7 +223,7 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 245 | 223 |        return script;
 | 
	
		
			
			| 246 | 224 |      }
 | 
	
		
			
			| 247 | 225 |      // Escape any single quotes or newlines in the CSS with .replace()
 | 
	
		
			
			| 248 |  | -    const escaped = styles.replace(/\'/g, "\\'").replace(/\n/g, '\\n')
 | 
	
		
			
			|  | 226 | +    const escaped = styles.replace(/\'/g, "\\'").replace(/\n/g, '\\n');
 | 
	
		
			
			| 249 | 227 |      return `
 | 
	
		
			
			| 250 | 228 |        var styleElement = document.createElement('style');
 | 
	
		
			
			| 251 | 229 |        var styleText = document.createTextNode('${escaped}');
 | 
	
	
		
			
			|  | @@ -255,38 +233,41 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 255 | 233 |      `;
 | 
	
		
			
			| 256 | 234 |    }
 | 
	
		
			
			| 257 | 235 |  
 | 
	
		
			
			| 258 |  | -  onLoadingStart = (event) => {
 | 
	
		
			
			|  | 236 | +  onLoadingStart = event => {
 | 
	
		
			
			| 259 | 237 |      var onLoadStart = this.props.onLoadStart;
 | 
	
		
			
			| 260 | 238 |      onLoadStart && onLoadStart(event);
 | 
	
		
			
			| 261 | 239 |    };
 | 
	
		
			
			| 262 | 240 |  
 | 
	
		
			
			| 263 |  | -  onLoadingError = (event) => {
 | 
	
		
			
			| 264 |  | -    var {onError, onLoadEnd} = this.props;
 | 
	
		
			
			|  | 241 | +  onLoadingError = event => {
 | 
	
		
			
			|  | 242 | +    var { onError, onLoadEnd } = this.props;
 | 
	
		
			
			| 265 | 243 |      onError && onError(event);
 | 
	
		
			
			| 266 | 244 |      onLoadEnd && onLoadEnd(event);
 | 
	
		
			
			| 267 | 245 |      console.warn('Encountered an error loading page', event.nativeEvent);
 | 
	
		
			
			| 268 | 246 |    };
 | 
	
		
			
			| 269 | 247 |  
 | 
	
		
			
			| 270 |  | -  onLoadingFinish = (event) => {
 | 
	
		
			
			| 271 |  | -    var {onLoad, onLoadEnd} = this.props;
 | 
	
		
			
			|  | 248 | +  onLoadingFinish = event => {
 | 
	
		
			
			|  | 249 | +    var { onLoad, onLoadEnd } = this.props;
 | 
	
		
			
			| 272 | 250 |      onLoad && onLoad(event);
 | 
	
		
			
			| 273 | 251 |      onLoadEnd && onLoadEnd(event);
 | 
	
		
			
			| 274 | 252 |    };
 | 
	
		
			
			| 275 | 253 |  
 | 
	
		
			
			|  | 254 | +  getWebView = webView => (this.webView = webView);
 | 
	
		
			
			|  | 255 | +
 | 
	
		
			
			|  | 256 | +  stopLoading() {
 | 
	
		
			
			|  | 257 | +    UIManager.dispatchViewManagerCommand(
 | 
	
		
			
			|  | 258 | +      findNodeHandle(this.webView),
 | 
	
		
			
			|  | 259 | +      UIManager.RCTAutoHeightWebView.Commands.stopLoading,
 | 
	
		
			
			|  | 260 | +      null
 | 
	
		
			
			|  | 261 | +    );
 | 
	
		
			
			|  | 262 | +  }
 | 
	
		
			
			|  | 263 | +
 | 
	
		
			
			| 276 | 264 |    render() {
 | 
	
		
			
			| 277 | 265 |      const { height, script, isChangingSource, heightOffset } = this.state;
 | 
	
		
			
			| 278 |  | -    const {
 | 
	
		
			
			| 279 |  | -      scalesPageToFit,
 | 
	
		
			
			| 280 |  | -      enableAnimation,
 | 
	
		
			
			| 281 |  | -      source,
 | 
	
		
			
			| 282 |  | -      customScript,
 | 
	
		
			
			| 283 |  | -      style,
 | 
	
		
			
			| 284 |  | -      enableBaseUrl
 | 
	
		
			
			| 285 |  | -    } = this.props;
 | 
	
		
			
			|  | 266 | +    const { scalesPageToFit, enableAnimation, source, customScript, style, enableBaseUrl } = this.props;
 | 
	
		
			
			| 286 | 267 |      let webViewSource = source;
 | 
	
		
			
			| 287 | 268 |      if (enableBaseUrl) {
 | 
	
		
			
			| 288 | 269 |        webViewSource = Object.assign({}, source, {
 | 
	
		
			
			| 289 |  | -        baseUrl: "file:///android_asset/web/"
 | 
	
		
			
			|  | 270 | +        baseUrl: 'file:///android_asset/web/'
 | 
	
		
			
			| 290 | 271 |        });
 | 
	
		
			
			| 291 | 272 |      }
 | 
	
		
			
			| 292 | 273 |      return (
 | 
	
	
		
			
			|  | @@ -305,7 +286,7 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 305 | 286 |              onLoadingStart={this.onLoadingStart}
 | 
	
		
			
			| 306 | 287 |              onLoadingFinish={this.onLoadingFinish}
 | 
	
		
			
			| 307 | 288 |              onLoadingError={this.onLoadingError}
 | 
	
		
			
			| 308 |  | -            ref={webview => (this.webview = webview)}
 | 
	
		
			
			|  | 289 | +            ref={this.getWebView}
 | 
	
		
			
			| 309 | 290 |              style={Styles.webView}
 | 
	
		
			
			| 310 | 291 |              javaScriptEnabled={true}
 | 
	
		
			
			| 311 | 292 |              injectedJavaScript={script + customScript}
 | 
	
	
		
			
			|  | @@ -322,18 +303,18 @@ export default class AutoHeightWebView extends PureComponent {
 | 
	
		
			
			| 322 | 303 |    }
 | 
	
		
			
			| 323 | 304 |  }
 | 
	
		
			
			| 324 | 305 |  
 | 
	
		
			
			| 325 |  | -const ScreenWidth = Dimensions.get("window").width;
 | 
	
		
			
			|  | 306 | +const ScreenWidth = Dimensions.get('window').width;
 | 
	
		
			
			| 326 | 307 |  
 | 
	
		
			
			| 327 | 308 |  const IsBelowKitKat = Platform.Version < 19;
 | 
	
		
			
			| 328 | 309 |  
 | 
	
		
			
			| 329 | 310 |  const Styles = StyleSheet.create({
 | 
	
		
			
			| 330 | 311 |    container: {
 | 
	
		
			
			| 331 | 312 |      width: ScreenWidth,
 | 
	
		
			
			| 332 |  | -    backgroundColor: "transparent"
 | 
	
		
			
			|  | 313 | +    backgroundColor: 'transparent'
 | 
	
		
			
			| 333 | 314 |    },
 | 
	
		
			
			| 334 | 315 |    webView: {
 | 
	
		
			
			| 335 | 316 |      flex: 1,
 | 
	
		
			
			| 336 |  | -    backgroundColor: "transparent"
 | 
	
		
			
			|  | 317 | +    backgroundColor: 'transparent'
 | 
	
		
			
			| 337 | 318 |    }
 | 
	
		
			
			| 338 | 319 |  });
 | 
	
		
			
			| 339 | 320 |  
 |