react-gpt-ads
Version:
Gpt library for react
222 lines (213 loc) • 8.84 kB
JavaScript
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = require('react');
var React__default = _interopDefault(React);
var internalNetworkCode = "";
var networkCode = {
get: function () { return internalNetworkCode; },
set: function (nc) { return internalNetworkCode = nc; }
};
var internalRefreshTimer = null;
var refreshTimer = {
get: function () { return internalRefreshTimer; },
set: function (rt) { return internalRefreshTimer = rt; }
};
var adsToRefresh = [];
var adFactory = function (adSlot, googletag, refreshTimer) {
var internalRefreshTimer = refreshTimer;
var internalGoogletag = googletag;
var instance = null;
var viewPercentage = 0;
var isLoopRun = false;
var isRefreshable = false;
var isImpressionViewable = false;
var setViewPercentage = function (vp) {
viewPercentage = vp;
};
var impressionViewable = function () {
isImpressionViewable = true;
};
var loop = function () {
if (isImpressionViewable && viewPercentage > 50) {
isLoopRun = true;
if (isRefreshable) {
internalGoogletag.pubads().refresh([adSlot]);
isRefreshable = false;
isImpressionViewable = false;
}
setTimeout(function () {
if (isImpressionViewable && viewPercentage > 50) {
internalGoogletag.pubads().refresh([adSlot]);
}
else {
isRefreshable = true;
}
isLoopRun = false;
}, internalRefreshTimer);
}
};
return {
runLoop: function () {
if (instance === null || !isLoopRun)
instance = new loop;
return instance;
},
setViewPercentage: setViewPercentage,
impressionViewable: impressionViewable,
adSlot: adSlot,
};
};
var pushAdSlotToRefresh = function (adSlot, refreshTimer, googletag) {
var adSlotToInsert = adFactory(adSlot, refreshTimer, googletag);
adsToRefresh.push(adSlotToInsert);
};
var refreshViewPercentage = function (event) {
var slot = event.slot, inViewPercentage = event.inViewPercentage;
var adIndex = adsToRefresh.findIndex(function (el) { return el.adSlot.getSlotElementId() === slot.getSlotElementId(); });
if (adIndex === -1)
return;
adsToRefresh[adIndex].setViewPercentage(inViewPercentage);
adsToRefresh[adIndex].runLoop();
};
var impressionViewable = function (event) {
var slot = event.slot;
var adIndex = adsToRefresh.findIndex(function (el) { return el.adSlot.getSlotElementId() === slot.getSlotElementId(); });
if (adIndex === -1)
return;
adsToRefresh[adIndex].impressionViewable();
adsToRefresh[adIndex].runLoop();
};
var GptConfig = function (_a) {
var networkCode$1 = _a.networkCode, refreshTimer$1 = _a.refreshTimer, _b = _a.target, target = _b === void 0 ? [] : _b, enableLazyLoad = _a.enableLazyLoad, enableSingleRequest = _a.enableSingleRequest, collapseEmptyDivs = _a.collapseEmptyDivs, eventImpressionViewable = _a.eventImpressionViewable, eventSlotOnload = _a.eventSlotOnload, eventSlotRenderEnded = _a.eventSlotRenderEnded, eventSlotRequested = _a.eventSlotRequested, eventSlotResponseReceived = _a.eventSlotResponseReceived, eventSlotVisibilityChanged = _a.eventSlotVisibilityChanged;
var googletag;
var setConfigs = function () {
if (networkCode$1)
networkCode.set(networkCode$1);
if (refreshTimer$1)
refreshTimer.set(refreshTimer$1);
if (enableLazyLoad)
googletag.pubads().enableLazyLoad(enableLazyLoad);
if (collapseEmptyDivs)
googletag.pubads().collapseEmptyDivs(true);
if (enableSingleRequest)
googletag.pubads().enableSingleRequest();
};
var setTargeting = function () {
target.forEach(function (el) {
return googletag.pubads().setTargeting(el[0], el[1]);
});
};
var setEvents = function () {
googletag.pubads().addEventListener("slotOnload", function (event) {
if (eventSlotOnload)
eventSlotOnload(event);
if (refreshTimer$1)
pushAdSlotToRefresh(event.slot, googletag, Number(refreshTimer$1));
});
googletag.pubads().addEventListener("slotVisibilityChanged", function (event) {
if (eventSlotVisibilityChanged)
eventSlotVisibilityChanged(event);
if (refreshTimer$1)
refreshViewPercentage(event);
});
googletag.pubads().addEventListener("impressionViewable", function (event) {
if (eventImpressionViewable)
eventImpressionViewable(event);
if (refreshTimer$1)
impressionViewable(event);
});
if (eventSlotRenderEnded)
googletag.pubads().addEventListener("slotRenderEnded", eventSlotRenderEnded);
if (eventSlotRequested)
googletag.pubads().addEventListener("slotRequested", eventSlotRequested);
if (eventSlotResponseReceived)
googletag.pubads().addEventListener("slotResponseReceived", eventSlotResponseReceived);
};
React.useEffect(function () {
window.googletag = window.googletag || { cmd: [] };
googletag = window.googletag;
googletag.cmd.push(function () {
setConfigs();
setEvents();
setTargeting();
googletag.enableServices();
});
}, []);
return null;
};
var GptScript = function () {
return React__default.createElement("script", { async: true, src: "https://securepubads.g.doubleclick.net/tag/js/gpt.js" });
};
// eslint-disable-next-line react/prop-types
var Gpt = function (_a) {
var adUnit = _a.adUnit, name = _a.name, _b = _a.target, target = _b === void 0 ? [] : _b, type = _a.type, size = _a.size;
var googletag;
var adSlot = null;
var displayCommonAd = function () {
googletag.cmd.push(function () {
adSlot = googletag
.defineSlot(networkCode.get() + "/" + adUnit, generateSize(), name)
.addService(googletag.pubads());
mappingSize();
setTargeting();
googletag.enableServices();
googletag.display(name);
});
};
var displayEspecialAd = function () {
googletag.cmd.push(function () {
adSlot = googletag.defineOutOfPageSlot(networkCode.get() + "/" + adUnit, googletag.enums.OutOfPageFormat[type]);
if (!adSlot)
return;
setTargeting();
adSlot.addService(googletag.pubads());
});
};
var setTargeting = function () {
target.forEach(function (el) {
return googletag.pubads().setTargeting(el[0], el[1]);
});
};
var generateSize = function () {
var internalSize = size;
if (!(typeof internalSize === "object" && typeof internalSize[0][1] === "object"))
return size;
return internalSize.reduce(function (uniqueSizes, elSize) {
var haveSize = !!uniqueSizes.find(function (mapSize) { return mapSize[0] === elSize[0] && mapSize[0] === elSize[0]; });
if (haveSize)
uniqueSizes.push(haveSize);
return uniqueSizes;
}, []);
};
var mappingSize = function () {
var internalSize = size;
if (!(typeof internalSize === "object" && typeof internalSize[0][1] === "object"))
return;
var mapping = googletag.sizeMapping();
internalSize.forEach(function (el) {
return mapping = mapping.addSize(el);
});
mapping = mapping.build();
adSlot.defineSizeMapping(mapping);
};
React.useEffect(function () {
window.googletag = window.googletag || { cmd: [] };
googletag = window.googletag;
googletag.cmd.push(function () {
// eslint-disable-next-line react/prop-types
type ? displayEspecialAd() : displayCommonAd();
});
}, []);
React.useEffect(function () {
return function () {
googletag.destroySlots([adSlot]);
};
}, []);
if (type)
return null;
return (React__default.createElement("div", { id: name }));
};
exports.Gpt = Gpt;
exports.GptConfig = GptConfig;
exports.GptScript = GptScript;
//# sourceMappingURL=index.js.map