"use client"; import { useEffect } from "react"; import { useUnleashClient } from "@unleash/proxy-client-react"; /** * Интерфейс для Unleash impression события * Идентично типу в aura-webapp */ interface UnleashImpressionEvent { enabled: boolean; featureName: string; variant: string; context: { appName?: string; }; } /** * Хук для автоматической отправки AB test impression событий в Google Analytics * * Реализация ИДЕНТИЧНА aura-webapp: * - Подписывается на impression события от Unleash Client * - Impression event генерируется АВТОМАТИЧЕСКИ при вызове useVariant() * - Это происходит когда пользователь РЕАЛЬНО доходит до экрана с AB тестом * * @see /aura-webapp/src/hooks/ab/unleash/useUnleash.ts (строки 112-126) */ export function useUnleashAnalytics() { const unleashClient = useUnleashClient(); useEffect(() => { console.log("🎯 [Unleash Analytics] Impression listener initialized"); // Сохраняем ссылку на handler для корректной отписки const impressionHandler = (impressionEvent: UnleashImpressionEvent) => { console.log("📊 [Unleash Analytics] Impression event received:", { feature: impressionEvent.featureName, variant: impressionEvent.variant, enabled: impressionEvent.enabled, }); // Проверяем что флаг включен (идентично aura-webapp) if ("enabled" in impressionEvent && impressionEvent.enabled) { const isDevelopEnvironment = typeof window !== "undefined" && (window.location.hostname.includes('develop.funnel.witlab.us') || window.location.hostname.includes('localhost')); // ✅ 1. Отправляем в Google Analytics const gaAvailable = typeof window !== "undefined" && typeof window.gtag !== "undefined"; if (gaAvailable) { window.gtag("event", "experiment_impression", { app_name: impressionEvent.context.appName || "witlab-funnel", feature: impressionEvent.featureName, treatment: impressionEvent.variant, debug_mode: isDevelopEnvironment, }); console.log("✅ [Google Analytics] AB test event sent:", { event: "experiment_impression", feature: impressionEvent.featureName, treatment: impressionEvent.variant, debug_mode: isDevelopEnvironment, }); } else { console.warn("⚠️ [Google Analytics] Not available - gtag function not found"); } // ✅ 2. Отправляем в Яндекс Метрику через params (параметры ВИЗИТА) // ВАЖНО: AB тесты - это параметры ВИЗИТА (params), а не посетителя (userParams) // Идентично aura-webapp: используем прямой вызов window.ym() const ymAvailable = typeof window !== "undefined" && typeof window.ym !== "undefined"; const counterId = typeof window !== "undefined" ? window.__YM_COUNTER_ID__ : undefined; if (ymAvailable && counterId) { // Отправляем параметры визита для AB теста // ym() накопит вызов в очереди если скрипт еще не загрузился window.ym(counterId, 'params', { [`ab_test_${impressionEvent.featureName}`]: impressionEvent.variant, }); console.log("✅ [Yandex Metrika] AB test params sent:", { counterId, param: `ab_test_${impressionEvent.featureName}`, value: impressionEvent.variant, queued: !!window.ym.a, // true если событие в очереди, false если отправлено }); } else if (!ymAvailable) { console.warn("⚠️ [Yandex Metrika] Not initialized - check AnalyticsProvider"); } else if (!counterId) { console.warn("⚠️ [Yandex Metrika] Counter ID not set"); } // Summary log console.log("📈 [Unleash Analytics] AB Test Impression Summary:", { feature: impressionEvent.featureName, variant: impressionEvent.variant, appName: impressionEvent.context.appName, debugMode: isDevelopEnvironment, sentToGA: gaAvailable, sentToYM: ymAvailable && !!window.__YM_COUNTER_ID__, }); } else { console.log("⏭️ [Unleash Analytics] Impression event skipped - flag not enabled"); } }; // Подписываемся на все impression события от Unleash unleashClient.on("impression", impressionHandler); // Отписываемся при unmount, передавая ту же ссылку на handler return () => { console.log("🔌 [Unleash Analytics] Impression listener removed"); unleashClient.off("impression", impressionHandler); }; }, [unleashClient]); }