Pular para o conteúdo principal
← Voltar ao changelog

Changelog - 23/04/2026

Consentimento de Cookies / LGPD

  • Banner de consentimento de cookies com Google Consent Mode v2 chega ao base. O CookieConsentBanner (fixado no canto inferior esquerdo, animado, z-60) e o painel CookieConsentDetails (abas Configurações/Sobre, toggles por categoria, tabela de cookies) injetam os defaults do GCM antes do GTM inicializar e gravam a preferência no cookie cactusCookiesConsent. Mapeamento de categorias: performance → analytics_storage, functionality → functionality_storage, demais → ad_storage + ad_user_data + ad_personalization. Bypass para bots via useIsBot(). Feature flag brand.features.cookieConsentPopup controla a exibição por marca, sem build-time config.
  • Paridade total com o legado Vue (base + 7k + cassino + vera): adicionado o sétimo sinal do GCM v2 (security_storage: granted) para auditorias Lighthouse/CMP enxergarem o contrato completo; COOKIE_TABLE expandida de 6 para 19 entradas cobrindo Cloudflare, GA4, Clarity, Meta Pixel, Kwai, Amplitude, Smartico e cookies de funcionalidade (current_lang, topbar_closed, install_app_popup_closed); migração transparente do formato legado (array JSON de strings) para o novo objeto, sem reprompt de usuários existentes.
  • UX e visual: o banner se posiciona acima do MobileBottomNav em mobile (h-14), some quando o drawer está aberto, fica print:hidden, e tem split 50/50 entre [Personalizar | Recusar] e [Aceitar todos]. Cores 100% via tokens de tema (bg-secondary, text-texts, bg-primary), eliminando bg-white/* e border-white/* hardcoded. O botão "Salvar" dentro do painel de detalhes se torna "Aceitar todos" quando só a categoria necessária está marcada — replica o saveButton() do legado.

Auth e Recuperação de Senha

  • Fluxo de recuperação de senha com KYC adota o contrato do BFF como fonte única da verdade. O endpoint /auth/passwords/reset/options agora retorna active_options (flags por método) + kyc (elegibilidade), e o RecoverOptionsStep renderiza estritamente a partir disso — sem flag, sem opção. Quando a interseção com os dados de contato disponíveis fica vazia, a tela mostra mensagem "nenhuma opção disponível" com CTA para suporte ao vivo, evitando que o usuário fique encalhado. A flag local recoveryPasswordMethods foi removida do tipo, do features.config.ts do base e dos 11 overrides de marca.
  • RecoverKycStep reescrito como máquina de estados (useKycStore.{open, step, error}): substitui o spinner genérico anterior que deixava o usuário preso em "aguardando verificação" durante cancelamentos, erros do BFF e polling pós-iframe. Estados validated avançam para nova senha; erros fatais (failed/expired/internal_start_error/internal_status_error) fecham o modal, mostram toast e chamam resetToDocument() para reiniciar a partir do CPF; modal fechado em initial/started renderiza tela "Verificação interrompida" com CTAs de retentar/trocar método; estados finished/checking/manual_refresh mostram a UI de polling com botão "Cancelar" que conta 20s antes de habilitar.
  • Token de recuperação separado do access token: /kyc/status/recovery agora retorna access_token OU recovery_token. A rota /api/kyc/status só seta o cookie de sessão para access_token; recovery_token flui pelo body do JSON e o store atualiza o flow token via a nova action setFlowToken. Origem do KYC varia entre recovery_password e password_recovery_attempt_limit conforme o ponto de entrada.

Analytics / Tracking

  • Mixpanel, Hotjar e Pendo integrados como infra genérica e config-driven. Cada SDK ganha um arquivo de tipo (app/types/{mixpanel,hotjar,pendo}.ts), config default desabilitada (enabled: false) e hook próprio: useMixpanel (wrapper sobre mixpanel-browser com import dinâmico — zero custo de bundle quando desabilitado, expõe trackEvent que auto-injeta { house: houseName }, identify, reset); useHotjar (injeta o snippet uma vez e opcionalmente chama hj('identify', null, { encryptedId, brand, hasFirstDeposit }) pós-auth quando identifyUsers: true); usePendo (injeta o agent loader e roda pendo.initialize({ visitor, account }) quando o estado de auth estabiliza). O componente AnalyticsLoaders monta os três hooks e está pendurado no app/root.tsx ao lado do TrackingCapture.
  • Eventos de auth no Mixpanel: trackLogin agora também chama mixpanel.identify(user.id) + evento Login Succeeded; trackRegistration adiciona identify + Sign Up Succeeded. Novos eventos trackLoginSubmitted / trackLoginFailed são exclusivos do Mixpanel (sem equivalente GTM), disparados pelo LoginModal.handleSubmit e pelo bloco catch.

Sistema de Indique e Ganhe

  • Variantes da página de Indique e Ganhe consolidadas em três opções: default (cactus, API padrão), custom-v1 (ex custom-stats, hero com prêmio + cards de indicações qualificadas/total ganho — usado por 7k/cassino/vera) e v2 (ex betpontobet, com tiers de recompensa configuráveis). Os nomes ficaram brand-agnósticos para qualquer marca poder reusar. O config padrão da v2 agora ship vazio — antes carregava valores específicos do betpontobet (api.donaldbet.app, slug betbet, tiers R$ 50/100/200/300, shareMessage persuasivo) que vazavam em todo build; a marca betpontobet-bet-br ganhou override próprio com esses valores.
  • Novo proxy server-side /api/user/referral-indicator para a variante custom-v1: encaminha Bearer encrypted_user_id ?? user.id para a API legada externa (amigos.verabet.app / connect-7k.gdm7khub.com / connect-v2.gdmhub.io), garantindo que o token nunca chega ao cliente. Acompanha novo tipo ReferralCustomStatsConfig (com apiUrl, maxReward, minBetAmount, providerName, eligibleGamesPath) e augmentation do AuthUser para incluir encrypted_user_id opcional.
  • CTA dinâmico da sidebar respeita a variante: useReferral resolve bonusAmount do config da variante ativa (v2 → maxReward, custom-v1 → maxReward se setado, senão API; default → API). Corrige o badge "Indique e Ganhe R$ 0,01" da betpontobet quando o stage retornava valor de teste. SidebarNarrow consome bonusFormatted direto do hook.

Pagamentos

  • Saque para Finlândia (FIN) renderiza formulário próprio. O WithdrawForm passa a tratar as três variantes de transferência bancária explicitamente (NGA/FIN/CHL) em vez do fallback "NGA vs tudo cai em CHL", que estava renderizando campos chilenos (tipo de conta, dropdown de banco, aviso de RUT) para usuários finlandeses. Novo FinBankTransferFields mostra um único input de número de conta + aviso de propriedade do documento via a chave i18n fin_document_ownership_warning. Payload final para FIN agora envia apenas bank_number (sem bankCode, account_type ou generic_bank_*).

E2E Tests / Playwright

  • data-testid nos elementos críticos para Playwright: botões de login/registro no HeaderDefault, submit do LoginModal, wrapper do GameCard e MobileBottomNav. Necessário para os seletores do repositório front-tests-e2e. Junto, todos os hooks Husky passam a fazer source do nvm com --no-use, evitando exit code 3 sob bash 3.2 (o /bin/sh do macOS) onde o auto-switch do nvm explodia em sh -e.

Brand Overrides

  • cassino-bet-br: bootstrap completo da marca portada do legado Nuxt. 71 arquivos novos (theme azul-marinho + ciano, features, licenses com textLicense + selos da autorização SPA + IBIA + Sport Radar + EBAC + Compulsafe + BeGambleAware + Gambling Therapy + Be Complience + patrocínio Bis Awards, gamification com Smartico brandKey 0a13ef04 + CassinoVip/VipCoins, page descriptions, menu/sidebar/home-rows/casino-rows espelhados do legado, Cactus Sportsbook, variante de referral custom-v1 apontando para connect-v2.gdmhub.io). Assets PWA, favicons, logos, touch-icons e selos próprios da marca incluídos. Configurações de Mixpanel/Hotjar/Pendo virão em PR de follow-up depois que a infra base estabilizar no stage.
  • fi-7k-bet: menu lateral do cassino realinhado ao games-menu.json legado — reordenadas as categorias (All Games, Slots, Live Casino, Providers), slug do Aviator trocado de spribe/aviator para banana/aviator-crash, Blackjack ao vivo trocado de evolution/infinite-blackjack para pragmaticplay/live-one-blackjack, adicionados Fortune Dragon (PG Soft) e Fortune Fruits (Banana), removidos Brazilian Roulette e Infinite Blackjack. No mesmo dia: licenças com texto oficial de compliance (NovaWave Technology N.V. + Stonefield Technologies como Billing Agent, GoC OGL/2024/547/0446) substituindo o placeholder em espanhol; flag pixEvpEnabled zerada (Pix está desabilitado para FIN no country-config).
  • vera-bet-br: Mixpanel ativado (house: 'Vera') + Hotjar (hjid 6503935, sem identify para casar com o snippet do legado). O proxy de referral-indicator aponta para https://amigos.verabet.app.
  • betpontobet-bet-br: ganha override completo do referral-v2.config.ts agora que o default ficou vazio — preserva os tiers de recompensa, shareMessage e configuração da api.donaldbet.app.

Core / SDK

  • Pacote @cactus-agents/i18n ganha o namespace consent completo nos 4 locales (pt-br, pt, es, en) — primeiro com 68 chaves cobrindo o banner de cookies, depois expandido para o catálogo completo de 19 cookies que o front consome. Tipo I18nNamespace registrado.
  • Pacote @cactus-agents/i18n recebe a chave fin_document_ownership_warning no namespace user (4 locales) para o aviso do formulário de saque finlandês. Acompanha changeset.
  • Pacote @cactus-agents/accounts corrige TwoFactorPayload para os campos esperados pelo BFF: two_factor_type e two_factor_enabled (mesma shape do AuthUserInfo), em vez de type/enabled. Os nomes errados faziam o PATCH /bff/users/self-two-factor virar no-op silencioso, e o estado de 2FA do usuário nunca mudava de fato.