Arquitetura Frontend
Visão Geral
O frontend do OitoPorOito é uma Single Page Application (SPA) construída com React, utilizando Vite como bundler e desenvolvimento. A arquitetura é modular, componentizada e segue as melhores práticas da comunidade React.
Stack Tecnológica
Core
- React 18: Framework UI com Hooks e Concurrent Features
- Vite 4: Build tool moderna e rápida
- React Router 7: Roteamento client-side
UI/UX
- TailwindCSS: Framework CSS utilitário
- Radix UI: Componentes acessíveis e sem estilo
- Framer Motion: Animações e transições
- Lucide React: Ícones modernos
Xadrez
- Chess.js: Lógica de xadrez (validação, movimentos)
- Stockfish: Motor de análise e IA
- Stockfish.wasm: Versão WebAssembly do Stockfish
Estado e Dados
- Supabase Client: Integração com backend
- React Hooks: Gerenciamento de estado local
Ferramentas
- date-fns: Manipulação de datas
- clsx: Utilitário para classes CSS
- recharts: Gráficos e visualizações
Estrutura de Diretórios
frontend/
├── public/ # Assets estáticos
│ ├── assets/
│ │ ├── img/ # Imagens
│ │ └── pieces/ # Peças de xadrez (SVG)
│ └── stockfish/ # Engine Stockfish
│ ├── stockfish.js
│ └── stockfish.wasm.js
│
├── src/
│ ├── main.jsx # Entry point
│ ├── App.jsx # Componente raiz (Home)
│ ├── AppRoutes.jsx # Configuração de rotas
│ ├── index.css # Estilos globais
│ │
│ ├── components/ # Componentes reutilizáveis
│ │ ├── Navbar.jsx
│ │ ├── Footer.jsx
│ │ ├── ChessBoardWithCTA.jsx
│ │ ├── ChessNewsGrid.jsx
│ │ ├── ChessPuzzle/
│ │ ├── ChessSocial/
│ │ ├── ChessEvents/
│ │ └── ...
│ │
│ ├── pages/ # Páginas da aplicação
│ │ ├── Login.jsx
│ │ ├── Signup.jsx
│ │ ├── PlayComputer.jsx
│ │ ├── PuzzleChess.jsx
│ │ ├── ChessSocial.jsx
│ │ └── ...
│ │
│ ├── hooks/ # Custom hooks
│ │ └── useAuth.js
│ │
│ ├── lib/ # Bibliotecas e configurações
│ │ ├── supabaseClient.js # Cliente Supabase
│ │ └── utils.js # Utilitários gerais
│ │
│ ├── utils/ # Utilitários específicos
│ │ ├── fenUtils.js # Manipulação FEN
│ │ └── stockfishLoader.js # Loader do Stockfish
│ │
│ └── data/ # Dados mockados/estáticos
│ └── chessData.js
│
├── plugins/ # Plugins Vite customizados
│ └── visual-editor/
│
├── index.html # HTML raiz
├── vite.config.js # Configuração Vite
├── tailwind.config.js # Configuração Tailwind
└── package.json # Dependências
Roteamento
O roteamento é gerenciado pelo React Router v7. Todas as rotas são definidas em AppRoutes.jsx:
// Rotas principais
/ → Homepage (App.jsx)
/login → Login
/signup → Cadastro
/play → Jogar online
/play-computer → Jogar vs computador
/puzzle-chess → Puzzles
/learn → Aprender xadrez
/chessnews → Notícias
/chess-events → Eventos
/ratings-players → Rankings
// Rotas sociais
/social → Hub social
/social/friends → Amigos
/social/clubs → Clubes
/social/forums → Fóruns
/social/members → Membros
/social/blogs → Blogs
// Fallback
* → 404 Page
Componentes Principais
1. Navbar
Barra de navegação responsiva com: - Logo e branding - Links principais - Botões de autenticação - Menu mobile hamburger
2. ChessBoardWithCTA
Tabuleiro de xadrez interativo: - Renderização de posições FEN - Drag & drop de peças - Validação de movimentos - Integração com Chess.js
3. Authentication Components
Componentes de login e cadastro: - Formulários validados - Integração com Supabase Auth - Gerenciamento de sessão - Redirecionamentos
4. Puzzle Components
Componentes para puzzles de xadrez: - Carregamento de posições - Validação de soluções - Sistema de hints - Progressão de níveis
Gerenciamento de Estado
Estado Local (useState)
Usado para estado de componentes específicos:
Estado Global (Context API)
Para dados compartilhados entre componentes:
Estado de Servidor (Supabase)
Queries em tempo real via Supabase:
Integração com Stockfish
O motor Stockfish é carregado como Web Worker:
// stockfishLoader.js
export const loadStockfish = () => {
const worker = new Worker('/stockfish/stockfish.wasm.js');
worker.postMessage('uci');
return {
getMove: (fen, depth) => {
worker.postMessage(`position fen ${fen}`);
worker.postMessage(`go depth ${depth}`);
return new Promise(resolve => {
worker.onmessage = (e) => {
// Parse bestmove
resolve(bestMove);
};
});
}
};
};
Integração com Chess.js
Todas as validações de xadrez usam Chess.js:
import { Chess } from 'chess.js';
const chess = new Chess();
// Fazer movimento
const move = chess.move({ from: 'e2', to: 'e4' });
// Validar posição
const isCheck = chess.inCheck();
const isCheckmate = chess.isCheckmate();
// Gerar FEN
const fen = chess.fen();
Estilização
TailwindCSS
Classes utilitárias para estilização rápida:
<div className="flex items-center justify-center bg-[#1e1e1e] text-white">
<button className="px-4 py-2 bg-amber-500 hover:bg-amber-600 rounded">
Jogar
</button>
</div>
Tema Customizado
Cores definidas em tailwind.config.js:
theme: {
extend: {
colors: {
'chess-dark': '#1e1e1e',
'chess-light': '#2c2c2c',
'chess-accent': '#f59e0b', // amber-500
}
}
}
Performance
Code Splitting
const Login = lazy(() => import('./pages/Login'));
const Signup = lazy(() => import('./pages/Signup'));
Memoization
const MemoizedBoard = React.memo(ChessBoard, (prev, next) => {
return prev.position === next.position;
});
Lazy Loading
Testes (Planejado)
- Unit: Vitest para componentes
- Integration: React Testing Library
- E2E: Playwright
Build e Deploy
Desenvolvimento
Produção
Preview
Próximos Passos
- 🔧 Backend
- 💾 Banco de Dados
- 🧩 Componentes