Pular para o conteúdo principal
← Voltar ao changelog

Changelog - 05/07/2026

Semana de 29/06 a 05/07, na branch main-7k do front-web-base. Semana mais leve em volume (47 commits filtrados), mas com duas decisões estruturais de tracking.

Semana 29/06–05/07 — anaLayer: uma segunda camada de tagueamento GA4, paralela à existente

  • Fundação da camada (1fceb0672): implementa o tagueamento GA4 do guia Ana Gaming num container GTM secundário próprio, com dataLayer isolado chamado anaLayer, rodando em paralelo e independente da stack de analytics atual (dataLayer/registry + Meta, Kwai e os demais). A config é brand-gated com default null, então a invariante é que nenhuma brand dispara sem container declarado. Inclui registry tipado dos 32 eventos, helper pushAnaLayerEvent, campos padrão (user_id, user_id_hash como SHA-256 do CPF, platform, profile_type, event_timestamp), event_id determinístico, AnaLayerProvider/useAnaLayer e um AnaLayerInitializer espelhando o Consent Mode v2 do initGTM. 21 testes.
  • Wiring de 22 eventos no mesmo commit — page_view, login, sign_up, modal_viewed, begin_checkout, add_payment_info, deposit_pix_generated/copied, purchase, deposit_pix_expired, withdrawal_started/requested, kyc_started/completed, form_error, view_item_list, select_item, view_promotion/select_promotion, select_content e search — disparados em paralelo aos eventos legados, lendo IDs reais das APIs. Bloqueados de propósito, com scaffold e TODO: game_opened e game_session_ended (aguardando game_session_id no StartGameResponse do core), além de refund, o ciclo de saque pós-requested, aprovação/rejeição de KYC e cashback, que são observados no backend e ficam registry-only. Nada é disparado com dado sintético.
  • Alvo trocado de 7k pra vera e depois configurado por brandfba166367 reaponta a camada pra vera em vez do 7k; b621f558e faz o useAnaLayer degradar pra no-op fora do provider; e 4bf4ebabd adiciona a flag enabled à AnaLayerConfig, criando o estado "configurado mas desabilitado": o gate passa a exigir enabled === true e containerId. Resultado no fim da semana: vera-bet-br é a única com enabled: true; 7k-bet-br e cassino-bet-br ficam com container declarado e enabled: false. Os IDs de container vivem só nos overrides de cada brand.

GTM primário desligado em produção

  • 7k-bet-br desativa o GTM em produção (38f02fef9), com PROD_DISABLE_GTM_VALUE em true, marcado no próprio commit como mudança temporária a ser revertida. Um dia depois, c878306a7 faz o mesmo em ng-7k-bet, fi-7k-bet e cl-bet7k-com. Na prática essas duas mudanças, somadas ao anaLayer acima, deixam a família 7k rodando sem a camada primária de tagueamento por alguns dias — o desdobramento (reativação com container novo, e depois a virada definitiva pro anaLayer) acontece nas semanas seguintes.

