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