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

320 lines
8.2 KiB
Plaintext
Raw Normal View History

import AdComponent from "discourse/plugins/discourse-adplugin/discourse/components/ad_component";
import {
default as computed,
observes,
on
} from "ember-addons/ember-computed-decorators";
2018-10-22 14:49:32 -04:00
import loadScript from "discourse/lib/load-script";
var currentUser = Discourse.User.current(),
2018-10-22 14:49:32 -04:00
_loaded = false,
_promise = null,
ads = {};
2015-08-10 00:04:21 -04:00
function splitWidthInt(value) {
2018-10-22 14:49:32 -04:00
var str = value.substring(0, 3);
return str.trim();
2015-08-10 00:04:21 -04:00
}
function splitHeightInt(value) {
2018-10-22 14:49:32 -04:00
var str = value.substring(4, 7);
return str.trim();
2015-08-10 00:04:21 -04:00
}
2015-08-26 01:35:30 -04:00
// This creates an array for the values of the custom targeting key
function valueParse(value) {
2018-10-22 14:49:32 -04:00
var final = value.replace(/ /g, "");
final = final.replace(/['"]+/g, "");
final = final.split(",");
2015-08-26 01:35:30 -04:00
return final;
}
// This creates an array for the key of the custom targeting key
function keyParse(word) {
var key = word;
2018-10-22 14:49:32 -04:00
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();
}
}
const DESKTOP_SETTINGS = {
"topic-list-top": {
code: "dfp_topic_list_top_code",
sizes: "dfp_topic_list_top_ad_sizes",
targeting_keys: "dfp_target_topic_list_top_key_code",
targeting_values: "dfp_target_topic_list_top_value_code"
},
"topic-above-post-stream": {
code: "dfp_topic_above_post_stream_code",
sizes: "dfp_topic_above_post_stream_ad_sizes",
targeting_keys: "dfp_target_topic_above_post_stream_key_code",
targeting_values: "dfp_target_topic_above_post_stream_value_code"
},
"topic-above-suggested": {
code: "dfp_topic_above_suggested_code",
sizes: "dfp_topic_above_suggested_ad_sizes",
targeting_keys: "dfp_target_topic_above_suggested_key_code",
targeting_values: "dfp_target_topic_above_suggested_value_code"
},
"post-bottom": {
code: "dfp_post_bottom_code",
sizes: "dfp_post_bottom_ad_sizes",
targeting_keys: "dfp_target_post_bottom_key_code",
targeting_values: "dfp_target_post_bottom_value_code"
}
};
const MOBILE_SETTINGS = {
"topic-list-top": {
code: "dfp_mobile_topic_list_top_code",
sizes: "dfp_mobile_topic_list_top_ad_sizes",
targeting_keys: "dfp_target_topic_list_top_key_code",
targeting_values: "dfp_target_topic_list_top_value_code"
},
"topic-above-post-stream": {
code: "dfp_mobile_topic_above_post_stream_code",
sizes: "dfp_mobile_topic_above_post_stream_ad_sizes",
targeting_keys: "dfp_target_topic_above_post_stream_key_code",
targeting_values: "dfp_target_topic_above_post_stream_value_code"
},
"topic-above-suggested": {
code: "dfp_mobile_topic_above_suggested_code",
sizes: "dfp_mobile_topic_above_suggested_ad_sizes",
targeting_keys: "dfp_target_topic_above_suggested_key_code",
targeting_values: "dfp_target_topic_above_suggested_value_code"
},
"post-bottom": {
code: "dfp_mobile_post_bottom_code",
sizes: "dfp_mobile_post_bottom_ad_sizes",
targeting_keys: "dfp_target_post_bottom_key_code",
targeting_values: "dfp_target_post_bottom_value_code"
}
};
function getWidthAndHeight(placement, settings, isMobile) {
let config;
if (isMobile) {
config = MOBILE_SETTINGS[placement];
} else {
config = DESKTOP_SETTINGS[placement];
}
return {
width: parseInt(splitWidthInt(settings[config.sizes])),
height: parseInt(splitHeightInt(settings[config.sizes]))
};
}
function defineSlot(divId, placement, settings, isMobile) {
if (!settings.dfp_publisher_id) {
return;
}
let ad, config;
let size = getWidthAndHeight(placement, settings, isMobile);
if (ads[divId]) {
return ads[divId];
}
if (isMobile) {
config = MOBILE_SETTINGS[placement];
} else {
config = DESKTOP_SETTINGS[placement];
}
ad = window.googletag
.defineSlot(
"/" + settings.dfp_publisher_id + "/" + settings[config.code],
[size.width, size.height],
divId
)
.addService(window.googletag.pubads());
custom_targeting(
keyParse(settings[config.targeting_keys]),
keyParse(settings[config.targeting_values]),
ad
);
if (ad) {
ads[divId] = { ad: ad, width: size.width, height: size.height };
return ads[divId];
}
}
function destroySlot(divId) {
if (ads[divId] && window.googletag) {
2018-10-22 14:49:32 -04:00
window.googletag.cmd.push(function() {
window.googletag.destroySlots([ads[divId].ad]);
delete ads[divId];
});
}
}
2016-02-22 12:11:29 -05:00
function loadGoogle() {
if (_loaded) {
return Ember.RSVP.resolve();
}
if (_promise) {
return _promise;
}
// The boilerplate code
2018-10-22 14:49:32 -04:00
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) {
2018-10-22 14:49:32 -04:00
console.log("googletag is undefined!");
}
2016-02-22 12:11:29 -05:00
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;
}
export default AdComponent.extend({
2018-10-22 14:49:32 -04:00
classNameBindings: ["adUnitClass"],
classNames: ["google-dfp-ad"],
loadedGoogletag: false,
refreshOnChange: null,
@computed("placement", "postNumber")
divId(placement, postNumber) {
if (postNumber) {
return `div-gpt-ad-${placement}-${postNumber}`;
} else {
return `div-gpt-ad-${placement}`;
}
},
@computed("placement", "showAd")
adUnitClass(placement, showAd) {
return showAd ? `dfp-ad-${placement}` : "";
},
@computed("width", "height")
adWrapperStyle(w, h) {
return `width: ${w}px; height: ${h}px;`.htmlSafe();
},
@computed("width")
adTitleStyleMobile(w) {
return `width: ${w}px;`.htmlSafe();
},
@computed("showToTrustLevel", "showToGroups")
showAd(showToTrustLevel, showToGroups) {
2018-10-22 14:49:32 -04:00
return (
Discourse.SiteSettings.dfp_publisher_id &&
showToTrustLevel &&
showToGroups
2018-10-22 14:49:32 -04:00
);
},
@computed()
showToTrustLevel() {
2018-10-22 14:49:32 -04:00
return !(
currentUser &&
currentUser.get("trust_level") >
Discourse.SiteSettings.dfp_through_trust_level
);
},
@observes("refreshOnChange")
refreshAd() {
2018-10-22 14:49:32 -04:00
var slot = ads[this.get("divId")];
if (!(slot && slot.ad)) {
return;
}
var self = this,
2018-10-22 14:49:32 -04:00
ad = slot.ad;
2018-10-22 14:49:32 -04:00
if (this.get("loadedGoogletag") && this.get("refreshOnChange")) {
2016-02-22 12:11:29 -05:00
window.googletag.cmd.push(function() {
2018-10-22 14:49:32 -04:00
ad.setTargeting(
"discourse-category",
self.get("category") ? self.get("category") : "0"
);
2016-02-22 12:11:29 -05:00
window.googletag.pubads().refresh([ad]);
});
}
},
@on("didInsertElement")
_initGoogleDFP() {
2018-10-22 14:49:32 -04:00
if (!this.get("showAd")) {
return;
}
var self = this;
loadGoogle(this.siteSettings).then(function() {
self.set("loadedGoogletag", true);
window.googletag.cmd.push(function() {
let slot = defineSlot(
self.get("divId"),
self.get("placement"),
self.siteSettings,
self.site.mobileView
);
if (slot && slot.ad) {
slot.ad.setTargeting(
"discourse-category",
self.get("category") ? self.get("category") : "0"
2018-10-22 14:49:32 -04:00
);
window.googletag.display(self.get("divId"));
window.googletag.pubads().refresh([slot.ad]);
}
});
});
},
willRender() {
this._super(...arguments);
let size = getWidthAndHeight(
this.get("placement"),
this.siteSettings,
this.site.mobileView
);
this.set("width", size.width);
this.set("height", size.height);
},
@on("willDestroyElement")
cleanup() {
2018-10-22 14:49:32 -04:00
destroySlot(this.get("divId"));
}
});