* Fix accept all button simply not working * Switched privacy settings icons to a shield Fixed auth changing the theme and consent Fixed server error on log in / out * Fixed scrolling issue on mobile * Fixed GPDR concerns
112 lines
3.8 KiB
JavaScript
112 lines
3.8 KiB
JavaScript
import Vue from 'vue';
|
|
|
|
function isPersonalizedAdsOn(ctx) {
|
|
let cookies = []
|
|
if (ctx.req != null) {
|
|
//Server side rendering
|
|
cookies = ctx.req.headers.cookie;
|
|
} else {
|
|
// Rely on the client
|
|
cookies = document.cookie;
|
|
}
|
|
let processed = {}
|
|
cookies.split(';').forEach((e) => {
|
|
let val = e.trim().split('=')
|
|
processed[val[0]] = decodeURI(val[1])
|
|
})
|
|
let scopes = decodeURIComponent(processed['modrinth-scopes']).split(",")
|
|
return (scopes !== null && scopes.includes('ads'))
|
|
}
|
|
|
|
export default async function (ctx, inject) {
|
|
|
|
const { app } = ctx;
|
|
const config = ctx.$config && ctx.$config.ads || {};
|
|
// Module options
|
|
const debug = config.debug ?? <%= options.debug || false %>;
|
|
const individualRefresh = config.individualRefresh ?? <%= options.individualRefresh || false %>;
|
|
const collapseEmptyDivs = config.collapseEmptyDivs ?? <%= options.collapseEmptyDivs || false %>;
|
|
const GeoEdgeId = config.GeoEdgeId ?? '<%= options.geoEdgeId %>';
|
|
const networkCode = config.networkCode ?? '<%= options.networkCode %>';
|
|
const GPT_LIB_SCRIPT_ID = '<%= options.GPT_LIB_SCRIPT_ID %>';
|
|
const GPT_INIT_SCRIPT_ID = '<%= options.GPT_INIT_SCRIPT_ID %>';
|
|
const GEOEDGE_CONF_SCRIPT_ID = '<%= options.GEOEDGE_CONF_SCRIPT_ID %>';
|
|
const GEOEDGE_LIB_SCRIPT_ID = '<%= options.GEOEDGE_LIB_SCRIPT_ID %>';
|
|
// Instance options
|
|
const gptAdsOptions = {
|
|
networkCode,
|
|
individualRefresh,
|
|
slots: [],
|
|
};
|
|
|
|
const injectScript = (script) => {
|
|
const scriptIndex = ctx.app.head.script.findIndex(s => s.hid === script.hid);
|
|
if (scriptIndex !== -1) {
|
|
ctx.app.head.script[scriptIndex] = script;
|
|
} else {
|
|
ctx.app.head.script.push(script);
|
|
}
|
|
};
|
|
let no_consent = !isPersonalizedAdsOn(ctx)
|
|
|
|
// GeoEdge support
|
|
if (GeoEdgeId !== '') {
|
|
// Unfortunately these lines are needed to prevent vue-meta from esacping quotes in the init script
|
|
ctx.app.head.__dangerouslyDisableSanitizersByTagID = ctx.app.head.__dangerouslyDisableSanitizersByTagID || {}
|
|
ctx.app.head.__dangerouslyDisableSanitizersByTagID[GEOEDGE_CONF_SCRIPT_ID] = ['innerHTML']
|
|
const geoEdgeConfig = {
|
|
hid: GEOEDGE_CONF_SCRIPT_ID,
|
|
innerHTML: "window.grumi = { key: '" + encodeURIComponent(GeoEdgeId) +"'};"
|
|
};
|
|
injectScript(geoEdgeConfig);
|
|
|
|
const geoEdgeImport = {
|
|
hid: GEOEDGE_LIB_SCRIPT_ID,
|
|
src: `https://rumcdn.geoedge.be/${GeoEdgeId}/grumi-ip.js`,
|
|
async: true,
|
|
};
|
|
injectScript(geoEdgeImport)
|
|
}
|
|
|
|
// Inject GPT lib
|
|
const gptLibScript = {
|
|
hid: GPT_LIB_SCRIPT_ID,
|
|
src: 'https://www.googletagservices.com/tag/js/gpt.js',
|
|
async: true,
|
|
};
|
|
injectScript(gptLibScript);
|
|
|
|
// Inject GPT init script
|
|
let gptInitScriptHtml = 'var googletag = googletag || {};googletag.cmd = googletag.cmd || [];';
|
|
if (debug) {
|
|
gptInitScriptHtml += 'googletag.cmd.push(function(){googletag.openConsole();});';
|
|
}
|
|
// Disable initial load
|
|
const gptDisableInitialLoad = individualRefresh ? 'googletag.pubads().disableInitialLoad();' : '';
|
|
// Collapse empty div
|
|
const gptCollapseEmptyDivs = collapseEmptyDivs ? 'googletag.pubads().collapseEmptyDivs();' : '';
|
|
// Desactivate personalization
|
|
const gptDisablePersonalization = no_consent ? 'googletag.pubads().setRequestNonPersonalizedAds(1);' : '';
|
|
gptInitScriptHtml += `
|
|
googletag.cmd.push(function(){
|
|
googletag.pubads().enableSingleRequest();
|
|
${gptDisableInitialLoad}
|
|
${gptCollapseEmptyDivs}
|
|
${gptDisablePersonalization}
|
|
googletag.enableServices();
|
|
});
|
|
`;
|
|
const gptInitScript = {
|
|
hid: GPT_INIT_SCRIPT_ID,
|
|
innerHTML: gptInitScriptHtml,
|
|
};
|
|
injectScript(gptInitScript);
|
|
|
|
|
|
const component = require('./component.js');
|
|
Vue.component('<%= options.componentName %>', component.default || component);
|
|
|
|
inject('gptAds', gptAdsOptions);
|
|
}
|
|
|