Pular para o conteúdo principal
← Voltar ao changelog

Changelog - 07/06/2026

Semana 01–07/06 — Nova marca: donald-bet-br

  • Override criado a partir da betpontobet-bet-br53e519d58. Mesmo operador (OPEN GAMING SA), então o esqueleto de config é reaproveitado inteiro; o que muda é identidade visual, IDs de terceiros, copy de SEO/FAQ e tom de voz — deliberadamente, pra evitar duplicação de conteúdo entre as duas marcas do mesmo grupo aos olhos do Google.
  • Identidade e integrações — paleta navy + ciano do backoffice (primary #03c6fc, bg-primary #091635, bg-secondary #05102c, sidebar #021c47), topbar no azul dos balões dos cards de jogo, header com Cadastrar sólido ciano e Entrar em outline ciano (paridade com a produção legada) e sidebar buttons em tom navy em vez do cinza neutro. Gamificação com brandKey e labelKey próprios do Smartico e naming "Clube Donald" / "Pontos". Analytics com container GTM próprio via Stape em subdomínio da marca, facebookDomainVerification própria e Taboola compartilhado. Referral com brandSlug próprio, lido do header x-brand do plugin legado. WordPress, portal de atendimento e ouvidoria em subdomínios próprios.
  • Ambientes e CI — front-ops 5e24b0b cria os dois ambientes: produção (donald.bet.br, deploy manual gateado pelo time de deployers criado na semana anterior) e stage com auto-deploy na branch stage. Espelha o padrão da betpontobet-bet-br, e ambientes de dev/performance foram intencionalmente omitidos pra essa marca. 545188bd2 adiciona a marca ao dropdown de deploy do base, corrigindo o drift entre repositórios.
  • Este onboarding abre a maior construção de marca do trimestre: o design system da donald consome as semanas seguintes.

SEO — dados estruturados, fase 2

  • Homepage e hubs de cassino8cedae8ed adiciona alternateName, SearchAction e BreadcrumbList na homepage de uma das marcas BR, e c51637501 põe ItemList nos hubs de cassino e cassino ao vivo, descrevendo as coleções de jogos como listas ordenadas em vez de páginas opacas.
  • Autor e publisher separadosd0b10bd57 divide author e publisher no SoftwareApplication, que antes colapsava os dois na mesma Organization. cccb4d535 absolutiza a URL do logo da marca nos payloads de JSON-LD — URL relativa é inválida no schema e era silenciosamente descartada.
  • Novos tipos de schema em superfícies que não emitiam nadaa1d1fb484 (BreadcrumbList nas páginas de torneios e missões VIP), 774fc0c97 (Offer no hub e no detalhe de promoções), 30542e80f (schema de Blog mais publisher.logo em BlogPosting) e 99f13fbd4 (FAQPage no hub /faq).
  • x-default volta a apontar pra cada marca64a3f4aa0 reverte parte da decisão da semana anterior: cl-bet7k-com, fi-7k-bet e ng-7k-bet declaravam x-default apontando pro site-mãe brasileiro, o que roteava usuário de locale não mapeado pra variante em português em vez da página localizada da própria marca. Cada uma passa a auto-referenciar o x-default.
  • Config de JSON-LD por marca1b6773101 e eb4f7ed8b (recuperação de query de marca via canonical, alternateName e links internos) e f6fb60079 (alinhamento da meta_description da home nas marcas não-BR).

Recuperação de 404 a partir do Search Console e do Cloudflare Analytics

  • Três lotes de redirects em três marcasb85ec156c abre o primeiro lote da cassino (404 → equivalente moderno ou home) e 481e67614 traz o lote 2 com 25 entradas novas, incluindo um catchall de /sports/* cobrindo ~80 URLs antigas de eventos e categorias em inglês com o tail preservado, e sete entradas /page/{slug} em inglês resolvendo pra legal.page com slug canônico — que funcionam em redirect de dois hops junto com os catchalls de locale do base. O mesmo commit estende a regra de /deploy-* do middleware pra cross-domain.
  • ~120 entradas novas no 7k91995abeb cobre URLs 404 reportadas no Google Search Console, com mais de 60 delas sendo slugs de glossário de mercados de aposta do stack legado que viviam em /ajuda/<mercado> (futebol, basquete, tênis, tênis de mesa, League of Legends) e cujo conteúdo foi descontinuado — as literais vencem o smart resolver de /ajuda/:slug por preferência de especificidade do React Router. 5b5b37f67 completa a cobertura com o drilldown do Search Console exportado em XLSX no dia anterior.
  • 218ea5a20 faz os lotes 1 e 2 da vera.

Carteira

  • Barras de progresso de rollover voltam a andar308025448. Enquanto um rollover está em andamento o BFF responde /bonus/rollover com 400 ("must bet 40x"), mas o body ainda carrega o progresso ao vivo (amount, count, first_transaction). O fetchWalletData do core engolia a falha com .catch(() => ROLLOVER_DEFAULT) e descartava o body — então as barras ficavam congeladas em 0% mesmo com o saldo de bônus sendo gasto. O fix replica a orquestração de smart-skip no proxy /api/wallet/refresh e recupera o body do 400 via extractApiError, desgateando as leituras de progresso do BonusWalletCard de rollover.success (que é false durante rollover em andamento). Fica um TODO(core) pra mover a recuperação pro fetchWalletData e derrubar o workaround.
  • Modal de comprovante vazio41de5e663. Bug reportado nas três marcas BR: clicar em "Ver comprovante" no histórico de saque abria o popup vazio, sem PDF e sem mensagem de erro. Causa raiz: o endpoint /withdraw/{id}/generate devolve o PDF como string base64 em plain text — body sem aspas, sem envelope JSON — e o api-client sempre tenta JSON.parse(text) na resposta, então quando o body é texto válido mas não-JSON o resultado vira null e chega ao componente sem nada pra renderizar.
  • Expiração de bônus em horas, não em dias757b420da. O /bookmaker-settings devolve rollover_casino_expires_in e rollover_sports_expires_in como números puros, sem unidade (24, 72), e o front concatenava com "dias" via a chave de i18n wallet.days_count — mas por contrato de plataforma esses valores são horas. Na prática, o 7k exibia "Expiração esportes: 72 dias" onde o correto era 72 horas.
  • e8882ac60 força refresh de perfil depois do toggle de marketing pra sobreviver a cache cross-isolate: o invalidateAuthTokenCacheForRequest adicionado em maio resolve o caso de um isolate só, mas com múltiplos isolates do Worker o loader do _layout podia cair num isolate cujo tokenCache ainda tinha o perfil velho — o toggle de Comunicações em /user/config só "salvava" depois de novo login em duas das marcas.

Widgets e home

  • CampaignWidget ganha modo agregador multi-ponto759a1dac1 adiciona um terceiro mode: "multi" ao widget flutuante: um FAB expansível (speed-dial) que abre uma lista configurável de pills de acesso em vez de levar a um destino único. O CampaignWidgetMulti traz reveal escalonado, backdrop estilo modal, fechamento por clique fora e Escape, preenchimento em hover com o acento da marca e pills com borda; reaproveita SidebarButtonItem, resolveSidebarButton e isItemVisible; adiciona o discriminante smarticoAction pra deep links e uma flag visible que permite declarar um item e mantê-lo escondido em todos os variants. Um item foi deixado em standby — declarado uma única vez na config base com visible: false, não duplicado nos overrides — junto com o agregador do 7k, que abre com quatro pontos de acesso.
  • Sistema de variants do widget recommended-games0e77ffec0. O widget passa a escolher o layout visual por config de marca (bento ou mosaic), com as duas variantes lendo a mesma fonte de dados (appearance.recommendedBanners, da API de appearance do backoffice). Entra o RecommendedGamesMosaic, port React do mosaico legado do 7k (card hero, cards empilhados no meio, linha de baixo e mini-lista lateral começando no item 6 no desktop, com os itens em md:flex-1 pra encher a altura da seção e highlight em hover no acento da marca), ao lado do RecommendedGamesBento que já existia. A seleção é por slug único recommended-games mais recommendedGamesConfig, resolvida por registry e dispatcher em RecommendedGames.tsx — o mesmo padrão dos sidebar-buttons. O CTA do hero usa o CtaButton compartilhado, e o view_item_list do GA4 dispara no primeiro scroll-into-view com paridade entre variantes. 64e9cec15 adiciona a variante carousel.
  • b24334058 torna clicáveis os cards de freespin já resgatados, levando direto ao jogo.
  • Central de Jogo Responsável externalizadac4bce554e (com o gêmeo b10c5ce64) troca o link interno "Jogo Responsável" do rodapé por link externo "Central de Jogo Responsável" apontando pro subdomínio de jogo responsável da própria casa, em três marcas. Duas delas também removem "Termos de Aposta" e "LGPD" do rodapé — as rotas /page/:slug continuam acessíveis por URL direta, é filtro só de link. O mecanismo é o config novo brand-overrideable hiddenFooterLegalSlugs, mesclado em buildLegalLinks junto com country.legal.disabledPages.
  • Bug de fuso na data das páginas legais — no mesmo commit: o formatDate de /page/:slug parseava "DD/MM/YYYY" como string ISO (UTC 00:00), recuando um dia em fusos atrás de UTC — pt-BR exibia 10/12/2025 como 09/12/2025. Agora a Date é construída por componentes locais.
  • 3bcb331f7 / 7fee6f076 limpam o rodapé da cassino e corrigem a URL de jogo responsável no modal de login de duas marcas, e c16e6d9d9 atualiza o textLicense em várias marcas.
  • Aviso temporário de indisponibilidade do 0800f757d3519 mostra um aviso de linha telefônica fora do ar no card de telefone da Central de Ajuda, entre o número e o botão de chamada, gateado em runtime pela flag legada show_phone_outage_notice e fail-closed (escondido até a flag resolver true, auto-oculta quando é desligada — sem precisar de deploy). Habilitado em três marcas via override; a config base fica vazia, então o resto não é afetado.

Instalação do app e i18n

  • URL da App Store cabeada para iOS75404e422. Nas três marcas BR, appleStore: null fazia o hook cair no tooltip de "Adicionar à Tela de Início" (Safari) ou "abra no Safari" (outros browsers iOS). Os apps iOS foram publicados em 2026 com IDs por marca e agora o clique em "Baixar app" (topbar / sidebar / rodapé / CTA flutuante) redireciona de fato pra loja. Android permanece intocado — as TWAs já estavam em produção. Zero mudança em código de runtime: useAppInstall.ts, o handler compartilhado, o CTA da LP e o JSON-LD de SEO já leem do config.
  • Chaves faltantes e strings hardcodedd1377efef adiciona as chaves validate.* que faltavam pro fluxo de confirmação de e-mail/telefone por link entregue em maio, 7b32013ef liga a row de "jogados recentemente" da home a casino:recents.title e a07e77058 localiza o CTA do jogo em destaque via casino:card.play — dois casos de texto que estava fixo no componente.

Auth

  • Campo de código de indicação escondido no registrofa6838dc5 remove o bloco read-only de "Código de indicação" do modal. O affiliation_code continua sendo capturado do tracking e enviado no payload de registro — a mudança é só de UI.

Core / SDK

  • Pacote @cactus-agents/country-config recebe 30e0b9c, localizando a config da Finlândia para finlandês — antes o país inteiro descrevia a si mesmo em inglês numa marca que roda em fi-fi.
  • Pacote @cactus-agents/kyc bumpado pra 0.9.0 no base (a07edfd64), trazendo a integração de SDK de Unico e Sumsub fechada na semana anterior mais atualizações transitivas.

Brand Overrides

  • donald-bet-br: marca nova, criada nesta semana (ver seção de abertura).
  • fi-7k-bet: conteúdo em finlandês de verdade. 27979202b traduz o modal de recuperação de senha e 5edbec12e traduz o FAQ (5 categorias e 5 entradas) e o conteúdo de detalhe de jogo — defaults mais as 107 descrições de jogo, com nomes de jogo e de provider mantidos como nomes próprios e a estrutura de <strong> preservada. slug/categorySlug e as keys das entradas ficam como identificadores cross-brand. A marca declara BRAND_LANGUAGE=fi-fi desde abril, mas essas superfícies ainda renderizavam em inglês. Páginas legais e licenças ficam de fora desta passada.
  • betpontobet-bet-br: ordem dos links legais do rodapé ajustada duas vezes (2df31b8da adiciona Denúncias ao lado de Ouvidoria, 04db6b1d3 reordena pra Denúncias antes de Ouvidoria).
  • 7k-bet-br: ~120 redirects de Search Console; variante mosaic do recommended-games; agregador speed-dial com quatro pontos de acesso; banner pré-FTD.
  • cassino-bet-br: dois lotes de redirects de 404; ItemList nos hubs; cap de 3× no modal de FTD; banner pré-FTD; limpeza de rodapé.
  • vera-bet-br: lotes 1 e 2 de redirects; config de JSON-LD dedicada; recuperação de query de marca.

Pagamentos

  • Banner de urgência pré-FTD estendido: 77a9e9a1c (com cef16af78) liga na cassino e 39b4da5d9 liga no 7k, completando a paridade com a vera, que abriu o recurso na semana anterior.
  • Cap de saque do bônus divulgado no modal de oferta de FTD68d5e8f29 deixa explícito o limite de 3× na oferta de primeiro depósito de uma das marcas BR, em vez de o usuário descobrir só na hora do saque.
  • Chave de erro crua vazando na UI6d79e2805. O DepositCoupon renderizava json.error de /api/payments/coupon direto na tela; depois que a rota migrou pra proxyErrorResponse, esse campo passou a carregar o identificador de máquina (coupon_validation_failed) em status não-auth — por exemplo num 404 de cupom inválido — expondo a chave crua dentro do modal de depósito. Agora sempre renderiza a mensagem amigável de i18n e para de exibir os campos error/detail do envelope do proxy.

Infra / CI/CD

  • Projeto de affiliates isolado no front-opsa82358d adiciona config/affiliates/ com config de projeto própria e um workflow reusável dedicado pra deploy do front do monorepo de afiliados em Cloudflare Workers, espelhando o padrão do deploy de docs (projeto em diretório top-level próprio, workflow reusável próprio) justamente pra que mudanças ali nunca afetem o deploy.yml do web-base. As diferenças relevantes: suporte a workdir (o front vive num subdiretório do monorepo), api_base_url lido do YAML e injetado como var do Worker no deploy, sem cache de KV / arquivo R2 / purge pós-deploy (é SPA de admin, não SSR na borda), --env-file=/dev/null nos comandos de wrangler e skip_deploy=true em vez de exit 1 pra push em branch não-default.
  • front-ops: default branch de fi-7k-bet e pb-bet alterada (e561789).