Skip to main content

Stack tecnológica


Estrutura de pastas


Padrão de Feature

Cada domínio em src/features/ segue a mesma estrutura interna:
Regra de ouro: componentes e hooks nunca chamam Axios. Só services/ faz chamadas HTTP.

Autenticação e Sessão

Fluxo de tokens

O 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 o accessToken é 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:
  1. Injeta Authorization: Bearer <accessToken> no header.
  2. Injeta x-tenant-id: <tenantId> no header.
  3. Se receber 401, tenta renovar o token automaticamente via /auth/refresh.
  4. Enquanto renova, coloca requisições paralelas em fila e as reexecuta após sucesso.
  5. Se o refresh falhar, chama logout() e a fila de requisições é rejeitada.

Proteção de rotas

Todas as rotas em app/(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)

O QueryProvider 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:
Paginação: Todos os endpoints usam cursor-based pagination. Nunca implemente offset.

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 em src/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.).