135 lines
4.9 KiB
JavaScript
135 lines
4.9 KiB
JavaScript
import {defineStore} from "pinia";
|
|
import {useSettingsStore} from "@/stores/SettingsStore.js";
|
|
import sha256 from 'crypto-js/sha256';
|
|
import {toRaw} from "vue";
|
|
|
|
export const useYaMetrikaStore = defineStore('ya_metrika', {
|
|
state: () => ({
|
|
queue: [],
|
|
prevPath: null,
|
|
}),
|
|
|
|
actions: {
|
|
pushHit(url, params = {}) {
|
|
if (!useSettingsStore().ya_metrika_enabled) {
|
|
console.debug('[ym] Yandex Metrika disabled in settings.');
|
|
return;
|
|
}
|
|
|
|
const fullUrl = `/#${url}`;
|
|
|
|
params.referer = params.referer ?? this.prevPath;
|
|
|
|
if (typeof window.ym === 'function' && window.YA_METRIKA_ID !== undefined) {
|
|
console.debug('[ym] Hit ', fullUrl);
|
|
console.debug('[ym] ID ', window.YA_METRIKA_ID);
|
|
console.debug('[ym] params ', params);
|
|
window.ym(window.YA_METRIKA_ID, 'hit', fullUrl, params);
|
|
} else {
|
|
console.debug('[ym] Yandex Metrika is not initialized. Pushed to queue.');
|
|
this.queue.push({
|
|
event: 'hit',
|
|
payload: {
|
|
fullUrl,
|
|
params,
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
reachGoal(target, params = {}) {
|
|
if (!useSettingsStore().ya_metrika_enabled) {
|
|
console.debug('[ym] Yandex Metrika disabled in settings.');
|
|
return;
|
|
}
|
|
|
|
if (! target) {
|
|
return;
|
|
}
|
|
|
|
if (typeof window.ym === 'function' && window.YA_METRIKA_ID !== undefined) {
|
|
console.debug('[ym] reachGoal ', target, ' params: ', params);
|
|
window.ym(window.YA_METRIKA_ID, 'reachGoal', target, params);
|
|
} else {
|
|
console.debug('[ym] Yandex Metrika is not initialized. Pushed to queue.');
|
|
this.queue.push({
|
|
event: 'reachGoal',
|
|
payload: {
|
|
target,
|
|
params
|
|
},
|
|
});
|
|
}
|
|
},
|
|
|
|
initUserParams() {
|
|
if (!useSettingsStore().ya_metrika_enabled) {
|
|
console.debug('[ym] Yandex Metrika disabled in settings.');
|
|
return;
|
|
}
|
|
|
|
if (typeof window.ym === 'function' && window.YA_METRIKA_ID !== undefined) {
|
|
let tgID = null;
|
|
|
|
if (window?.Telegram?.WebApp?.initDataUnsafe?.user?.id) {
|
|
tgID = sha256(window.Telegram.WebApp.initDataUnsafe.user.id).toString();
|
|
}
|
|
|
|
const userParams = {
|
|
tg_id: tgID,
|
|
language: window.Telegram?.WebApp?.initDataUnsafe?.user?.language_code || 'unknown',
|
|
platform: window.Telegram?.WebApp?.platform || 'unknown',
|
|
};
|
|
|
|
window.ym(window.YA_METRIKA_ID, 'userParams', userParams);
|
|
console.debug('[ym] User params initialized: ', userParams);
|
|
} else {
|
|
console.debug('[ym] Yandex Metrika is not initialized. Could not init user params.');
|
|
}
|
|
},
|
|
|
|
processQueue() {
|
|
if (this.queue.length === 0) {
|
|
return;
|
|
}
|
|
|
|
console.debug('[ym] Start processing queue. Size: ', this.queue.length);
|
|
|
|
while (this.queue.length > 0) {
|
|
const item = this.queue.shift();
|
|
if (item.event === 'hit') {
|
|
console.debug('[ym] Queue ', toRaw(item));
|
|
window.ym(window.YA_METRIKA_ID, 'hit', item.payload.fullUrl, item.payload.params);
|
|
} else if (item.event === 'reachGoal') {
|
|
window.ym(window.YA_METRIKA_ID, 'reachGoal', item.payload.target, item.payload.params);
|
|
} else if (item.event === 'dataLayer') {
|
|
console.debug('[ym] queue dataLayer push: ', item.payload);
|
|
window.dataLayer.push(item.payload);
|
|
} else {
|
|
console.error('[ym] Unsupported queue event: ', item.event);
|
|
}
|
|
}
|
|
|
|
console.debug('[ym] Queue processing complete. Size: ', this.queue.length);
|
|
},
|
|
|
|
dataLayerPush(object) {
|
|
if (!useSettingsStore().ya_metrika_enabled) {
|
|
console.debug('[ym] Yandex Metrika disabled in settings.');
|
|
return;
|
|
}
|
|
|
|
if (Array.isArray(window.dataLayer)) {
|
|
console.debug('[ym] dataLayer push: ', object);
|
|
window.dataLayer.push(object);
|
|
} else {
|
|
console.debug('[ym] dataLayer inaccessible. Put to queue');
|
|
this.queue.push({
|
|
event: 'dataLayer',
|
|
payload: object,
|
|
});
|
|
}
|
|
}
|
|
},
|
|
});
|