# Frontend – Convenções Anti-Erro ## 1) Chamadas de API (padrão obrigatório) **Use `src/lib/api.ts` como única porta de entrada para HTTP.** Padrão atual: - Use `apiRequest(endpoint, options)` para qualquer fetch. - Token vem do `localStorage` (`auth_token` ou `token`) e é enviado no header `Authorization: Bearer`. - `Content-Type` é JSON sempre que houver `body`. - `credentials: "include"` está ativado (cookies compartilhados). - Erros retornam `Error` com `message` do backend, quando disponível. > **Não** chame `fetch` direto em páginas/componentes. > **Sempre** centralize novas rotas em `src/lib/api.ts` (ex.: `usersApi`, `jobsApi`, etc.). Referência: `frontend/src/lib/api.ts`. ## 2) Traduções (i18n sem quebra de build) ### UI do frontend (Next.js) - As strings usadas por `useTranslation` estão em **`frontend/src/i18n`** (`en.json`, `es.json`, `pt-BR.json`). - **Regra**: qualquer nova chave deve existir em **todos** os arquivos de idioma para evitar fallback inconsistente. ### Catálogo geral - Existe um catálogo amplo em `frontend/messages` (ex.: `pt-BR.json`, `en-US.json`, `es-ES.json`, `ja-JP.json`). - Se você adicionar uma nova chave nesse catálogo, replique nas outras línguas **no mesmo caminho de objeto**. Referências: `frontend/src/lib/i18n.tsx`, `frontend/src/i18n/*.json`, `frontend/messages/*.json`. ## 3) Componentes de formulário (padrão JobFormBuilder) Todos os formulários com perguntas dinâmicas devem seguir o padrão de `JobFormBuilder`: - Tipo `Question` com `id`, `type`, `label`, `required` e `options` (quando aplicável). - `type` permitido: `text`, `long_text`, `yes_no`, `multiple_choice`, `select`. - `options` existe apenas para `multiple_choice` e `select`. - Respeite o limite `maxQuestions` (default 7). - UI deve usar componentes de `components/ui` e manter o campo fixo de currículo (CV) como referência visual. Referência: `frontend/src/components/job-form-builder.tsx`.