Desafio para avaliar engenheiros(as) front-end sênior na Trace Finance.
Este desafio tem como objetivo avaliar suas habilidades em construir uma aplicação front-end moderna, escalável e testável, utilizando as principais tecnologias e padrões que adotamos na Trace Finance.
Figma do teste: https://www.figma.com/design/YXzBTEwElRuxRVssHg465f/Teste-t%C3%A9cnico?node-id=0-1&m=dev&t=0krnC3qtatApObzH-1
- Projeto novo: Crie um projeto Next.js do zero (recomendado)
- Starter template: Você pode usar qualquer template/boilerplate que preferir
Você deve construir uma aplicação de gerenciamento de transações com:
- ✅ Formulário multi-step para criar transações (2 etapas com sidebar)
- ✅ Listagem paginada com filtros, pesquisa e paginação
A aplicação deve ser responsiva, testável e seguir as melhores práticas de desenvolvimento front-end.
- ✅ Base URL da API com endpoints funcionais
- ✅ Documentação dos endpoints
- ✅ Exemplos de payloads
Listagem de Transações
├─→ Filtros (Status, Currency, Data)
├─→ Pesquisa
├─→ Paginação
└─→ Botão "Nova Transação"
↓
Formulário Multi-Step
├─→ Step 1: Info Básicas (Descrição, Tipo, Valor, CPF/CNPJ)
└─→ Step 2: Detalhes (campos condicionais por tipo)
↓
Submissão → API → Redirect para Listagem
- Framework: Next.js 14+ (App Router ou Pages Router)
- Linguagem: TypeScript
- Gerenciamento de Estado: Zustand, Redux Toolkit ou Context API + hooks
- Formulários: React Hook Form + Yup/Zod (validação)
- HTTP Client: Axios, Fetch API, React query (diferencial) ou biblioteca de sua escolha
- Estilização: Styled Components, Tailwind CSS, Stitches, PandaCSS, etc.
- Testes Unitários/Integração: Jest + Testing Library
- Linting: ESLint com regras TypeScript
- Formatação: Prettier
- Commits: Conventional Commits (recomendado)
Tabela com colunas:
- ID
- Tipo (PIX/TED)
- Valor (formatado em BRL)
- Status (badge colorido)
- Data/Hora
Funcionalidades obrigatórias:
-
Paginação
- Controles: Infinite Scroll
- Exibir "Mostrando X-Y de Z resultados"
-
Filtros:
- Status (Tab): Todos, Completed, Pending, Failed (FILTRO DE STATUS) -> Seguir esse filtro ao invés do Figma
- Tipo (select/dropdown): PIX, TED
- Data (date range picker): Período, de -> até, mês de inicio, mês de fim
- Botão "Aplicar Filtros"
- Botão "Limpar Filtros"
- Mostrar filtros ativos com componente de Badge
-
Estados:
- Loading (skeleton table)
- Empty state (sem resultados)
- Error state (falha na API)
-
Botão "Nova Transação"
- Redireciona para o formulário multi-step
Formulário com 2 etapas e sidebar lateral indicando o step atual.
Desktop:
┌─────────────────┬──────────────────────────────┐
│ Sidebar │ Área Principal │
│ │ │
│ ● Step 1 │ [Campos do Step Ativo] │
│ Informações │ │
│ │ │
│ ○ Step 2 │ │
│ Detalhes │ │
│ │ │
│ │[Voltar] [Próximo/Confirmar] │
└─────────────────┴──────────────────────────────┘
Mobile:
- Sidebar pode ficar horizontal no topo ou como stepper
- Campos empilhados verticalmente
Navegação:
- Botão "Voltar": Retorna ao step anterior (ou página de listagem se no Step 1)
- Botão "Próximo" (Step 1): Avança para Step 2
- Botão "Confirmar" (Step 2): Submete o formulário
Campos:
- Descrição (input texto, opcional)
- Tipo de Transação (select, obrigatório)
- Opções:
PIX,TED
- Opções:
- Valor (input texto, obrigatório, máscara de moeda BRL) BE trabalha em centavos
- CPF/CNPJ (input texto com máscara, obrigatório)
Comportamento:
- Botão "Próximo" habilitado apenas com campos obrigatórios válidos
- Validação em tempo real (mostrar erros abaixo dos campos)
- Não permitir avançar com campos inválidos
Campos condicionais baseados no "Tipo de Transação" do Step 1:
Se PIX:
- Chave PIX (input texto, obrigatório)
- Tipo de Chave (select: CPF, Email, Telefone, Aleatória)
Se TED:
- Banco (select com lista de bancos)
- Agência (input texto, obrigatório)
- Conta (input texto, obrigatório)
- Tipo de Conta (select: Corrente, Poupança)
Comportamento:
- "Voltar": Retorna ao Step 1 com todos os dados preservados
- "Confirmar": Envia os dados para a API (endpoint fornecido)
- Modal de confirmação (diferencial)
- Após sucesso: Redireciona para listagem
- Após erro: Exibe mensagem de erro
- Ao retornar para o formulário após confirmação: Campos limpos (reset completo)
Validações:
- Todos os campos condicionais devem ter validação apropriada
- Exibir mensagens de erro abaixo dos campos
Api base url: https://fe-challenge-trace-api-production.up.railway.App
Api prefix: /api
Endpoints: /transaction (GET, POST)
Todas as informações da api podem ser encontradas em API_README.md
Query Params:
page(number): Página atuallimit(number): Items por páginasearch(string): Busca por descrição/IDstatus(string): COMPLETED | PENDING | FAILEDcurrency(string): BRL | USD | EURstartDate(string): Data início (ISO 8601)endDate(string): Data fim (ISO 8601)
Mostrar filtro ativo em formato de Badge
- Usar theme
- Tokens para cores, fontes, etc.
- Dark mode (diferencial)
- Criar componentes customizados básicos
Button(primary, secondary)Input/InputMask(para CPF/CNPJ, moeda)Select/DropdownDatePicker(para filtro de data)Badge(para status)TableSkeleton(loading states)EmptyStateSidebar(para o multi-step form)
- Mobile (< 768px): Stack vertical, sidebar do form pode ser horizontal no topo
- Desktop (≥ 768px): Layout padrão com sidebar lateral
- Tabela responsiva (scroll horizontal em mobile ou cards)
- ✅ DRY: Não repetir código
- ✅ Single Responsibility: Componentes com responsabilidade única
- ✅ Custom Hooks: Extrair lógica reutilizável
- ✅ Type Safety: Tipar tudo (evitar
any) - ✅ Validações: Usar schemas (Yup/Zod)
- ✅ Error Handling: Tratamento apropriado de erros
- ✅ Repositório privado no GitHub
- ✅ TypeScript configurado
- ✅ Next.js 14+
- ✅ Todas as 3 funcionalidades implementadas:
- Formulário multi-step completo
- Listagem com filtros, pesquisa e paginação
- ✅ Testes unitários
- ✅ Formulários com validação
- ✅ Gerenciamento de estado
- ✅ Loading, error e empty states
- ✅ Responsivo (mobile e desktop)
- ✅ README com:
- Instruções de instalação
- Como rodar o projeto
- Como rodar os testes
- Variáveis de ambiente necessárias
- ✅ Lint sem erros
- ✅ Testes passando (
yarn testounpm test)
- 🎯 Arquitetura modular bem organizada (feature-based)
- 🎯 Custom hooks bem abstraídos e reutilizáveis
- 🎯 Error Boundary implementado
- 🎯 Abstrações de serviços HTTP (camada de API bem estruturada)
- 🎯 Path aliases configurados no TypeScript
- 🎯 Documentação de componentes (Storybook ou similar)
- ✨ Dark mode
- ✨ Botão para alteração de lingua
- ✨ Animações e transições suaves
- ✨ Toast notifications (feedback de ações)
- ✨ Confirmação antes de submeter formulário
- ✨ Skeleton screens customizados
- 🧪 Cobertura de testes
- 🔧 Husky + lint-staged
- 🔧 Commitlint
- 🌐 Internacionalização (PT/EN) - i18n
- 🚀 Deploy em produção (Vercel, Netlify, etc.)
- ✅ Crie um fork do repositório
- ✅ Dê permissão de leitura para o usuário que indicarmos no repositório privado
- ✅ No README, inclua:
- Instruções de instalação
- Como rodar o projeto
- Como rodar os testes
- Principais decisões técnicas
- Tempo aproximado de desenvolvimento
- Melhorias futuras (se tiver)
2-3 dias a partir do recebimento do desafio.
Se precisar de mais tempo, entre em contato conosco.
Envie e-mail com o assunto "Dúvida - Desafio Front-end".
Boa sorte! 🚀