Skip to content

Feature/jeferson mesquita solucao desafio#47

Open
JeffyMesquita wants to merge 4 commits into
Davispc10:mainfrom
JeffyMesquita:feature/jeferson-mesquita-solucao-desafio
Open

Feature/jeferson mesquita solucao desafio#47
JeffyMesquita wants to merge 4 commits into
Davispc10:mainfrom
JeffyMesquita:feature/jeferson-mesquita-solucao-desafio

Conversation

@JeffyMesquita

Copy link
Copy Markdown

Pull Request — Pokédex Dinheirow Challenge


📋 Metadados

Campo Valor
Tipo feat — Nova funcionalidade
Branch feature/jeferson-mesquita-solucao-desafiomaster
Autor Jeferson Mesquita
Desafio Teste Técnico Dinheirow — Pokédex

📖 Resumo

Implementação completa do desafio Pokédex proposto pela Dinheirow, utilizando Clean Architecture, SOLID e Injeção de Dependência. A aplicação consome a PokéAPI v2, oferece listagem com paginação, busca, filtros avançados, página de detalhes e um Super Modal de dados avançados.


✨ Funcionalidades Implementadas

🎯 Requisitos Obrigatórios

Requisito Status Descrição
Listagem com paginação Grid responsivo com 20 itens por página
Busca por nome Filtro em tempo real sincronizado com URL
Página de detalhes Nome, descrição, sprites, tipos, stats
Botão voltar Preserva página e termo de busca na listagem
Persistência de estado URL Search Params como Single Source of Truth
Imagem padrão Fallback no Mapper (não na UI)
Descrição padrão "descrição não informada" no Mapper
Cache 30s TanStack Query staleTime: 30_000

🚀 Extras Implementados

Funcionalidade Descrição
Filtros avançados Tipo, Geração, Cor, Habitat, Ataque, Experiência
Super Modal Taxa de captura, felicidade base, grupos de ovos, cadeia evolutiva, flavor texts
Cores dinâmicas Gradientes por color da API e tokens por tipo Pokémon
Variedades Exibição de formas Mega, Alola, Gigantamax
Layout responsivo Mobile-first com grid adaptativo
Página 404 Estado "Pokémon não encontrado" customizado

🏗️ Arquitetura Técnica

Definições

Clean Architecture: Separação em camadas (Domain, Data, UseCases, Presentation) onde as regras de negócio não dependem de frameworks ou APIs externas.

SOLID: Princípios aplicados — S (Mapper com responsabilidade única), D (UseCases dependem de interfaces), O (cores/tipos extensíveis sem alterar código).

Injeção de Dependência: UseCases recebem IPokemonRepository via construtor; testes usam mocks sem alterar a lógica.

Estrutura de Pastas

src/
├── app/                    # Next.js App Router (páginas)
├── domain/                 # Entidades e interfaces (sem deps externas)
│   ├── entities/
│   └── repositories/
├── data/                   # Implementações e orquestração
│   ├── mappers/
│   ├── repositories/
│   └── usecases/
├── infra/                  # HTTP client (PokeAPI)
├── lib/                    # Utilitários, constantes, query-client
└── presentation/           # Componentes React, hooks
    ├── components/
    └── hooks/

Padrões Aplicados

Padrão Onde Por quê
Mapper pokemon.mapper.ts Isola a UI da estrutura bruta da PokéAPI
Repository PokeApiPokemonRepository Abstrai a fonte de dados; mockável em testes
UseCase GetPokemonListUseCase, GetPokemonDetailsUseCase Centraliza regra de negócio
Promise.all Repository getById Busca Pokémon + Species em paralelo

🧪 Cobertura de Testes

Resumo

Métrica Valor
Arquivos de teste 12
Total de testes 59
Status ✅ Todos passando

Distribuição

Camada Arquivos Testes
Domain/Data Mapper, UseCases, Repository 25
Infra PokeApiClient 4
Lib pokemon-type-colors, pokemon-color-gradients 10
UI SearchBar, PaginationControls, LoadingSkeleton, PokemonList, PokemonCard 20

Comandos

npm run test        # Modo watch
npm run test:run    # Execução única

🛠️ Stack Tecnológica

