Criar uma feature no front¶
Molde: src/features/authentication/
para a estrutura. Para fluxo com várias telas, veja como
src/features/responses/
navega entre onboarding, perguntas, revisão e envio.
Regras que mandam: Frontend · Contrato front ↔ back · Formulários · UI e responsividade.
Passo 0 — o contrato existe?¶
Antes de qualquer código, abra creed-backend/app/domains/<dominio>/router.py:
| Você encontra | Caminho |
|---|---|
| Rotas de verdade | transcreva o contrato (passo 2) e siga |
| Docstring "STUB", ou a pasta não existe | o contrato precisa vir escrito na subtarefa. Codifique contra ele, e o back ganha quando chegar |
Pular este passo é o que produz tela pronta contra campo que nunca existiu.
A ordem¶
- Nome da pasta — o mesmo do domínio do back. Sem acento.
- Tipos em
src/types/api.ts— transcreva os schemas:snake_casecontinuasnake_case, nulo é| null, campo gerado pelo servidor só no tipo de resposta. <feature>Api.ts— funções puras sobre oapiClient. É o único lugar com HTTP. Sem Redux, sem React, semtry/catch.<feature>Slice.ts— thunks comcreateAsyncThunk, a máquinaidle · loading · ready · error, e o erro já virando mensagem. Registre o reducer emsrc/app/store.ts.<Feature>View.tsx— a tela. Desenha os quatro estados, inclusivereadycom lista vazia. Semfetch, sem agregação, sem texto escrito direto.- Componentes — procure antes de criar (UI). Formulário segue Formulários.
- Textos — um namespace com o nome da feature em cada arquivo de
src/i18n/locales/; o que é compartilhado vai emcomum. - Rota em
src/app/routes.tsx— dentro da área protegida, se a tela exige login. - Testes ao lado dos arquivos: o slice (reducers e transições) e o que tiver interação de verdade.
Fatie¶
Feature inteira num diff só é irrevisável. Corte por fatia vertical: contrato + estado + a tela do caso de uso principal primeiro; os outros casos de uso depois.
Sinais de que algo saiu do lugar¶
| Sinal | O que fazer |
|---|---|
Integrando com um router.py sem rota nenhuma |
parar: o domínio é STUB |
Nome em types/api.ts que não aparece em nenhum schemas.py |
campo inventado — volte ao contrato |
.reduce( ou .filter().length para montar um número |
agregação: é do back |
fetch( na View ou no slice |
o HTTP é do <feature>Api.ts |
| A View só trata o caso feliz | faltam loading, error e o vazio |
| Texto em português dentro do JSX | vai para src/i18n/locales/ |
Antes de fechar¶
npm run check
npm run build
E confira a tela em 375, 768 e 1280 de largura no navegador — o teste automatizado não faz layout.