Skip to main content
Este guia assume que você leu o Setup do Frontend e já tem o projeto rodando localmente.

Visão geral do sistema

O OmniDom é uma plataforma de gestão para sellers de marketplace. É composta de dois repositórios independentes: O frontend nunca implementa regras de negócio. Todas as validações de domínio (ex: produto do tipo KIT precisa de componentes) são responsabilidade do backend e comunicadas via respostas da API.

Como é uma feature completa

Toda funcionalidade no frontend segue este fluxo:

Criando uma nova feature

1. Criar a estrutura de pastas

2. Definir os tipos

3. Criar o service

4. Criar os hooks

5. Criar os componentes

6. Criar a página no App Router

Note que a página (page.tsx) é um Server Component por padrão. O 'use client' fica apenas nos componentes que têm interatividade. Neste exemplo, o SupplierList usa hooks, por isso é client.

Pontos críticos para entender

Autenticação (leia com atenção)

O token de acesso fica em memória (Zustand). Ao recarregar a página (F5), o Zustand é zerado. O ProtectedLayout detecta isso e faz um silent refresh automático usando o cookie HttpOnly. Isso significa:
  • Nunca salve o token em localStorage — quebrará a segurança.
  • Não tente ler o token diretamente — use useAuthStore().accessToken se precisar.
  • O interceptor Axios cuida de tudo automaticamente.

Multi-tenancy

Cada usuário pertence a um tenant. O tenantId é resolvido no login e armazenado no useAuthStore (via user.tenantId) e também no useTenantStore. O interceptor Axios injeta o header x-tenant-id em todas as requisições automaticamente. Você não precisa fazer nada para isso funcionar nas suas chamadas de API.

Paginação

A API usa cursor-based pagination para todas as listagens. Nunca implemente paginação por offset (page 1, página 2). Use o cursor retornado pelo backend para carregar mais itens.

Padrões a seguir


Boas práticas de PR

  1. Um PR por feature ou fix — PRs grandes são difíceis de revisar.
  2. Teste o fluxo completo antes de abrir o PR — login, autenticação e a funcionalidade nova.
  3. Tipos explícitos — sem any não justificado.
  4. Nomeação descritivauseCreateProduct, não useForm.
  5. Sem console.log em código de produção.

Perguntas frequentes

No backend. O frontend envia os dados e o backend retorna erro se a regra for violada. O frontend apenas exibe o erro ao usuário.
O tenantId também está disponível em useAuthStore().user?.tenantId.
O projeto já tem swr como dependência, mas o padrão estabelecido é TanStack Query. Use TanStack Query para novas features para manter consistência.
Crie a pasta e o page.tsx dentro de src/app/(protected)/. A proteção é automática pelo ProtectedLayout.
TanStack Query expõe isError e error no hook. Use sonner para notificações toast: