Pular para o conteúdo principal

Visão Geral da Arquitetura

Plataforma multi-tenant de apostas esportivas (Cactus Gaming). ~30 sites clientes, cada um com seu fork do template base.

Repositórios

RepoDescrição
front-cactus-coreSDK TypeScript — pacotes @cactus-agents/* (monorepo)
front-web-baseTemplate React Router v7 (SSR / Cloudflare Workers)
front-cactus-docsEsta documentação (Docusaurus)
front-web-{marca}Forks de marca (ex: front-web-vera-bet-br)
front-web-panelPainel admin (vault + deploys)
front-opsReusable workflow de deploy + allowlist + vault de envs

Stack

CamadaTecnologia
FrameworkReact Router v7 (SSR nativo no Cloudflare Workers)
Build/bundlerVite (via React Router v7)
StylingTailwind CSS v3 + CSS custom properties para tokens de tema por cliente
State (client)Zustand (13 stores: auth, layout, brand, gamification, kyc, validationSteps, validationRuntime, passwordValidation, games, payments, wallet, user, accountMenu)
State (server)React Router loaders
i18ni18next + react-i18next (traduções) + @cactus-agents/i18n
Íconeslucide-react
Fonte@fontsource/montserrat
Flagscountry-flag-icons
Linter/formatterBiome (todos os repos)
TestesVitest + React Testing Library
Pre-commitHusky + lint-staged → biome check --write
CommitsConventional Commits (commitlint)
Package managerpnpm (enforced)
Node>=20.14.0 (recomendado: 22.18.0)

SDK — Pacotes @cactus-agents/*

PacoteDescrição
api-clientApiClient base (fetch, headers, auth)
authAuthService (login, register, logout, profile)
brandBrandConfig (appearance, features, settings)
country-configConfiguração por país (moeda, locale, validações)
i18nInternacionalização (setup i18next, namespaces)
gamesGamesService (home, categorias, providers, busca)
gamificationSmartico SDK integration
kycKYC (operadores, iframe, polling)
paymentsPaymentsService (deposit, withdraw, providers)
sportsSportsService (Altenar, Betby)
typesTipos compartilhados
userUserService (perfil, segurança, limites)
utilsUtilitários compartilhados
validationsValidações (modules, contexts, runtime)
walletWalletService (saldo, transações, rollover)

Deploy

  • SSR via Cloudflare Workers (React Router v7)
  • Assets estáticos → Cloudflare R2
  • 1 Worker por ambiente (SSR + static, sem api-proxy separado)
  • Deploy centralizado via reusable workflow no front-ops
  • Forks chamam cactus-agents/front-ops/.github/workflows/deploy.yml@main
  • Allowlist em config/allowlist.yml mapeia repo → brand → environments → worker_name
  • Secrets de deploy (Cloudflare) são org secrets com acesso restrito

Pacotes privados

  • GitHub Packages como registry privado
  • Token de leitura por cliente (acesso apenas a @cactus-agents/*, sem código-fonte)

Modelo de fork

O fork é uma cópia completa do front-web-base. O cliente tem liberdade total para personalizar: criar componentes, páginas, regras, redesenhar o tema inteiro.

Pontos rápidos de customização (já preparados no template):

  • app/config/theme.config.ts — paleta de cores
  • app/config/routes.config.ts — árvore de rotas
  • app/config/layout.config.ts — componente de layout

Mas o cliente não está limitado a esses arquivos. Pode modificar qualquer coisa no fork.

Única restrição: não alterar pacotes @cactus-agents/* diretamente — eles são dependências npm atualizáveis via pnpm update.

Decisões técnicas

DecisãoMotivo
Cookie HttpOnly para JWTToken não fica acessível no browser JS; leitura e validação acontecem no server.
AuthService singleton client-sideUm único ApiClient pro browser, separado do SSR.
Zustand sem persist para authStore mantém apenas user/userInfo/authModal/hydrated; estado inicial vem do loader SSR.
13 Zustand stores separadasCada domínio tem sua store isolada. Evita store monolítica e facilita code-splitting.
Modais controlados por ZustandauthModal: 'login' | 'register' | null. Qualquer componente abre/fecha.
EnvProvider separado do BrandProviderclientEnv (API_BASE_URL etc.) precisa existir antes de qualquer chamada API client-side.
Fork = cópia completa + liberdade totalConfig files são atalhos rápidos, não limites. Cliente pode personalizar o que quiser.
Biome em vez de ESLintMais rápido, config única pra lint + format, sem plugins.
i18next para i18nBiblioteca consolidada com suporte a namespaces, interpolação e pluralização.