w-funnel/src/lib/funnel/unleash/useUnleash.ts
dev.daminik00 54fdf8dc5a ab-test
2025-10-29 22:15:17 +01:00

72 lines
2.4 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 { useFlagsStatus, useVariant } from "@unleash/proxy-client-react";
import { useMemo } from "react";
interface UseUnleashProps {
flag: string;
}
/**
* Hook для получения варианта Unleash feature flag
* Возвращает имя варианта или undefined если флаг не активен
*
* Реализация идентична aura-webapp:
* - При вызове useVariant() автоматически генерируется impression event
* - useUnleashAnalytics() в AppProviders ловит событие и отправляет в Google Analytics
* - Событие отправляется когда пользователь РЕАЛЬНО доходит до экрана с AB тестом
*
* @see /aura-webapp/src/hooks/ab/unleash/useUnleash.ts
*/
export function useUnleash({ flag }: UseUnleashProps) {
const { flagsReady } = useFlagsStatus();
const variant = useVariant(flag);
const isReady = useMemo(() => {
return flagsReady ?? true;
}, [flagsReady]);
const variantName = useMemo(() => {
return variant?.name;
}, [variant]);
return {
isReady,
variant: variantName,
payload: variant?.payload,
};
}
/**
* Проверяет соответствует ли текущий вариант ожидаемым значениям
*/
export function checkUnleashVariant(
currentVariant: string | undefined,
expectedVariants: string[],
operator: "includesAny" | "includesAll" | "includesExactly" | "equals" = "includesAny"
): boolean {
if (!currentVariant || expectedVariants.length === 0) {
return false;
}
switch (operator) {
case "includesAny":
return expectedVariants.includes(currentVariant);
case "includesAll":
// Для одного варианта "все" означает что он должен быть в списке
return expectedVariants.includes(currentVariant);
case "includesExactly":
// Проверяем что есть ровно один вариант и он совпадает
return expectedVariants.length === 1 && expectedVariants[0] === currentVariant;
case "equals":
// Точное совпадение с первым вариантом
return expectedVariants.length === 1 && expectedVariants[0] === currentVariant;
default:
return false;
}
}