discourse-adplugin/assets/javascripts/discourse/components/google-dfp-ad.js.es6

211 lines
8.4 KiB
JavaScript
Executable File

import loadScript from 'discourse/lib/load-script';
var currentUser = Discourse.User.current(),
_loaded = false,
_promise = null,
ads = {};
function splitWidthInt(value) {
var str = value.substring(0, 3);
return str.trim();
}
function splitHeightInt(value) {
var str = value.substring(4, 7);
return str.trim();
}
// This creates an array for the values of the custom targeting key
function valueParse(value) {
var final = value.replace(/ /g,'');
final = final.replace(/['"]+/g, '');
final = final.split(',');
return final;
}
// This creates an array for the key of the custom targeting key
function keyParse(word) {
var key = word;
key = key.replace(/['"]+/g, '');
key = key.split("\n");
return key;
}
// This sets the key and value for custom targeting
var Foo = function(key, value, adslot) {
this.locationKey = key;
this.locationValue = value;
this.adslot = adslot;
};
Foo.prototype.bar = function() {
if (this.locationKey) {
this.adslot.setTargeting(this.locationKey, this.locationValue);
}
};
// This should call adslot.setTargeting(key for that location, value for that location)
function custom_targeting(key_array, value_array, location) {
var f;
for (var i = 0; i < key_array.length; i++) {
var wordValue = valueParse(value_array[i]);
f = new Foo(key_array[i], wordValue, location);
f.bar();
}
}
function defineSlot(placement, settings, isMobile) {
var ad, width, height, divId;
if (ads[placement]) {
return ads[placement];
}
divId = "div-gpt-ad-" + placement;
if (isMobile) {
// There are no settings for customizing the mobile ad sizes.
width = 320;
height = 50;
}
if (placement === "topic-list-top" && settings.dfp_topic_list_top_code && settings.dfp_topic_list_top_ad_sizes) {
if (isMobile) {
ad = window.googletag.defineSlot('/' + settings.dfp_publisher_id + '/' + settings.dfp_mobile_topic_list_top_code, [width,height], divId).addService(window.googletag.pubads());
custom_targeting((keyParse(Discourse.SiteSettings.dfp_target_topic_list_top_key_code)), (keyParse(settings.dfp_target_topic_list_top_value_code)), ad);
} else {
width = parseInt(splitWidthInt(settings.dfp_topic_list_top_ad_sizes));
height = parseInt(splitHeightInt(settings.dfp_topic_list_top_ad_sizes));
ad = window.googletag.defineSlot('/' + settings.dfp_publisher_id + '/' + settings.dfp_topic_list_top_code, [width, height], divId).addService(window.googletag.pubads());
custom_targeting((keyParse(settings.dfp_target_topic_list_top_key_code)), (keyParse(settings.dfp_target_topic_list_top_value_code)), ad);
}
} else if (placement === "topic-above-post-stream" && settings.dfp_topic_above_post_stream_code && settings.dfp_topic_above_post_stream_ad_sizes) {
if (isMobile) {
ad = window.googletag.defineSlot('/' + settings.dfp_publisher_id + '/' + settings.dfp_mobile_topic_above_post_stream_code, [width,height], divId).addService(window.googletag.pubads());
custom_targeting((keyParse(settings.dfp_target_topic_above_post_stream_key_code)), (keyParse(settings.dfp_target_topic_above_post_stream_value_code)), ad);
} else {
width = parseInt(splitWidthInt(settings.dfp_topic_above_post_stream_ad_sizes));
height = parseInt(splitHeightInt(settings.dfp_topic_above_post_stream_ad_sizes));
ad = window.googletag.defineSlot('/' + settings.dfp_publisher_id + '/' + settings.dfp_topic_above_post_stream_code, [width, height], divId).addService(window.googletag.pubads());
custom_targeting((keyParse(settings.dfp_target_topic_above_post_stream_key_code)), (keyParse(settings.dfp_target_topic_above_post_stream_value_code)), ad);
}
} else if (placement === "topic-above-suggested" && settings.dfp_topic_above_suggested_code && settings.dfp_topic_above_suggested_ad_sizes) {
if (isMobile) {
ad = window.googletag.defineSlot('/' + settings.dfp_publisher_id + '/' + settings.dfp_mobile_topic_above_suggested_code, [width,height], divId).addService(window.googletag.pubads());
custom_targeting((keyParse(settings.dfp_target_topic_above_suggested_key_code)), (keyParse(settings.dfp_target_topic_above_suggested_value_code)), ad);
} else {
width = parseInt(splitWidthInt(settings.dfp_topic_above_suggested_ad_sizes));
height = parseInt(splitHeightInt(settings.dfp_topic_above_suggested_ad_sizes));
ad = window.googletag.defineSlot('/' + settings.dfp_publisher_id + '/' + settings.dfp_topic_above_suggested_code, [width, height], divId).addService(window.googletag.pubads());
custom_targeting((keyParse(settings.dfp_target_topic_above_suggested_key_code)), (keyParse(settings.dfp_target_topic_above_suggested_value_code)), ad);
}
} else if (placement === "post-bottom" && settings.dfp_post_bottom_code && settings.dfp_post_bottom_ad_sizes) {
if (isMobile) {
ad = window.googletag.defineSlot('/' + settings.dfp_publisher_id + '/' + settings.dfp_mobile_post_bottom_code, [width,height], divId).addService(window.googletag.pubads());
custom_targeting((keyParse(settings.dfp_target_post_bottom_key_code)), (keyParse(settings.dfp_target_post_bottom_value_code)), ad);
} else {
width = parseInt(splitWidthInt(settings.dfp_post_bottom_ad_sizes));
height = parseInt(splitHeightInt(settings.dfp_post_bottom_ad_sizes));
ad = window.googletag.defineSlot('/' + settings.dfp_publisher_id + '/' + settings.dfp_post_bottom_code, [width, height], divId).addService(window.googletag.pubads());
custom_targeting((keyParse(settings.dfp_target_post_bottom_key_code)), (keyParse(settings.dfp_target_post_bottom_value_code)), ad);
}
}
if (ad) {
ads[placement] = {ad: ad, width: width, height: height};
return ads[placement];
}
}
function loadGoogle() {
if (_loaded) {
return Ember.RSVP.resolve();
}
if (_promise) {
return _promise;
}
// The boilerplate code
var dfpSrc = (('https:' === document.location.protocol) ? 'https:' : 'http:') + '//www.googletagservices.com/tag/js/gpt.js';
_promise = loadScript(dfpSrc, { scriptTag: true }).then(function() {
_loaded = true;
if (window.googletag === undefined) {
console.log('googletag is undefined!');
}
window.googletag.cmd.push(function() {
window.googletag.pubads().enableSingleRequest();
window.googletag.pubads().disableInitialLoad(); // we always use refresh() to fetch the ads
window.googletag.enableServices();
});
});
return _promise;
}
// Ember component - the class is the adblock and css
export default Ember.Component.extend({
width: 728,
height: 90,
classNameBindings: ['adUnitClass'],
classNames: ['google-dfp-ad'],
loadedGoogletag: false,
refreshOnChange: null,
divId: function() {
return "div-gpt-ad-" + this.get('placement');
}.property('placement'),
adUnitClass: function() {
return "dfp-ad-" + this.get("placement");
}.property('placement'),
adWrapperStyle: function() {
return `width: ${this.get('width')}px; height: ${this.get('height')}px;`.htmlSafe();
}.property('width', 'height'),
adTitleStyleMobile: function() {
return `width: ${this.get('width')}px;`.htmlSafe();
}.property('width'),
checkTrustLevels: function() {
return !((currentUser) && (currentUser.get('trust_level') > Discourse.SiteSettings.dfp_through_trust_level));
}.property('trust_level'),
refreshAd: function() {
var slot = ads[this.get('placement')];
if (!(slot && slot.ad)) { return; }
var self = this,
ad = slot.ad;
if (this.get('loadedGoogletag') && this.get('refreshOnChange')) {
window.googletag.cmd.push(function() {
ad.setTargeting('discourse-category', self.get('category') ? self.get('category') : '0');
window.googletag.pubads().refresh([ad]);
});
}
}.observes('refreshOnChange'),
_initGoogleDFP: function() {
var self = this;
loadGoogle(this.siteSettings).then(function() {
self.set('loadedGoogletag', true);
window.googletag.cmd.push(function() {
let slot = defineSlot(self.get('placement'), self.siteSettings, self.site.mobileView);
if (slot && slot.ad) {
slot.ad.setTargeting('discourse-category', self.get('category') ? self.get('category') : '0');
self.set('width', slot.width);
self.set('height', slot.height);
window.googletag.display(self.get('divId'));
window.googletag.pubads().refresh([slot.ad]);
}
});
});
}.on('didInsertElement')
});