# Testes A/B e feature flags

Crie testes e controle features direto pelo dashboard, sem precisar de novo release.

## Testes A/B

No dashboard, vai em `Testes A/B` → `Criar Teste AB`. O nome que você dá ao teste gera a chave usada no código (o dashboard mostra essa chave logo abaixo do campo). Escolhe a fase (pré ou pós-paywall), a plataforma, e define de 2 a 4 variantes com seus nomes.

Por exemplo, pra testar se uma barra de progresso no onboarding melhora a conversão, cria um teste "Progress bar" (chave gerada: "progress_bar") com variantes "on" e "off". No código, chama `getVariant` com essa chave. O SDK retorna em qual variante aquele usuário caiu. Se não caiu em nenhuma, o campo `variant` vem `null` (controle).

```typescript
import { useState, useEffect } from "react";
import Paywallo from "@virex-tech/paywallo-sdk";

function OnboardingScreen() {
  const [variant, setVariant] = useState<string | null>(null);

  useEffect(() => {
    Paywallo.waitUntilReady()
      .then(() => Paywallo.getVariant("progress_bar"))
      .then((result) => {
        setVariant(result.variant);
      });
  }, []);

  if (variant === "on") return <OnboardingWithProgressBar />;
  return <OnboardingDefault />;
}
```

Você pode criar até 4 variantes por teste. O dashboard mostra as métricas de conversão por variante e calcula significância estatística automaticamente.

```typescript
import { useState, useEffect } from "react";
import Paywallo from "@virex-tech/paywallo-sdk";

function OnboardingScreen() {
  const [variant, setVariant] = useState<string | null>(null);

  useEffect(() => {
    Paywallo.waitUntilReady()
      .then(() => Paywallo.getVariant("onboarding_flow"))
      .then((result) => {
        setVariant(result.variant);
      });
  }, []);

  // use switch, if/else ou qualquer padrão que preferir
  switch (variant) {
    case "curto":
      return <ShortOnboarding />;
    case "video":
      return <VideoOnboarding />;
    default:
      return <LongOnboarding />;
  }
}
```

## Feature flags

Pra liberar uma feature pra um grupo específico de usuários (por plataforma, versão do app ou país), use `getConditionalFlag`. Essa configuração ainda não tem tela no dashboard: fale com o time Paywallo pra criar as condições. Se a flag não existir ainda, a chamada retorna `false`, sem erro.

```typescript
const enabled = await Paywallo.getConditionalFlag("beta_checkout", {
  platform: Platform.OS,
  appVersion: Application.nativeApplicationVersion,
  country: "BR",
});

if (enabled) {
  // mostra nova feature
}
```

## Remote config

Cada variante pode carregar um payload JSON, mas isso também ainda não tem campo no dashboard: peça ao time Paywallo pra configurar o payload de uma variante existente. No React Native e no Swift, o SDK devolve o payload já estruturado. No Kotlin e no Flutter, `variant` guarda o JSON como texto puro e você decodifica.

```typescript
const { payload } = await Paywallo.getVariant("pricing_config");
// payload = { trialDays: 7, primaryPrice: 9.99, ctaText: "Começar grátis" }
```

## Múltiplas flags e pré-carregamento

Pra resolver várias flags de uma vez:

```typescript
// Resolver várias flags de uma vez
const flags = await Paywallo.evaluateFlags(["flag_a", "flag_b", "flag_c"]);
```

O SDK resolve as flags em runtime, a cada chamada de `getVariant`, `evaluateFlags` ou `getConditionalFlag`. Chame `waitUntilReady()` antes de qualquer uma delas: no cold start o SDK ainda não tem `distinctId`, e sem ele a chamada devolve o valor de controle em silêncio, enviesando o experimento.
