72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
"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;
|
||
}
|
||
}
|