Tecnologia Versão Uso
Node.js LTS Runtime
Next.js 15.1 App Router, Server Components
React 18.3 Hooks, Suspense
TypeScript 5.7 Tipagem estática
Tailwind CSS 3.4 Estilização
TanStack Query 5.62 Cache e estado assíncrono
shadcn/ui Componentes acessíveis
Vitest 4.0 Testes unitários e de UI

📁 Arquivos Principais

Novos

  • vercel.json — Configuração de deploy (framework Next.js)
  • public/ — Pasta para assets estáticos (evita erro de Output Directory na Vercel)
  • ARCHITECTURE.md — Documentação técnica da arquitetura
  • README.md — Vitrine do projeto
  • TESTE_DINHEIROW.md — Enunciado original preservado
  • src/lib/pokemon-color-gradients.ts — Gradientes dinâmicos por cor
  • src/presentation/components/pokemon-advanced-modal/ — Super Modal
  • src/presentation/components/filter-panel/ — Filtros avançados
  • src/presentation/hooks/use-evolution-chain.ts — Cadeia evolutiva

Modificados (refatoração Clean Code)

  • src/lib/utils.tscapitalize, formatPokemonId extraídos
  • src/lib/constants.ts — Constantes nomeadas (ITEMS_PER_PAGE, MAX_STAT, etc.)
  • src/domain/entities/pokemon.ts — Campos expandidos (varieties, flavorTexts, etc.)
  • src/data/mappers/pokemon.mapper.ts — Mapeamento completo Pokémon + Species

✅ Checklist do Revisor

  • Código segue os padrões do projeto
  • Nenhuma regra de negócio na camada de apresentação
  • Testes passando (npm run test:run)
  • Build sem erros (npm run build)
  • Lint sem erros (npm run lint)
  • README e ARCHITECTURE.md revisados
  • Requisitos do teste atendidos

🚀 Deploy (Vercel)

Configuração

O projeto está configurado para deploy na Vercel com Next.js. O arquivo vercel.json define o framework corretamente.

Configuração Valor Observação
Framework Next.js Auto-detectado via vercel.json
Output Directory (vazio) ⚠️ Não defina como public — Next.js usa .next como saída
Build Command next build Padrão do package.json

Erro comum

"No Output Directory named 'public' found" — Ocorre quando o Output Directory está definido como public nas configurações do projeto na Vercel. Para Next.js, esse campo deve ficar em branco (padrão). O diretório public/ é para arquivos estáticos de entrada, não para a saída do build.

Arquivos de deploy

  • vercel.json — Configuração do framework
  • public/ — Pasta para assets estáticos (favicon, robots.txt, etc.)

📚 Documentação

Documento Descrição
README.md Visão geral, stack, como rodar
ARCHITECTURE.md Clean Architecture, SOLID, diagramas
TESTE_DINHEIROW.md Enunciado original do desafio

🎯 Como Rodar

# Instalação
npm install

# Desenvolvimento
npm run dev

# Build de produção
npm run build

# Testes
npm run test:run

Pull Request elaborado conforme boas práticas de documentação técnica.

- Created .gitignore to exclude unnecessary files and directories.
- Added ARCHITECTURE.md to outline project architecture and design principles.
- Introduced components.json for component configuration.
- Set up next.config.ts for image handling.
- Initialized package.json and package-lock.json with dependencies.

- Configured PostCSS and Tailwind CSS in postcss.config.cjs and tailwind.config.ts.
- Updated readme.md to reflect project details and requirements.
- Added TypeScript configuration in tsconfig.json.
- Set up Vitest configuration for testing.
- Created global CSS styles in globals.css.
- Established layout structure in layout.tsx and not-found.tsx.
- Implemented main page and Pokémon detail page with routing.
- Developed data mappers for API responses and corresponding tests.
- Included utility components for loading states and UI elements.
- Created vercel.json for Vercel deployment configuration with Next.js framework.
- Added .gitkeep file to the public directory to ensure it is tracked in version control.
- Upgraded Next.js from version 15.1.0 to 15.1.9 in package.json and package-lock.json.
- Updated eslint-config-next from version 15.1.0 to 15.1.9 in package.json and package-lock.json.
- Included a link to the production application for easy access.
- Updated project description to enhance clarity on application features.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant