Pular para o conteúdo principal
← Voltar ao changelog

Changelog - 12/04/2026

Semana 06–12/04 — Onboarding de depósito: banner de bônus, auto-abertura e prefill

  • FirstDepositBonusBanner entra no DepositModal (94fe5c7b7), visível enquanto o formulário de depósito está ativo, para expor a oferta de primeiro depósito no exato momento da decisão. 62ff8e4a1 ajusta a margem e renomeia o maxLabel não consumido para _maxLabel, mantendo o Biome quieto sem apagar o campo.
  • O modal de depósito volta a abrir sozinho para quem tem saldo baixo (bf390c85e), replicando o useOpenModalAfterTime do front Vue/Nuxt legado: abre após login ou registro quando o saldo é ≤ R$ 0,99, pula contas restritas (autoexclusão, somente-saque), respeita cooldown de 12 h gravado em localStorage, espera 1 s para que modais de validação e bloqueio tenham prioridade, e limpa a chave no logout.
  • ?value= na URL pré-preenche o valor do depósito (c34c93d93), fechando o ciclo de campanhas que mandam o usuário direto para um valor sugerido. O namespace de i18n de pagamentos ganha as mensagens de bônus de primeiro depósito nos três idiomas (core f31c309).

Carteira, rollover e saque

  • BonusWalletCard passa a mostrar o rollover de verdade (9cfe45573): barra de progresso de valor apostado (apostado x alvo do multiplicador) somada à barra de rodadas já existente, badge de tipo de rollover (cassino ou esportes, em cor warning), texto explicando em qual vertical o rollover conta e botões de ação "Acessar Jogos" / "Acessar Esportes" via routeHref. O tipo é inferido de sportsAmountHold / casinoAmountHold do wallet e os valores são convertidos de centavos. No mesmo commit, o BonusRulesModal ganha a seção de aviso com as regras de saque de cassino e de esportes.
  • 7eb8682ac troca o método de fetch da API de wallet e refatora os componentes de bônus para consumirem o novo formato de rollover. Do lado do core, 2464cf0 corrige a lógica de expiração de bônus e reescreve a transformação de rollover para campos planos vindos direto da API (rollover_countrolloverCount, amount, max_bonus_withdraw_amount), em vez de um objeto aninhado que o base tinha que navegar. As chaves de progresso de rollover e de regras de saque de bônus entram no @cactus-agents/i18n (c5ded44).
  • Modal de saque fica legível em telas estreitas (98717d04f): os campos informativos passam a empilhar verticalmente em vez de disputar a mesma linha, e 0404fe2fc dá respiro ao botão de regras. Os labels de método, mínimo e máximo foram encurtados no core (abb83c0), que é onde eles moram.

Blog interno com a API do WordPress

  • Nova página de blog servida pela API WP (0f427932d): resolveBlogApiUrl() centraliza a resolução da URL (promotionsWpApi sem filtro de categoria > link de blog da marca > null), blog.server.ts expõe fetchBlogPosts e fetchBlogPostBySlug, e as rotas blog e blog.post entram no route registry (tipos, paths e config). A listagem renderiza grid de posts e a página de detalhe consome o slug. Sidebar e FooterMain passam a decidir entre link interno e externo conforme features.internalBlog e o resultado do resolveBlogApiUrl. Degradação graciosa: sem flag ou sem URL resolvida, a rota redireciona para a home em vez de renderizar tela vazia.
  • A flag mudou de lugar no meio do caminho, e vale registrar. O core primeiro adicionou internal_blog_active em RawFeatures e internalBlog em BrandFeatures, com transform e chaves i18n de blog (2673d6c); logo em seguida o transform foi removido (108d921) porque a flag não vem do BFF — ela é decisão de front. O base moveu a leitura para o featuresConfig (04ad06881), e 2d705a010 propagou as rotas de blog no routes.paths.ts de todos os overrides (c6e7c423d cobre os testes).

Versionamento do service worker e aviso de nova versão

  • Novo swVersionPlugin no vite.config.ts injeta o hash do build no public/sw.js (5b65e52aa), o que finalmente invalida o cache do service worker a cada deploy. Junto vêm a rota app/routes/api/version.ts, o hook app/hooks/useVersionCheck.ts que compara a versão servida com a carregada, e o componente UpdateBanner pendurado no DefaultLayout para avisar o usuário. O sw.js também passa a limitar o tamanho do cache de imagens.
  • 805ae911b reestiliza o UpdateBanner com foco em acessibilidade, e as traduções de atualização de versão entram no core em inglês, espanhol e português (d8925e5).

