46 lines
1.6 KiB
JavaScript
46 lines
1.6 KiB
JavaScript
// Откуда пришёл посетитель: UTM-метки из адреса первой страницы и внешний сайт-источник.
|
||
// Запоминается на сессию (первый заход) и уходит вместе с заявкой — по этим данным
|
||
// строится «Источники заявок» в админке. Никаких персональных данных здесь нет.
|
||
|
||
const KEY = 'dana:attribution';
|
||
const UTM_KEYS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'];
|
||
|
||
function storage() {
|
||
try {
|
||
return window.sessionStorage;
|
||
} catch {
|
||
return null; // приватный режим или запрет сайта
|
||
}
|
||
}
|
||
|
||
export function captureAttribution() {
|
||
if (typeof window === 'undefined') return;
|
||
const store = storage();
|
||
if (!store || store.getItem(KEY)) return;
|
||
const data = {};
|
||
const params = new URLSearchParams(window.location.search);
|
||
for (const k of UTM_KEYS) {
|
||
const v = params.get(k);
|
||
if (v) data[k] = v.slice(0, 200);
|
||
}
|
||
try {
|
||
const ref = document.referrer ? new URL(document.referrer) : null;
|
||
if (ref && ref.host !== window.location.host) data.referrer = ref.host;
|
||
} catch {
|
||
/* битый referrer — просто без него */
|
||
}
|
||
try {
|
||
store.setItem(KEY, JSON.stringify(data));
|
||
} catch {
|
||
/* хранилище переполнено или запрещено */
|
||
}
|
||
}
|
||
|
||
export function attribution() {
|
||
try {
|
||
return JSON.parse(storage()?.getItem(KEY) || '{}');
|
||
} catch {
|
||
return {};
|
||
}
|
||
}
|