116 lines
5.1 KiB
TypeScript
116 lines
5.1 KiB
TypeScript
"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]);
|
||
}
|