Skip to content

Clone to react-native webview that allows the blocking, and handling of navigation based on a set of policies

Notifications You must be signed in to change notification settings

SuperBesse/react-native-blockable-webview

 
 

Repository files navigation

react-native-blockable-webview

Note :

React Native issues & pull requests :


A component for React Native that extends WebView and allow the blocking of navigation to urls based on rules passed via props. This allows the loading control to be done from the JavaScript side without having to rely on some possible faulty methods, such as mentioned here.

Usage

BlockableWebView component receives all the WebView props plus three more:

  • availableHosts which is an array with available hosts. If current url host is not set, BlockableWebView try to open an intent.

  • navigationBlockingPolicies which is an array with the policies that will be used to block the navigation. A policy is an object that contains Regular Expressions that will be used to check the state; currentURL, url and navigationType (iOS only).

  • onNavigationBlocked which is the callback function that will be called once at least one of the policies is fulfilled. It receives the NativeEvent just at any other WebView loading callback.

For further uses please check the example project.

import React, { Component } from 'react';
import {
  StyleSheet,
  View,
  Linking,
} from 'react-native';

import BlockableWebView from 'react-native-blockable-webview';

const POLICY = [
  {
    // blocks navigation to login page
    url: 'https://github.com/login.*',
  }, {
    // blocks any navigation to url that doesn't contain github.com
    url: '^((?!(github.com)).)*$',
  }
];

const AVAILABLE_HOSTS = ['https://'];

export default class Controlled extends Component {
  constructor(props) {
    super(props);

    this.onNavigationBlocked = this.onNavigationBlocked.bind(this);
  }

  onNavigationBlocked({ nativeEvent }) {
    const { url } = nativeEvent;

    const hostname = new URL(url).hostname;

    if (hostname === 'github.com') {
      /* this would only happen for requests to the login url. We can take the user to a RN view that will handle that, for example */
      return;
    }

    // Url isn't inside github.com, open it in the browser
    Linking.openURL(url);
  }

  render() {
    const source = { uri: 'https://github.com/rseemann/react-native-blockable-webview'};

    return (
      <View style={styles.container}>
        <BlockableWebView
          style={styles.webview}
          source={source}
          availableHosts={AVAILABLE_HOSTS}
          navigationBlockingPolicies={POLICY}
          onNavigationBlocked={this.onNavigationBlocked}
        />
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'stretch',
    backgroundColor: '#F5FCFF',
  },
  webview: {
    marginTop: 20,
    flex: 1,
  },
});

About

Clone to react-native webview that allows the blocking, and handling of navigation based on a set of policies

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 39.0%
  • Objective-C 32.8%
  • JavaScript 25.7%
  • Python 2.5%