Frontend web da plataforma Cheffy — receitas, favoritos, busca culinária e assistente gastronômico com IA
O Cheffy Web é um projeto desenvolvido para faculdade, com foco em tecnologia aplicada à alimentação consciente, saúde e organização culinária.
A aplicação é a interface frontend da plataforma Cheffy, consumindo a Cheffy API para exibir Home, receitas, categorias, detalhes nutricionais, favoritos do usuário, autenticação via Better Auth e assistente gastronômico com inteligência artificial.
O projeto possui maior aderência ao ODS 3 — Saúde e Bem-Estar, contribuindo para hábitos alimentares mais conscientes ao apresentar receitas, ingredientes, etapas de preparo e informações nutricionais de forma clara. Também se relaciona ao ODS 12 — Consumo e Produção Responsáveis, ao apoiar melhor aproveitamento de ingredientes e adaptação de receitas com IA. Como apoio tecnológico, dialoga com o ODS 9 — Indústria, Inovação e Infraestrutura, por usar uma arquitetura moderna, documentada e pronta para deploy.
[🔗 API local esperada (http://localhost:8000/docs)](http://localhost:8000/docs)
-
Por que Next.js App Router? Escolha: Next.js 16 com App Router. Motivo: O projeto combina páginas públicas, metadados por rota, renderização otimizada, imagens locais/remotas e integração direta com deploy Vercel. O App Router mantém o roteamento por filesystem e permite separar páginas, layouts e componentes de domínio com baixo atrito.
-
Por que React 19? Escolha: React 19 com componentes funcionais. Motivo: A aplicação é altamente interativa: favoritos, autenticação, filtros, paginação, busca, modo de preparo e chat com IA. React mantém essas experiências previsíveis e compatíveis com o ecossistema do Next.
-
Por que Tailwind CSS e shadcn/ui? Escolha: Tailwind CSS 4, Radix UI e componentes shadcn. Motivo: A interface precisa de consistência visual, responsividade e componentes acessíveis como dialog, sheet, select, tabs, alert e carousel. Tailwind concentra a estilização próxima do componente sem criar uma camada pesada de CSS global.
-
Por que TanStack Query? Escolha:
@tanstack/react-query. Motivo: A Home, busca, favoritos e detalhes dependem de cache, revalidação, estados de loading e mutations. TanStack Query reduz estado manual e mantém o consumo da API mais previsível. -
Por que Orval? Escolha: Cliente gerado a partir do OpenAPI da Cheffy API. Motivo: O frontend não precisa duplicar contratos manualmente. Os tipos e hooks são gerados a partir do backend, reduzindo divergência entre API e interface.
-
Por que Better Auth no client? Escolha:
better-auth/reactapontando paraNEXT_PUBLIC_API_URL. Motivo: A sessão fica centralizada no backend, enquanto o frontend consome o estado autenticado para abrir login, liberar favoritos e enviar cookies nas requisições. -
Por que Vercel? Escolha: Deploy com framework
nextjs, buildpnpm builde variáveis públicas configuradas no painel. Motivo: É o caminho mais direto para Next.js, mantendo build reproduzível compnpm-lock.yamle sem precisar de servidor customizado.
app/
├── layout.tsx # Layout raiz, fontes, QueryProvider e Toaster
├── page.tsx # Home
├── receitas/ # Busca/listagem e detalhe de receita
├── categorias/[slug]/ # Página de categoria
└── favoritos/ # Favoritos do usuário autenticado
components/
├── auth/ # Login social, sessão e ações de autenticação
├── category/ # Experiência de categoria
├── favorites/ # Página e estado vazio de favoritos
├── home/ # Hero, sabores, benefícios e seções dinâmicas
├── layout/ # Header, footer, logo, busca e navegação mobile
├── recipe-detail/ # Detalhe, preparo, nutrição, impressão e IA
├── search/ # Busca, filtros e resultado de receitas
├── shared/ # Cards, favoritos e componentes reutilizáveis
└── ui/ # Base shadcn/Radix
api/
├── generated/ # Cliente e tipos gerados pelo Orval
└── interceptor.ts # Axios com baseURL, cookies e erro padronizado
lib/
├── auth-client.ts # Cliente Better Auth
├── hooks/ # Hooks locais, incluindo stream de IA
├── schemas/ # Schemas utilitários de busca
└── utils.ts # Helpers de composição
Fluxo end-to-end de dados:
- Página → Renderiza a rota do App Router.
- Componente client → Usa hooks gerados pelo Orval ou hooks locais.
- API client →
api/interceptor.tsenvia requests combaseURLewithCredentials. - Backend → Cheffy API responde com contratos OpenAPI/Zod.
- Interface → TanStack Query atualiza cache, loading, erros, favoritos e paginação.
Fluxo de autenticação:
- Usuário aciona o login pela interface.
better-auth/reactredireciona para o provider configurado no backend.- Em produção, a sessão é mantida por cookies da origem do frontend, com proxy do Next.js encaminhando
/api/auth/*para a API. - Componentes como favoritos e assistente consultam
authClient.useSession().
Fluxo de favoritos:
- Cards recebem
isFavoritedvindo do backend. - Botão de favorito exige sessão ativa.
- Mutation chama
POSTouDELETE /api/v1/recipes/{id}/favorite. - A UI atualiza a experiência sem hardcode de estado favorito.
Fluxo do assistente gastronômico:
- Página de detalhe abre o chat da receita.
use-ai-stream.tschama o endpoint SSE da API.- Tokens chegam em tempo real e são renderizados no chat.
- O backend mantém contexto da receita e do usuário autenticado.
Fluxo de upload de imagens (Cloudinary):
- O usuário seleciona uma imagem no formulário de receitas (
recipe-form.tsx). - O frontend chama a mutation de assinatura (
useSignUpload) enviando o target (ex:recipes) e o ID da entidade. - O backend (Cheffy API) responde com credenciais temporárias, folder e uma assinatura criptográfica.
- O frontend faz um
POSTdireto para a URL do Cloudinary com o arquivo original viaFormData. - O Cloudinary processa, armazena e devolve a
secure_urlepublic_id. - O frontend salva essas URLs no estado do form via React Hook Form e submete na criação/edição da receita.
| Rota | Descrição |
|---|---|
/ |
Home com hero, sabores favoritos, benefícios, seções dinâmicas e fechamento visual |
/receitas |
Busca de receitas com filtros, paginação e ordenação |
/receitas/[slug] |
Detalhe completo da receita, preparo, nutrição, favoritos, impressão e IA |
/categorias/[slug] |
Listagem de receitas por categoria |
/favoritos |
Receitas favoritadas pelo usuário autenticado |
O frontend usa NEXT_PUBLIC_API_URL como origem pública das chamadas feitas pelo navegador.
Em desenvolvimento, essa URL pode apontar diretamente para a API local. Em produção,
prefira apontar para o próprio frontend e usar API_PROXY_TARGET para encaminhar
/api/auth/*, /api/v1/*, /doc e /docs para a Cheffy API.
Principais integrações:
| Recurso | Origem |
|---|---|
| Home | GET /api/v1/home |
| Receitas | GET /api/v1/recipes |
| Detalhe por slug | GET /api/v1/recipes/slug/{slug} |
| Categorias | GET /api/v1/categories |
| Favoritos | GET /api/v1/me/favorites |
| Toggle favorito | POST/DELETE /api/v1/recipes/{id}/favorite |
| Sessão | /api/auth/* via Better Auth |
| IA | POST /api/v1/ai/recipes/{recipeId}/assistant/stream |
O cliente gerado pelo Orval fica em api/generated, usando api/interceptor.ts como mutator para Axios.
Crie um .env local a partir de .env.example.
| Variável | Obrigatória | Descrição |
|---|---|---|
NEXT_PUBLIC_API_URL |
✅ | Origem pública usada pelo navegador. Local: http://localhost:8000; produção com proxy: URL do frontend |
NEXT_PUBLIC_FRONTEND_URL |
✅ | URL pública do frontend. Local: http://localhost:3333 |
API_PROXY_TARGET |
✅ em produção | URL real da Cheffy API usada pelos rewrites do Next.js. Local: http://localhost:8000 |
No Vercel, configure essas variáveis em Project Settings → Environment Variables. As variáveis
NEXT_PUBLIC_*entram no bundle do navegador durante o build;API_PROXY_TARGETfica apenas no runtime/config do Next.js.
- Node.js 24+
- pnpm 10+
- Cheffy API rodando localmente ou publicada
# 1. Clone o repositório
git clone https://github.com/willianOliveira-dev/cheffy-web.git
cd cheffy-web
# 2. Instale dependências
pnpm install
# 3. Crie o arquivo de ambiente
cp .env.example .env
# 4. Garanta que a API esteja disponível
# Localmente, a API deve responder em http://localhost:8000
# 5. Inicie o frontend
pnpm devNo Windows PowerShell:
Copy-Item .env.example .envA aplicação local roda em:
http://localhost:3333O projeto usa Orval para gerar tipos e hooks a partir do OpenAPI da Cheffy API.
pnpm generate:apiEsse comando usa:
NEXT_PUBLIC_API_URL/doc
Antes de rodar, a API precisa estar ativa e o .env precisa conter NEXT_PUBLIC_API_URL.
Para geração local, mantenha NEXT_PUBLIC_API_URL apontando diretamente para a API ou rode o frontend com API_PROXY_TARGET configurado.
O projeto está pronto para deploy na Vercel com vercel.json.
Configuração esperada:
| Campo | Valor |
|---|---|
| Framework Preset | Next.js |
| Install Command | pnpm install --frozen-lockfile |
| Build Command | pnpm build |
| Output Directory | Automático pelo Next.js |
| Node.js | 24+ |
Variáveis para produção:
NEXT_PUBLIC_API_URL=https://seu-frontend.vercel.app
NEXT_PUBLIC_FRONTEND_URL=https://seu-frontend.vercel.app
API_PROXY_TARGET=https://sua-api.onrender.comChecklist antes do deploy:
- API publicada e acessível via HTTPS.
FRONTEND_URLeALLOWED_ORIGINSconfigurados na Cheffy API.BETTER_AUTH_URLconfigurado no backend com a URL pública do frontend, porque/api/auth/*será servido via proxy.- Callback OAuth do Google liberado para
https://seu-frontend.vercel.app/api/auth/callback/google. NEXT_PUBLIC_API_URLapontando para o domínio Vercel do frontend.NEXT_PUBLIC_FRONTEND_URLapontando para o domínio Vercel.API_PROXY_TARGETapontando para a API publicada no Render.
| Comando | Descrição |
|---|---|
pnpm dev |
Inicia o Next.js em http://localhost:3333 |
pnpm build |
Gera build de produção |
pnpm start |
Executa o build localmente |
pnpm lint |
Executa ESLint |
pnpm typecheck |
Valida TypeScript sem emitir arquivos |
pnpm generate:api |
Regenera cliente Orval a partir da Cheffy API |
Antes de abrir PR ou publicar:
pnpm lint
pnpm typecheck
pnpm buildEsses comandos validam lint, tipos e build final do Next.js, que é o mesmo caminho usado no deploy.
Willian Oliveira