Performance e PSI — primeira onda

  • Modais passam a ser carregados sob demanda (ceae863d1): missões, stories, auth, KYC e pagamentos saem do grafo eager, o que tira peso do bundle inicial de toda página.
  • Detecção de bot ganha caminho próprio (d2a57ed53): listeners de DOM caros são pulados para crawlers, e 038a96bc0 conserta os arrays de dependência de useEffect que ignoravam IS_BOT. Na mesma linha, 6a0188b7c e 944ccac72 fazem preload da primeira imagem de banner — inicialmente restrito a bots, para satisfazer a auditoria de LCP request discovery do PSI.
  • Esqueletos de carregamento + rastreio de hidratação contra CLS (f8c8eb5f2), prioridades de imagem revistas (d41dd2ce1, com lazy/low para o que não é crítico) e GameGrid reescrito para renderizar menos (25892efae).
  • As linhas renderizadas eagerly passam a ser contadas, não listadas (20dfb7e33): home, cassino e cassino ao vivo recebem um número de linhas eager em vez de uma lista fixa de slugs, o que sobrevive a mudança de configuração de marca e de layout vindo da API.
  • Cabeçalhos de segurança e cache de assets estáticos (d8bf5ad9e): applySecurityHeaders passa a receber o request e os arquivos servidos de /assets/ ganham 12 h de cache de browser com revalidação. 921858a03 completa a leva com ajustes no root.tsx, no HomeBannerCarousel e no middleware do worker, e 6cfef6612 desliga a Topics API do Chrome, que enchia o console de avisos de depreciação.
  • Tipografia: 22856890f refina a integração da Montserrat e o fallback, d50686668 padroniza os pesos de fonte entre componentes.
  • Uma série longa de iterações de dimensão de imagem responsiva (45615abc1, 75382e164, 09b72118f, ea5d465d8, 2dc3f7652, 653018d1b, 03f378d3c, entre outras) calibrou GameCard e carrosséis contra a resolução do Moto G que o PageSpeed usa. São ajustes de tentativa e erro no mesmo ladder de larguras — o resultado consolidado é o que ficou nos componentes, não cada passo.
  • Acessibilidade a partir dos achados do PSI: 6ed690c41 sobe o contraste do SearchTrigger (text-texts/40/60) e 98f2b1451 adiciona aria-label nos controles que não tinham nome acessível.

Imagens via proxy same-origin

  • As URLs de imagem do Cloudflare passam a ser servidas pelo mesmo domínio (core a60dbcb): buildNormalizedCloudflareImageUrl devolve caminho de proxy same-origin, eliminando o DNS lookup e o TLS handshake extras contra imagedelivery.net. No base, 78a24e7a0 roteia o tráfego por /cdn-cgi/imagedelivery e 7d3efb1d0 remove o utilitário de substituição de URL que existia só para reescrever o host.
  • Escape hatch para desenvolvimento local (core 2b4a242): ImageDefaults ganha useProxy; com false, o builder volta a devolver URL absoluta, o que o próprio commit justifica como melhoria da experiência de desenvolvimento local. O core também ganhou fit em ImageOptions (81c175f) e aspectRatio em ResponsiveImageOptions para derivar altura proporcional (6a9cb85).
  • HomeBannerCarousel simplificado (3dace2e27): o hack de placeholder foi removido e o carrossel passou a consumir o proxy direto.

Auth, formulários e i18n de interface

  • PasswordStrengthBar integrada à validação de senha (e1a84f40f), com as traduções de regra de senha reescritas no core para dizer quais caracteres são válidos em vez de só apontar o erro (a6c78fc).
  • Alternância de visibilidade de senha no formulário de troca de senha (0e11b2838).
  • Cor de autofill dos inputs passa a respeitar o tema (51671279a, corrigido em 68a99bc75 para usar theme() em vez de variáveis CSS que não existiam) — o estilo que o browser aplica ao campo autopreenchido ignorava a paleta da marca.
  • Popup de tradução do browser desabilitado em todas as páginas (913addd44).
  • Labels hardcoded de Notificações e Provedores viram chaves i18n (05dde20e1), e 6f60dbdfc adiciona os IDs semânticos de esporte aos slugs de firstPath da sidebar.