Performance — ondas 1 e 2 de PSI

  • Onda 1, crítico de paint (051292225): preload da imagem de LCP reativado com consciência de desktop, preservando fetchPriority no entry.server; primeiro thumbnail das stories vira eager com fetchPriority=high (o LCP mobile); manualChunks separado por domínio (gamification, kyc, payments, sports em chunks individuais); header com auth-gate SSR-safe (snapshot do loader + cookie is_authenticated), removendo o flash de skeleton de guest e reduzindo CLS; <link> de CSS duplicado removido, preconnect de imagem adicionado e preconnect do GTM removido na 7k; e useVersionCheck passa a estático no DefaultLayout.
  • Onda 2, TBT e terceiros (mesmo commit): Zendesk vira facade e só carrega no clique em suporte; Pendo passa a interaction-only, sem gate de bot (lab e usuário real veem a mesma página); widgets auxiliares (BackToTop, BottomNotification, LastGame) têm o mount adiado por um hook novo useDeferredMount; e CTAs de guest deixam de renderizar quando o cookie is_authenticated=1.
  • Hidratação com idle limitado (ab1872d5e): o requestIdleCallback da hidratação no entry.client ganha timeout: 2s. A segunda espera de idle era ilimitada — em página com main thread ocupado empurrava a hidratação arbitrariamente longe, o usuário real tocava em UI morta e o INP sofria, enquanto o lab (que fica idle quase imediatamente) nunca via o atraso. Mantém o agendamento por idle, com budget previsível. O registro do service worker foi desacoplado pro seu próprio defer, e o timer morto que removia #lcpElementVisibleToAll saiu (o elemento não é mais criado desde a remoção do div de LCP falso).
  • Flicker de cards no iOS eliminado (2cc9b691f): iOS Safari — e portanto todo browser no iOS, que roda sobre WebKit — piscava os cards da home durante scroll vertical e arraste horizontal, por um bug do WebKit com content-visibility: auto em scroll containers aninhados (carrossel horizontal dentro da página). content-visibility é desligado apenas no WebKit/iOS via classe cv-off no <html>, setada por script inline; Chromium (e portanto Lighthouse/PageSpeed) mantém 100% do ganho de paint. No mesmo commit entra um kill-switch global de thumbs em vídeo (.mp4/.webm/.mov) no useCustomThumb, cortando decode contínuo na GPU e cerca de 3,6 MB de mp4 na home — reversível em uma linha, com os configs de thumb por marca intactos. ee8f83ae6 reduz a memória de imagens nos carrosséis pelo mesmo motivo.
  • Entrega de imagens otimizada (89f49c652): sizes por posição no RecommendedGamesMosaic (corrigindo over-fetch dos thumbs de "Top 10 - Álbum") e no RecommendedGamesBento (compact passa de 50vw pra 33vw/25vw, w=400 → ~w=280); width/height no ícone do HomeTopBanner corrigindo CLS; getResponsiveImageProps nas imagens de SidebarButtonsGrid, derrubando URLs de 768px pra ~52/104px; ícones do bottom nav de PNG pra WebP q82 (42,7 → 12,0 KiB, −72%); e width/height explícitos nos logos de header mobile e footer. Complementado por 667a911d0, 861a66b9c e 071928489, que reprocessam os selos do rodapé de PNG grande pra WebP redimensionado, e por 35ab257e4, que converte o HomeTopBanner de import lazy pra estático.
  • Caps de conteúdo na home (c5db021b5): stories capadas em 12 (bolinhas e viewer, mais recentes primeiro, com corte único mantendo a correspondência por índice); novo HomeBannerConfig.maxSlides por brand, com 7k em 6, aplicado nas variantes multi-scroll, single-fade e side-ctas e também no GA4; rows de jogos caindo de 15 pra 12 (cap no GameCarousel, default do fetch e configs de row do base e do override 7k); torneios na home limitados a 10 (era 15); e espaçamento de torneios alinhado às rows de jogos, deixando o SectionTitle usar sua margem padrão.
  • Réplica nos demais overridesf17b27246 replica os ajustes na vera-bet-br e 136094821 nos demais overrides. b5c82e266 comenta as rows de missões, roletas, crash e slots da home do 7k; no mesmo período, o 051292225 também comenta as rows de Bolão, "Top 10 - Álbum" e profiles-row na 7k e alinha cl-bet7k-com e ng-7k-bet às rows da 7k. 0dc2a746e remove o texto de versão que ficava abaixo do "feito para brasileiros" no footer, e e7ba114f1 remove o aviso de menu rápido da home.

Cache — chave SSR menos granular e HTML purgável

  • Chave de cache SSR pública reduzida a 4 buckets (d0746bcfa): saem User-Agent, país e cookieHash da chave, que cai de centenas de buckets por dispositivo/UA pra 4 (auth × device). Isso elimina a divergência de staleness entre dispositivos e, mais importante, torna o cache SSR enumerável e purgável. O middleware passa a extrair composeSsrCacheKey/deriveSsrKeyDims como funções puras e testáveis e ganha ssrBrowserNamespaceNames e purgeSsrHtml (Cache API + varredura de KV); /api/cache/purge passa a limpar o HTML SSR, que era o real responsável pelo stale. Pra remover a dimensão cookieHash, a notificação da topbar virou client-only (nunca renderiza no SSR) e foi desativada em todas as brands e overrides, com comentário explícito de que reativá-la volta a causar CLS no PSI.

