react-native-ad-manager
Version:
A react-native component for Google Ad Manager banners, interstitials and native ads.
153 lines (150 loc) • 6.3 kB
JavaScript
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
import React from 'react';
import { findNodeHandle, requireNativeComponent, UIManager } from 'react-native';
import { TriggerableContext } from './TriggerableViewManager';
import { NativeAdsManager } from './NativeAdsManager';
import { createErrorFromErrorData, stripProperties } from '../utils';
import { LINKING_ERROR } from '../Constants';
/*
@property (nonatomic, copy) NSDictionary *targeting;
*/
const areSetsEqual = (a, b) => {
if (a.size !== b.size) return false;
for (const aItem of a) {
if (!b.has(aItem)) return false;
}
return true;
};
const ComponentName = 'CTKAdManageNative';
const NativeAdView = UIManager.getViewManagerConfig(ComponentName) != null ? requireNativeComponent(ComponentName) : () => {
// eslint-disable-next-line no-undef
throw new Error(LINKING_ERROR);
};
export default Component => class NativeAdWrapper extends React.Component {
constructor(props) {
super(props);
_defineProperty(this, "clickableChildrenNodeHandles", new Map());
_defineProperty(this, "registerClickableChild", child => {
const handle = findNodeHandle(child);
if (!handle) {
return;
}
this.clickableChildrenNodeHandles.set(child, handle);
this.setState({
clickableChildren: this.state.clickableChildren.add(handle)
});
});
_defineProperty(this, "unregisterClickableChild", child => {
this.setState(({
clickableChildren
}) => {
const newClickableChildren = new Set(clickableChildren);
newClickableChildren.delete(this.clickableChildrenNodeHandles.get(child));
this.clickableChildrenNodeHandles.delete(child);
return {
clickableChildren: newClickableChildren
};
});
});
_defineProperty(this, "handleSizeChange", ({
nativeEvent
}) => {
const {
height,
width
} = nativeEvent;
this.setState({
style: {
width,
height
}
});
this.props.onSizeChange && this.props.onSizeChange(nativeEvent);
});
_defineProperty(this, "handleAdLoaded", ({
nativeEvent
}) => {
this.setState({
nativeAd: nativeEvent
});
this.props.onAdLoaded && this.props.onAdLoaded(nativeEvent);
});
this.state = {
// iOS requires a non-null value
clickableChildren: new Set(),
style: {}
};
}
componentDidMount() {
this.reloadAd();
}
shouldComponentUpdate(nextProps, nextState) {
if (Object.entries(this.state).toString() === Object.entries(nextState).toString() && Object.entries(this.props).toString() === Object.entries(nextProps).toString()) {
return false;
}
return true;
}
componentDidUpdate(_, prevState) {
const clickableChildrenChanged = areSetsEqual(prevState.clickableChildren, this.state.clickableChildren);
if (clickableChildrenChanged) {
const viewHandle = findNodeHandle(this);
if (!viewHandle) {
// Skip registration if the view is no longer valid.
return;
}
NativeAdsManager.registerViewsForInteractionAsync(viewHandle, [...this.state.clickableChildren]).then(() => {
// do nothing for now
}).catch(() => {
// do nothing for now
});
}
}
reloadAd() {
UIManager.dispatchViewManagerCommand(findNodeHandle(this), UIManager.getViewManagerConfig(ComponentName).Commands.reloadAd, []);
}
renderAdComponent(componentProps) {
if (!this.state.nativeAd) {
return null;
}
return /*#__PURE__*/React.createElement(TriggerableContext.Provider, {
value: {
register: this.registerClickableChild,
unregister: this.unregisterClickableChild
}
}, /*#__PURE__*/React.createElement(Component, _extends({}, componentProps, {
nativeAd: this.state.nativeAd
})));
}
render() {
// Cast to any until https://github.com/Microsoft/TypeScript/issues/10727 is resolved
const _a = this.props,
{
adsManager
} = _a,
rest = stripProperties(_a, ['adsManager', 'onAdLoaded']);
return /*#__PURE__*/React.createElement(NativeAdView, {
style: [this.props.style, this.state.style],
adSize: this.props.adSize,
loaderIndex: this.props.adLoaderIndex,
correlator: this.props.correlator,
customTemplateIds: this.props.customTemplateIds,
validAdSizes: this.props.validAdSizes,
validAdTypes: this.props.validAdTypes,
onSizeChange: this.handleSizeChange,
onAdLoaded: this.handleAdLoaded,
onAdFailedToLoad: event => this.props.onAdFailedToLoad && this.props.onAdFailedToLoad(createErrorFromErrorData(event.nativeEvent.error)),
onAppEvent: event => this.props.onAppEvent && this.props.onAppEvent(event.nativeEvent),
onAdOpened: event => this.props.onAdOpened && this.props.onAdOpened(event.nativeEvent),
onAdClosed: event => this.props.onAdClosed && this.props.onAdClosed(event.nativeEvent),
onAdCustomClick: event => this.props.onAdCustomClick && this.props.onAdCustomClick(event.nativeEvent),
onAdRecordImpression: event => this.props.onAdRecordImpression && this.props.onAdRecordImpression(event.nativeEvent),
targeting: this.props.targeting,
customClickTemplateIds: this.props.customClickTemplateIds,
adsManager: adsManager.toJSON()
}, this.renderAdComponent(rest));
}
};
//# sourceMappingURL=withNativeAd.js.map