(function () {
'use strict';
var config = window.BREW_ANALYTICS_CONFIG || {};
var storageKey = config.consentStorageKey || 'brew_analytics_consent';
var enabled = config.enabled !== false && config.enabled !== 'false';
var metrikaId = String(config.yandexMetrikaId || '').trim();
var appName = String(config.appName || 'site');
var loaded = false;
function readConsent() {
try {
return window.localStorage.getItem(storageKey);
} catch (_) {
return null;
}
}
function writeConsent(value) {
try {
window.localStorage.setItem(storageKey, value);
} catch (_) {}
}
function loadMetrika() {
if (!enabled || !metrikaId || loaded || readConsent() !== 'granted') {
return;
}
loaded = true;
window.ym = window.ym || function () {
(window.ym.a = window.ym.a || []).push(arguments);
};
window.ym.l = Date.now();
window.ym(Number(metrikaId), 'init', {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: false,
});
var script = document.createElement('script');
script.async = true;
script.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(script);
}
function reachGoal(goal, params) {
if (!enabled || !metrikaId || readConsent() !== 'granted') {
return;
}
loadMetrika();
if (typeof window.ym === 'function') {
window.ym(Number(metrikaId), 'reachGoal', goal, Object.assign({
app: appName,
}, params || {}));
}
}
function hit(url, title) {
if (!enabled || !metrikaId || readConsent() !== 'granted') {
return;
}
loadMetrika();
if (typeof window.ym === 'function') {
window.ym(Number(metrikaId), 'hit', url || window.location.href, {
title: title || document.title,
params: { app: appName },
});
}
}
function consentBanner() {
if (!enabled || !metrikaId || readConsent()) {
return;
}
var banner = document.createElement('div');
banner.id = 'brew-cookie-consent';
banner.style.cssText = [
'position:fixed',
'left:16px',
'right:16px',
'bottom:16px',
'z-index:2147483647',
'max-width:760px',
'margin:auto',
'padding:16px',
'border-radius:16px',
'background:#0f172a',
'color:#e2e8f0',
'box-shadow:0 16px 48px rgba(15,23,42,.28)',
'font:14px/1.45 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif',
].join(';');
banner.innerHTML = [
'
Аналитика и cookies
',
'Мы используем Яндекс.Метрику, чтобы понимать, какие разделы BrewMasters.team помогают пользователям. Аналитика включится только после согласия.
',
'',
].join('');
banner.addEventListener('click', function (event) {
var target = event.target;
if (!target || !target.getAttribute) return;
var value = target.getAttribute('data-brew-consent');
if (!value) return;
writeConsent(value);
banner.remove();
if (value === 'granted') {
loadMetrika();
hit(window.location.href, document.title);
}
});
document.body.appendChild(banner);
}
function captureUtm() {
try {
var params = new URLSearchParams(window.location.search);
var payload = {};
['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'].forEach(function (key) {
var value = params.get(key);
if (value) payload[key] = value.substring(0, 160);
});
if (Object.keys(payload).length > 0) {
payload.landing_url = window.location.href.substring(0, 500);
payload.captured_at = new Date().toISOString();
window.localStorage.setItem('brew_attribution', JSON.stringify(payload));
}
} catch (_) {}
}
document.addEventListener('click', function (event) {
var node = event.target;
while (node && node !== document) {
if (node.getAttribute && node.getAttribute('data-analytics-goal')) {
reachGoal(node.getAttribute('data-analytics-goal'), {
href: node.href || undefined,
text: (node.textContent || '').trim().substring(0, 80),
});
return;
}
node = node.parentNode;
}
});
window.BrewAnalytics = {
consent: readConsent,
grantConsent: function () {
writeConsent('granted');
loadMetrika();
},
denyConsent: function () {
writeConsent('denied');
},
hit: hit,
reachGoal: reachGoal,
setUser: function (userId) {
if (typeof window.ym === 'function' && metrikaId && userId) {
window.ym(Number(metrikaId), 'userParams', { UserID: String(userId) });
}
},
clearUser: function () {},
attribution: function () {
try {
return window.localStorage.getItem('brew_attribution') || '';
} catch (_) {
return '';
}
},
};
captureUtm();
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function () {
consentBanner();
loadMetrika();
});
} else {
consentBanner();
loadMetrika();
}
})();