mirror of
git://f0xx.org/ac/ac-platform-web
synced 2026-07-29 04:39:50 +03:00
Previously gtag could load on first visit (no choice yet) or after partial consent, pulling googletagmanager.com and triggering broken-HTTPS warnings when that CDN hit cert errors on the client path. Co-authored-by: Cursor <cursoragent@cursor.com>
155 lines
4.2 KiB
JavaScript
155 lines
4.2 KiB
JavaScript
/**
|
|
* Google Analytics 4 for Android Cast web platform (hub + crash console).
|
|
* Set window.ANDROIDCAST_ANALYTICS before this script loads:
|
|
* { measurementId: 'G-XXXXXXXX', platform: 'hub'|'crashes', debug: false }
|
|
*/
|
|
(function (global) {
|
|
'use strict';
|
|
|
|
var cfg = global.ANDROIDCAST_ANALYTICS || {};
|
|
var measurementId = (cfg.measurementId || '').trim();
|
|
var platform = cfg.platform || 'web';
|
|
var debug = !!cfg.debug;
|
|
|
|
function log() {
|
|
if (debug && global.console) {
|
|
global.console.log.apply(global.console, ['[analytics]'].concat([].slice.call(arguments)));
|
|
}
|
|
}
|
|
|
|
function enabled() {
|
|
if (global.AndroidCastCookieConsent && !global.AndroidCastCookieConsent.allowsAnalytics()) {
|
|
return false;
|
|
}
|
|
return measurementId.length > 0 && /^G-[A-Z0-9]+$/i.test(measurementId);
|
|
}
|
|
|
|
function ensureGtag(cb) {
|
|
if (!enabled()) {
|
|
return;
|
|
}
|
|
global.dataLayer = global.dataLayer || [];
|
|
if (!global.gtag) {
|
|
global.gtag = function () {
|
|
global.dataLayer.push(arguments);
|
|
};
|
|
}
|
|
if (global.__acAnalyticsLoaded) {
|
|
if (cb) cb();
|
|
return;
|
|
}
|
|
var s = document.createElement('script');
|
|
s.async = true;
|
|
s.src = 'https://www.googletagmanager.com/gtag/js?id=' + encodeURIComponent(measurementId);
|
|
s.onload = function () {
|
|
global.__acAnalyticsLoaded = true;
|
|
global.gtag('js', new Date());
|
|
global.gtag('config', measurementId, {
|
|
send_page_view: false,
|
|
anonymize_ip: true
|
|
});
|
|
log('loaded', measurementId);
|
|
if (cb) cb();
|
|
};
|
|
document.head.appendChild(s);
|
|
}
|
|
|
|
function pagePath() {
|
|
var base = (cfg.basePath || '').replace(/\/$/, '');
|
|
var path = global.location.pathname || '/';
|
|
if (base && path.indexOf(base) === 0) {
|
|
path = path.slice(base.length) || '/';
|
|
}
|
|
return path;
|
|
}
|
|
|
|
function pageView(extra) {
|
|
if (!enabled()) return;
|
|
ensureGtag(function () {
|
|
var params = {
|
|
page_title: document.title || '',
|
|
page_location: global.location.href,
|
|
page_path: pagePath(),
|
|
platform: platform
|
|
};
|
|
if (extra) {
|
|
for (var k in extra) {
|
|
if (Object.prototype.hasOwnProperty.call(extra, k)) params[k] = extra[k];
|
|
}
|
|
}
|
|
global.gtag('event', 'page_view', params);
|
|
log('page_view', params);
|
|
});
|
|
}
|
|
|
|
function trackEvent(name, params) {
|
|
if (!enabled() || !name) return;
|
|
ensureGtag(function () {
|
|
var payload = params || {};
|
|
payload.platform = platform;
|
|
global.gtag('event', name, payload);
|
|
log('event', name, payload);
|
|
});
|
|
}
|
|
|
|
function bindConsoleView() {
|
|
var body = document.body;
|
|
if (!body) return;
|
|
var view = body.getAttribute('data-view');
|
|
if (view) {
|
|
trackEvent('console_view', { view_name: view });
|
|
}
|
|
}
|
|
|
|
function bindHubInteractions() {
|
|
document.addEventListener('click', function (ev) {
|
|
var t = ev.target;
|
|
if (!(t instanceof Element)) return;
|
|
var card = t.closest('.hub-card, .hub-card-link');
|
|
if (card) {
|
|
var label = card.getAttribute('data-analytics-label')
|
|
|| (card.textContent || '').trim().slice(0, 64);
|
|
trackEvent('hub_nav_click', { link_text: label });
|
|
return;
|
|
}
|
|
if (t.closest('[data-open-docs], #hub-compass-layer, .hub-logo-layer--compass')) {
|
|
trackEvent('hub_open_docs', { source: 'compass' });
|
|
}
|
|
if (t.closest('[data-close-docs]')) {
|
|
trackEvent('hub_close_docs', {});
|
|
}
|
|
});
|
|
}
|
|
|
|
function init() {
|
|
if (!enabled()) {
|
|
log('disabled (no measurement id or cookie consent)');
|
|
return;
|
|
}
|
|
pageView();
|
|
if (platform === 'crashes' || String(platform).indexOf('live_') === 0) {
|
|
bindConsoleView();
|
|
} else if (platform === 'hub') {
|
|
bindHubInteractions();
|
|
}
|
|
}
|
|
|
|
global.addEventListener('ac-cookie-consent', function () {
|
|
if (enabled()) {
|
|
init();
|
|
}
|
|
});
|
|
|
|
global.AndroidCastAnalytics = {
|
|
enabled: enabled,
|
|
pageView: pageView,
|
|
trackEvent: trackEvent
|
|
};
|
|
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', init);
|
|
} else {
|
|
init();
|
|
}
|
|
})(typeof window !== 'undefined' ? window : this);
|