Esportes — 7k preparada pra rogue sem ligar

  • 7k-bet-br pronta pra receber a rogue, com First seguindo default (44e91b8ef): o sports.ts ganha o bloco rogue (tema escuro com a paleta da 7k) e brandPreferences idênticas às da betpontobet (sportIds, regionCodes, topLeagueIds, preferredMarketTypes), mas main continua "first" — a rogue é ligada por ambiente via FORCE_SPORTBOOK=rogue, que tem prioridade sobre o main. O sidebar-sports.ts ganha roguePath provider-aware, então não afeta a First ativa: Ao Vivo → /live, Em Breve → /today, esportes → paths próprios, e ligas com LeagueId da rogue confirmado. Ligas sem ID ficam sem roguePath e se auto-descartam no rogue até alguém preencher. O menu top-nav foi deixado intocado de propósito, porque seu to não é provider-aware.
  • Estado ativo de menu com o SDK navegando por pushState (1fcbe910a): o path do SDK é espelhado numa store (sportsNav) exposta por useSportsAwarePathname, então nav secundária, sidebar e menu do usuário marcam ativo/inativo corretamente quando o usuário navega dentro do SDK — que usa pushState e é invisível pro React Router. Adiciona "Minhas apostas" no menu do usuário (gated em rogue + auth) e faz a sidebar abrir a seção da rota atual e fechar as demais. Consome @cactus-agents/sports-rogue 0.23.0. 14dd4a75f faz a rogue respeitar filtro de home e sidebars de liga, e 47507ef78 prepara os menus de esportes da 7k ("Minhas apostas" e ajustes).
  • 401 da rogue/First não desloga mais o site (83d927b42): o token de terceiro expira por aba idle (401/1002), mas o interceptor global tratava qualquer 401 de /api/* como sessão Cactus e deslogava o site inteiro. shouldReactToUnauthorized passa a ignorar os paths de rogue (rogue-proxy, login, anonymous) — o SDK já reautentica e cai pro anônimo sozinho.
  • O SDK avança de 0.21.0 pra 0.23.0 na semana (f939c5698, e2b371b52, 1fcbe910a).

Cadastro, validação e suporte

  • Passo de verificação de full_name (e26252289): porta o step do legado, com ativação continuando backend-driven pela config validation_modules da brand — nenhuma brand é afetada a menos que o backend liste full_name para um contexto. O FullNameStep chega pré-preenchido, sanitiza na digitação via sanitizeNameInput, valida por isValidFullName (2+ palavras) e resolve a pendência, com tela de sucesso com botão "Continuar" e contagem de auto-fechamento; a rota api/validation/full-name/submit faz proxy pra updateProfile(id, { name }). Três defeitos apareceram na integração com depósito e saque e foram corrigidos junto: o gate passa a ler um snapshot fresco do usuário (useAccountsStore.getState()), de forma que um step que muda dado é reavaliado corretamente em contextos encadeados; a store validationSteps ganha openSeq e o ValidationStepContent é keyed nela, então fechar e reabrir no mesmo tick remonta o step (corrige a tela de sucesso congelada com botão morto no depósito); e a contagem da tela de sucesso passa a usar intervalo + timeout estáveis, imunes a churn de re-render. Bumps: validations ^0.8.0, accounts ^2.8.0, i18n ^0.96.0.
  • Zendeske80c2227e corrige a leitura do JWT, que vem no campo jwt do BFF e não em token; 9aa6070ba passa a chamar /api/user/zendesk-token só na abertura do chat.

Core / SDK

  • @cactus-agents/validations (0629dd3) ganha o módulo de validação de full_name e (225e1c1) o sanitizeNameInput pra filtragem de input de nome; @cactus-agents/i18n (e8eadd0) publica as strings full_name de continuar e continuar-em.

Brand Overrides

  • 7k-bet-br: faixa promocional na home e banner de torneio no perfil (8fef3e62b), com a faixa inteira virando clicável (9ce7ccc2f) e depois reduzida junto com o ícone pra 32px (a6aec73cd); d6bc4cb00 troca Poppins por Montserrat na faixa; f0c3814e0 reposiciona o carrossel da Pragmatic Play acima de "Jogos da PG" em /cassino. 0be5855b9 remove o item "Bolão" do bottom nav (mantendo feBolao7k na sidebar e no campaign widget), faz o bottom nav renderizar de forma síncrona no SSR (removendo a dupla camada lazy, e com ela o pop-in pós-hidratação), cola as setas overlay do footer mobile na borda, adiciona aria-label no botão de copiar link da página de jogo e reduz o over-fetch da imagem de fundo em blur.
  • cassino-bet-br: pill de saldo no modal de check-in diário (e7f9796f5).
  • Sidebar do base (6ee83c4c2): no variant default a home abre todas as seções, e o modo recolhido respeita seção fechada.

Pagamentos

  • Mapeamento de status v3 de falha no TransactionCard aplicado em 5c4f4c808 e revertido no mesmo dia em 779090b8d.

Infra / CI/CD

  • Nove bumps de geração de cache em uma semana615ec72 (v5v6), ce43f27 (v6v7), 67fcba2 (v7v8), 42a2325 (v8v9), 94812ac (v9v10), 768857d (v10v11), 4792bcf (v11v12) e 8cc3b04 (v12v13). É o sinal mais claro de que o número da geração é um valor operacional volátil: qualquer doc que precise citá-lo deve apontar pra front-ops/config/cache/generation.yml em vez de congelar a versão.
  • Environments novos e repontamentos — ops 20f762e adiciona sports-7k-bet-br e app-7k-bet-br; 91b8eee e 55fc7d2 apontam environments pra feat/sweepstake e depois pra dev-7wins; f7b8e68 reorganiza sports, state77-com e performance-7k; 34d1788, 5ff6d9a, c6afe7b e c41aaf1 ajustam auto-deploy e default_branch de 7k-bet-br e vera-bet-br. 09c13de00 sincroniza o dropdown de deploy do base com os environments do front-ops.
  • f5efac531 restaura o pnpm-lock.yaml sem o drift de libc não relacionado que havia entrado.