Stack tecnológica
Estrutura de pastas
Padrão de Feature
Cada domínio emsrc/features/ segue a mesma estrutura interna:
services/ faz chamadas HTTP.
Autenticação e Sessão
Fluxo de tokens
accessToken nunca é salvo em localStorage. Fica exclusivamente no Zustand (useAuthStore) em memória.
Silent Refresh (ao recarregar a página)
Quando o usuário recarrega (F5), o Zustand é reiniciado e oaccessToken é perdido. O AuthProvider e o ProtectedLayout detectam esse estado e automaticamente chamam POST /auth/refresh usando o cookie HttpOnly:
Interceptor Axios (src/shared/lib/axios.ts)
Toda requisição passa pelo interceptor que:
- Injeta
Authorization: Bearer <accessToken>no header. - Injeta
x-tenant-id: <tenantId>no header. - Se receber
401, tenta renovar o token automaticamente via/auth/refresh. - Enquanto renova, coloca requisições paralelas em fila e as reexecuta após sucesso.
- Se o refresh falhar, chama
logout()e a fila de requisições é rejeitada.
Proteção de rotas
Todas as rotas emapp/(protected)/** requerem autenticação. O ProtectedLayout redireciona para /login se o usuário não estiver autenticado após a tentativa de silent refresh.
Estado Global (Zustand)
Os stores são inicializados sem persistência em localStorage. A persistência é feita via cookie do refresh token.
Fetching de dados (TanStack Query)
OQueryProvider está no root layout. Toda busca de dados de servidor usa useQuery e mutações usam useMutation, sempre encapsulados em custom hooks dentro de features/<nome>/hooks/.
Convenção:
Formulários e Validação
- React Hook Form gerencia o estado dos formulários.
- Zod valida os dados (schemas em
features/<nome>/schemas.ts). - A validação no frontend é limitada a UX e campos obrigatórios. Regras de negócio vêm do backend via resposta da API.
Convenções de código
Módulos do frontend
Os 27 domínios emsrc/features/ correspondem às seguintes áreas do sistema:
Variáveis de ambiente
Configure em
.env.local para desenvolvimento local. Em produção, configure no serviço de hospedagem (Vercel, etc.).