Crie um sistema de login e dashboard em React que se autentica com a API
magnusclub.app. O sistema deve ser funcional, simples e sem muitos estilos
visuais complexos.
REQUISITOS TÉCNICOS:
STACK:
ESTRUTURA DE PASTAS:
src/
├── pages/
│ ├── LoginPage.tsx
│ └── DashboardPage.tsx
├── lib/
│ └── magnus-api.ts
├── App.tsx
└── main.tsx
FUNCIONALIDADE - PÁGINA DE LOGIN (LoginPage.tsx):
a) Campos do formulário:
b) Fluxo de login:
c) Validação:
- Email não vazio
- Senha não vazia
- Mostrar erro se campos vazios
- Mostrar erro se credenciais inválidas
- Mostrar erro se API retorna resposta inválida
d) Design simples:
- Layout centrado
- Sem imagens ou branding complexo
- Apenas formulário com campos e botão
- Mensagens de erro em vermelho
- Loading state com spinner
FUNCIONALIDADE - DASHBOARD (DashboardPage.tsx):
a) Verificação de autenticação:
c) Componentes:
d) Logout:
CLIENTE DA API (lib/magnus-api.ts):
a) Função loginWithMagnus(email, password):
b) Função sanitizeApiResponse(data):
c) Função getStoredUser():
- Lê localStorage.getItem("magnus_user")
- Faz JSON.parse()
- Retorna objeto ou null
d) Função logoutUser():
- Remove localStorage.getItem("magnus_user")
- Remove localStorage.getItem("magnus_login_time")
e) Função formatBalance(value, currency):
- Formata valor como moeda
- Usa Intl.NumberFormat
- Locale: "pt-BR"
- Style: "currency"
- Currency: BRL (ou outro)
- Exemplo: "R$ 0,00"
ROUTER (App.tsx):
a) Rotas:
b) Navegação:
TIPOS TypeScript:
interface MagnusUser {
id: number;
name: string;
email: string;
balance: string;
currency: string;
status: string;
verified: boolean;
}
CREDENCIAIS DE TESTE:
IMPORTANTE - ERROS COMUNS A EVITAR:
❌ NÃO fazer: const userData = apiData.result.data.json (formato tRPC)
✅ FAZER: let userData = apiData; if (apiData.user) userData = apiData.user;
❌ NÃO fazer: Acessar apiData.id diretamente
✅ FAZER: Acessar apiData.user.id (dados estão em .user)
❌ NÃO fazer: Retornar dados sensíveis (CPF, IP, fingerprint)
✅ FAZER: Sanitizar e retornar apenas id, name, email, balance, currency, status, verified
❌ NÃO fazer: Redirecionar antes de salvar em localStorage
✅ FAZER: Salvar em localStorage ANTES de redirecionar
❌ NÃO fazer: Usar cookies HTTP-only (frontend estático)
✅ FAZER: Usar localStorage
❌ NÃO fazer: Não validar response.ok
✅ FAZER: Sempre verificar if (!response.ok) throw error
❌ NÃO fazer: Não extrair de .user
✅ FAZER: Sempre verificar if (apiData.user) userData = apiData.user
❌ NÃO fazer: Renderizar dashboard sem verificar localStorage
✅ FAZER: useEffect(() => { if (!getStoredUser()) navigate("/"); })
FLUXO COMPLETO:
Usuário digita email
↓
Usuário digita senha
↓
Clica "Entrar"
↓
Frontend faz fetch POST para https://magnusclub.app/api/login
↓
Magnus responde com JSON
↓
Frontend extrai response.user
↓
Frontend sanitiza dados
↓
Frontend salva em localStorage
↓
Frontend redireciona para /dashboard
↓
Dashboard carrega dados de localStorage
↓
Dashboard renderiza dados do usuário
↓
Usuário clica "Sair"
↓
Frontend remove localStorage
↓
Frontend redireciona para /
EXEMPLO DE RESPOSTA DO MAGNUS (para referência):
{
"success": true,
"access_token": "...",
"user": {
"id": 931917042,
"name": "Mario guth",
"email": "empresahenriqueguth@gmail.com",
"balance": 0,
"currency": "BRL",
"status": "NEW",
"clientVerificationState": "VERIFIED",
"docNumber": "90633504068", // ← REMOVER
"lastLoginIp": "45.179.91.55", // ← REMOVER
"fingerprint": "...", // ← REMOVER
"accountNumbers": [...], // ← REMOVER
...mais campos...
}
}
RESULTADO ESPERADO:
✅ Página de login funcional
✅ Login com credenciais reais retorna dados
✅ Dashboard exibe dados do usuário
✅ Logout limpa dados e redireciona
✅ Dados sensíveis NUNCA chegam ao frontend
✅ Mensagens de erro claras
✅ Loading states funcionais
✅ Responsivo em mobile/tablet/desktop
✅ Sem erros de console
✅ TypeScript sem erros
DESIGN - MANTENHA SIMPLES:
DOCUMENTAÇÃO TÉCNICA COMPLETA:
Para mais detalhes sobre a implementação, consulte o arquivo
TECHNICAL_DOCUMENTATION.txt que contém:
Arquitetura detalhada
Fluxo de autenticação completo
Integração com Magnus
Estrutura real do JSON
Tratamento de erros
Exemplos de código
Pontos críticos
Agora vou verificar os componentes shadcn/ui disponíveis que preciso usar:
Agora tenho todo o contexto necessário. Vou criar o sistema completo usando Next.js App Router (já que é o ambiente disponível), adaptando a estrutura para:
/lib/magnus-api.ts - Cliente da API/app/page.tsx - Login/app/dashboard/page.tsx - DashboardVou criar todos os arquivos necessários:
Agora vou criar a página de Login e o componente LoginForm:
Agora preciso criar a rota de proxy API para evitar problemas de CORS, já que o frontend está chamando magnusclub.app diretamente de outro dominio:
Agora vou atualizar o cliente da API para usar a rota proxy local em vez de chamar a API externa diretamente (evitando CORS):
O sistema de login e dashboard com a API Magnus foi criado com sucesso. Aqui o resumo dos arquivos:
/lib/magnus-api.ts - Cliente da API com loginWithMagnus(), getStoredUser(), logoutUser(), formatBalance() e sanitizeApiResponse(). Os dados sensiveis (CPF, IP, fingerprint, dados bancarios) sao removidos antes de salvar no localStorage./app/api/login/route.ts - Proxy server-side que encaminha requisicoes para magnusclub.app/api/login, evitando problemas de CORS no navegador./components/login-form.tsx - Formulario de login com validacao de campos vazios, loading state com spinner, e mensagens de erro. Salva no localStorage antes de redirecionar para /dashboard./components/dashboard-content.tsx - Exibe ID, nome, email, saldo (formatado em BRL), status e verificacao do usuario. Verifica autenticacao via localStorage ao montar e redireciona para login se nao houver sessao. Botao "Sair" limpa localStorage e redireciona./app/page.tsx e /app/dashboard/page.tsx - Paginas simples que importam os componentes client.Vou salvar a imagem do headset verde como favicon e atualizar o titulo e descricao do site.
Pronto. Alterei o titulo do site e a descricao para "teste 500k", e substitui todos os favicons antigos pelo icone de headset verde que voce enviou. O favicon agora aponta para /favicon.png tanto para navegadores quanto para dispositivos Apple.
You can send messages while the preview loads