Guia — atenvi-web
Agendamento público + painel do estabelecimento (tenant), unificados em Next.js 15 (App Router).
Não confundir com atenvi-web-admin (backoffice interno Atenvi, ver
atenvi-web-admin.md).
Estrutura de pastas
src/
app/
(public)/ ← sem autenticação: link de agendamento do cliente final (AG1)
(private)/ ← autenticado: painel do estabelecimento (profissional/admin do tenant)
layout.tsx
<feature>/ ← agenda, cadastro profissional/serviço, caixa, comissão
page.tsx
loading.tsx
error.tsx
components/ ← componentes locais do web
hooks/
lib/
api/ ← funções de fetch para TanStack Query
utils/
stores/ ← Zustand stores
types/
Regras Next.js
- Server Components por padrão —
'use client'apenas quando necessário (interação, estado) - Dados em Server Components via fetch direto ao
atenvi-bff(sem TanStack Query no servidor) - TanStack Query apenas em Client Components para dados interativos/reativos
- Loading UI com
loading.tsxe Error boundary comerror.tsxpor rota
TanStack Query
- Query keys:
['<resource>', <id>?]→['appointments'],['appointments', tenantId] - Funções de fetch centralizadas em
src/lib/api/ - Sem lógica de fetch inline em componentes
Zustand
- Store por domínio de UI:
useLayoutStore(sidebar, tema),useFilterStore - Sem server state no Zustand — apenas estado de UI
Componentes
- Componentes de negócio locais em
src/components/ - Primitivos de UI via
atenvi-uie shadcn/ui — sem reimplementação
(public) vs (private)
(public): foco em experiência do cliente final agendando — SEO relevante, metadata viagenerateMetadata(), SSR/SSG(private): painel do estabelecimento — pode ser Client-heavy, sem preocupação de SEO