w-funnel/src/lib/funnel/unleash/useUnleashAnalytics.ts
dev.daminik00 a75ac7e8c8 session
2025-12-24 02:06:11 +03:00

116 lines
5.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"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]);
}