"use client"; /** * Отправляет impression событие в Google Analytics для AB теста * * Используется в FunnelRuntime когда экран с AB тестом становится видимым * Автоматически предотвращает дубликаты через sessionStorage * * @param flag - название флага из Unleash * @param variant - вариант который получил пользователь */ export function sendUnleashImpression(flag: string, variant: string | undefined) { const timestamp = new Date().toISOString(); // Проверяем что вариант валидный if (!variant || variant === "disabled") { console.groupCollapsed( `%c[GA] 🧪 AB Test Impression SKIPPED`, 'color: #9E9E9E; font-weight: bold' ); console.log('🕐 Timestamp:', timestamp); console.log('🏷️ Flag:', flag); console.log('🎯 Variant:', variant); console.log('⚠️ Reason: Invalid variant (disabled or undefined)'); console.groupEnd(); return; } // Проверяем что браузерное окружение if (typeof window === "undefined") { console.warn('[GA] 🧪 AB Test Impression SKIPPED: Not browser environment'); return; } // Проверяем не отправляли ли уже это событие в этой сессии const storageKey = `unleash_impression_${flag}_${variant}`; const alreadySent = sessionStorage.getItem(storageKey); if (alreadySent) { // Уже отправляли - пропускаем console.groupCollapsed( `%c[GA] 🧪 AB Test Impression SKIPPED (Already Sent)`, 'color: #9E9E9E; font-weight: bold' ); console.log('🕐 Timestamp:', timestamp); console.log('🏷️ Flag:', flag); console.log('🎯 Variant:', variant); console.log('💾 Storage Key:', storageKey); console.log('⚠️ Reason: Already sent in this session'); console.log('📊 Check sessionStorage to verify'); console.groupEnd(); return; } // Проверяем наличие gtag if (!window.gtag) { console.groupCollapsed( `%c[GA] 🧪 AB Test Impression NOT Sent`, 'color: #FF0000; font-weight: bold' ); console.log('🕐 Timestamp:', timestamp); console.log('🏷️ Flag:', flag); console.log('🎯 Variant:', variant); console.log('❌ Error: Google Analytics not available (window.gtag is undefined)'); console.log('💡 Solution: Check that GoogleAnalytics component is loaded with measurementId'); console.groupEnd(); return; } // Подготавливаем payload const payload = { app_name: "witlab-funnel", feature: flag, treatment: variant, }; // Отправляем событие в Google Analytics window.gtag("event", "experiment_impression", payload); // Помечаем что отправили sessionStorage.setItem(storageKey, "true"); // Детальное логирование успешной отправки console.groupCollapsed( `%c[GA] 🧪 AB Test Impression Event Sent`, 'color: #4285F4; font-weight: bold' ); console.log('🕐 Timestamp:', timestamp); console.log('🏷️ Flag:', flag); console.log('🎯 Variant:', variant); console.log('📦 Event Name:', 'experiment_impression'); console.log('📦 Payload:', payload); console.log('💾 Storage Key:', storageKey); console.log('✅ Status: Successfully sent to Google Analytics'); console.log('🔍 Verify in Network tab: Look for /g/collect requests'); console.groupEnd(); } /** * Очищает историю отправленных impression (для тестирования) * В production обычно не используется */ export function clearUnleashImpressions() { if (typeof window === "undefined") { return; } const keysToRemove = Object.keys(sessionStorage) .filter(key => key.startsWith("unleash_impression_")); const timestamp = new Date().toISOString(); keysToRemove.forEach(key => sessionStorage.removeItem(key)); console.groupCollapsed( `%c[GA] 🧪 AB Test Impressions Cleared`, 'color: #FF9800; font-weight: bold' ); console.log('🕐 Timestamp:', timestamp); console.log('🧹 Keys Removed:', keysToRemove.length); console.log('📋 Removed Keys:', keysToRemove); console.log('✅ Status: All AB test impression history cleared'); console.log('💡 New impressions will be sent on next screen view'); console.groupEnd(); }