all files / firebase/modules/admob/ AdMobComponent.js

26.09% Statements 6/23
0% Branches 0/10
28.57% Functions 2/7
27.27% Lines 6/22
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                                  10×   10×                                                                                                                                                          
import React from 'react';
import { ViewPropTypes, requireNativeComponent } from 'react-native';
import PropTypes from 'prop-types';
import EventTypes, { NativeExpressEventTypes } from './EventTypes';
import { nativeToJSError } from '../../utils';
 
import AdRequest from './AdRequest';
import VideoOptions from './VideoOptions';
 
const adMobPropTypes = {
  ...ViewPropTypes,
  size: PropTypes.string.isRequired,
  unitId: PropTypes.string.isRequired,
  /* eslint-disable react/forbid-prop-types */
  request: PropTypes.object,
  video: PropTypes.object,
  /* eslint-enable react/forbid-prop-types */
};
Object.keys(EventTypes).forEach(eventType => {
  adMobPropTypes[eventType] = PropTypes.func;
});
Object.keys(NativeExpressEventTypes).forEach(eventType => {
  adMobPropTypes[eventType] = PropTypes.func;
});
 
const nativeComponents = {};
 
function getNativeComponent(name) {
  if (nativeComponents[name]) return nativeComponents[name];
  const component = requireNativeComponent(name, AdMobComponent, {
    nativeOnly: {
      onBannerEvent: true,
    },
  });
  nativeComponents[name] = component;
  return component;
}
 
class AdMobComponent extends React.Component {
  static propTypes = adMobPropTypes;
 
  static defaultProps = {
    request: new AdRequest().addTestDevice().build(),
    video: new VideoOptions().build(),
  };
 
  constructor(props) {
    super(props);
    this.state = {
      width: 0,
      height: 0,
    };
 
    this.nativeView = getNativeComponent(props.class);
  }
 
  /**
   * Handle a single banner event and pass to
   * any props watching it
   * @param nativeEvent
   */
  onBannerEvent = ({ nativeEvent }) => {
    if (this.props[nativeEvent.type]) {
      if (nativeEvent.type === 'onAdFailedToLoad') {
        const { code, message } = nativeEvent.payload;
        this.props[nativeEvent.type](nativeToJSError(code, message));
      } else {
        this.props[nativeEvent.type](nativeEvent.payload || {});
      }
    }
 
    if (nativeEvent.type === 'onSizeChange')
      this.updateSize(nativeEvent.payload);
  };
 
  /**
   * Set the JS size of the loaded banner
   * @param width
   * @param height
   */
  updateSize = ({ width, height }) => {
    this.setState({ width, height });
  };
 
  /**
   * Render the native component
   * @returns {XML}
   */
  render() {
    return (
      <this.nativeView
        {...this.props}
        style={[this.props.style, { ...this.state }]}
        onBannerEvent={this.onBannerEvent}
      />
    );
  }
}
 
export default AdMobComponent;