Search code examples
reactjsadblock

AdBlock into ReactJs


I'm struggling to find a solution without any progress until now . I am trying to catch if the user has an AdBlocker and if it does i want to display a message advising him to turn it off. But , until now no success .

i import my component into my main container like :

<DetectAdBlock pathname={window.location.pathname} />

and then this is my adblocker.js

import React from 'react';
import PropTypes from 'prop-types'

class DetectAdBlock extends React.Component {

    static propTypes = {
        pathname: PropTypes.string.isRequired
};

    constructor(props) {
        super(props);
        this.state = {
            adBlockDetected: false
        }
        this.detectAdBlocker = this.detectAdBlocker.bind(this);
   }
    componentDidMount() {
        this.detectAdBlocker();
    }
    componentWillUpdate(nextProps, nextState) {
        if (this.props.pathname !== nextProps.pathname) {
            this.detectAdBlocker();
        }
    }
    detectAdBlocker() {
        const head = document.getElementsByTagName('head')[0];

        const noAdBlockDetected = () => {
            this.setState({
                adBlockDetected: false
            });
        }
        const adBlockDetected = () => {
            this.setState({
                adBlockDetected: true
            });
        }
        // clean up stale bait
        const oldScript = 
            document.getElementById('adblock-detection');
        if (oldScript) {
            head.removeChild(oldScript);
        }
        // we will dynamically generate some 'bait'.
        const script = document.createElement('script');
        script.id = 'adblock-detection';
        script.type = 'text/javascript';
        script.src = '/ads.js';
        script.onload = noAdBlockDetected;
        script.onerror = adBlockDetected;
        head.appendChild(script);
    }
    noticeContentJSX() {
        return (
            <div id="adblock-notice">
                <div className="message">
                    <h3>Hey, you!</h3>
                    <p>Your adblocker is on again.</p>
                    <button 
                        onClick={this.detectAdBlocker}
                    >
                        Check for Adblocker again
                    </button>
                </div>
            </div>
        );
    }
    render() {
        return (
            <div id="adblock-wrapper">
                { this.state.adBlockDetected 
                  ? this.noticeContentJSX()
                  : null
                }
            </div>
        )
    }
}
// DetectAdBlock.propTypes = {
//     pathname: PropTypes.string.isRequired
// };

DetectAdBlock.defaultProps = {
    pathname: ''
}
export default DetectAdBlock;

The problem is that there is nothing to show either i have my AdBlock enabled .


Solution

  • I think it should be easier than that. I can't actually test this as I'm at work with adblock off but something like this should work:

    class AdblockDetect extends Component {
      state = {
        usingAdblock: false,
      }
    
      componentDidMount() {
        this.setState({ usingAdblock: this.fakeAdBanner.offsetHeight === 0 });
      }
    
      render() {
        if (this.state.usingAdblock === true) {
          return this.props.children;
        }
    
        return (
          <div
            ref={r => (this.fakeAdBanner = r)}
            style={{ height: '1px', width: '1px', visiblity: 'none', pointerEvents: 'none' }}
            className="adBanner"
          />
        );
      }
    }
    
    class App extends Component {
      render() {
        return (
          <div className="App">
            <AdblockDetect>You are using adblock</AdblockDetect>
          </div>
        );
      }
    }