Gamificação para visitante não autenticado

  • As flags de acesso público saem dos componentes de gamificação (c4012fa13): MissionsSection, TournamentsSection, TournamentCard, Sidebar e as rotas de /vip/* deixam de consultar feature flags próprias e passam a respeitar a config do módulo. O core dá o suporte com a propriedade public no GamificationModuleConfig, default true (4939ef2). O efeito prático: decidir se visitante deslogado vê missões e torneios passa a ser uma linha de config por marca em vez de duas flags espalhadas.

Cache e configuração de ambiente

  • A camada de cache antiga foi removida (24febfefe): cache.server.ts deletado, GAMES_CACHE_TTL e BRAND_CACHE_TTL fora do worker-configuration.d.ts, platform-cache.server.ts passando a usar CACHE_NAMESPACE e os TTLs de SSR configuráveis por variável de ambiente. O .env.example foi atualizado para refletir isso.
  • Core: @cactus-agents/platform-cache faz purgeAll limpar as duas camadas — memória e Cache API do Cloudflare — e purgeByPrefix passa a devolver promise após limpar ambas (b3bb2c5, bump 0.5.0 consumido em af4aaeb61). Enquanto a Cache API não era limpa, o edge continuava servindo o valor anterior mesmo após um purge.
  • Deploy passa a purgar e aquecer o cache (ops 4dde7a5 e 8a69e35): novo passo de purge do cache SSR do Cloudflare depois do deploy, com o namespace de cache anexado por ambiente para isolar as entradas entre ambientes, e um passo de warm-up que pré-carrega os caminhos principais. O purge passou a mirar todos os segmentos do platform-cache.

Brand Overrides

  • x2b-bet: marca nova. 6320a2444 traz a árvore de override completa (18 configs — tema, features, header, bottomnav, sidebar, sidebar de esportes, linhas de home/cassino/cassino ao vivo, ligas da home, licenças, descrições de página, routes.paths.ts, game-details.server.ts) mais favicon e ícones PWA; c0e21f0ed cria o ambiente de deploy e bac7efdd4 adiciona a exceção no .gitignore (ops 6b2121a provisiona o worker).
  • betpontobet-bet-br: cor de fundo da tela de login corrigida (98f2b1451), job de auto-deploy a partir da branch dev (0d66d192d, ops 2f8912b) e um ambiente performance dedicado a medição de PSI (ops dc87b68) apontando para a branch performance com a mesma configuração de cache do stage. Configs de cache obsoletas dos ambientes antigos foram removidas (ops 5571a20, cb5755c).
  • casateste-com: o worker do ambiente foi renomeado para o padrão vigente e o ambiente de sandbox interno ganhou auto-deploy (ops 50afdf0, a6b8e48, cf3c072, incluindo o ajuste de branch default dos workers do web-base).

Core / SDK

  • Pacote @cactus-agents/platform-cache purga memória e Cache API do Cloudflare no mesmo purgeAll (bump 0.5.0).
  • Pacote @cactus-agents/utils evolui o gerador de URL de imagem do Cloudflare — proxy same-origin por padrão, useProxy para desligar, fit e aspectRatio (bump 0.12.0 consumido em fbf1d913f).
  • Pacote @cactus-agents/gamification adiciona public ao GamificationModuleConfig (bump 0.5.0 consumido em d6eff9c64).
  • Pacote @cactus-agents/games corrige o endpoint de listagem de jogos de cassino (c3f86cb, bumps 0.18.1 e 0.18.6).
  • Pacote @cactus-agents/i18n recebe rollover, regras de saque de bônus, bônus de primeiro depósito, regras de senha com caracteres válidos e as mensagens de atualização de versão (bumps 0.40.0 a 0.43.0).

Infra / CI/CD

  • Nova branch performance com ambiente próprio (bda5e0344 no base, ops dc87b68), para rodar PSI contra um deploy real sem misturar com stage.
  • Refino sucessivo das condições de deploy do ci-deploy.yml (1e4c153d2, 38a4fec04, 646264114, b9c63806a, e0af9ae95) enquanto o número de marcas crescia — cada marca nova exige entrada no dropdown de workflow_dispatch e no mapa de ambientes.
  • d7b84a65a desliga noDangerouslySetInnerHtml globalmente no Biome e remove os // biome-ignore inline espalhados pelos componentes que renderizam HTML vindo do WordPress e do backoffice.