Aplicação React para explorar filmes, buscar títulos, visualizar detalhes e gerenciar uma lista de favoritos, utilizando a API pública do The Movie Database (TMDB).
Aplicação disponível em: https://movie.luislab.xyz
- Exploração de Filmes: Visualização de filmes populares com scroll infinito
- Busca de Filmes: Pesquisa de filmes por título
- Detalhes do Filme: Visualização completa de informações, incluindo sinopse, gêneros, data de lançamento e avaliações
- Gerenciamento de Favoritos: Adição e remoção de filmes da lista de favoritos com persistência em localStorage
- Ordenação de Favoritos: Ordenação por título ou avaliação em ordem crescente ou decrescente
- Internacionalização (i18n): Suporte para múltiplos idiomas (inglês e português) com detecção automática e troca de idioma
- Tratamento de Erros: Exibição de mensagens de erro com opção de retry
- Estados de Loading: Indicadores visuais durante carregamento de dados
- Design Responsivo: Interface adaptável para diferentes tamanhos de tela
A aplicação possui as seguintes rotas:
| Rota | Componente | Descrição |
|---|---|---|
/ |
HomePage |
Exibe filmes populares com scroll infinito |
/movie/:id |
MoviePage |
Exibe detalhes completos de um filme específico |
/search |
SearchPage |
Exibe resultados de busca de filmes com scroll infinito |
/favorites |
FavoritesPage |
Exibe lista de filmes favoritos com opções de ordenação |
Para utilizar a aplicação, é necessário obter uma chave de API do TMDB:
- Acesse https://www.themoviedb.org/
- Crie uma conta ou faça login
- Acesse as configurações da conta
- Navegue até a seção "API"
- Solicite uma chave de API (tipo "Developer")
- Copie a chave gerada
Crie um arquivo .env na raiz do projeto com as seguintes variáveis:
VITE_TMDB_URL=https://api.themoviedb.org/3
VITE_TMDB_API_KEY=sua_chave_api_aqui
VITE_TMDB_IMAGE_URL=https://image.tmdb.org/t/pExemplo de .env.example:
VITE_TMDB_URL=https://api.themoviedb.org/3
VITE_TMDB_API_KEY=your_api_key_here
VITE_TMDB_IMAGE_URL=https://image.tmdb.org/t/p- Node.js 20 ou superior
- npm ou yarn
npm installnpm run devA aplicação estará disponível em http://localhost:5173
npm run buildOs arquivos otimizados serão gerados na pasta dist/
npm run previewnpm run lint- React: Biblioteca para construção de interfaces
- TypeScript: Superset do JavaScript com tipagem estática
- Vite: Build tool e dev server
- React Router: Gerenciamento de rotas e navegação
- TanStack Query: Gerenciamento de estado do servidor, cache e sincronização
- Context API: Gerenciamento de estado global para favoritos
- Tailwind CSS: Framework CSS utility-first
- Lucide React: Biblioteca de ícones
- Axios: Cliente HTTP para requisições à API
- i18next: Framework de internacionalização
- Jest: Framework de testes
- React Testing Library: Utilitários para testes de componentes React
- ESLint: Linter para JavaScript/TypeScript
- TypeScript ESLint: Regras ESLint para TypeScript
Este projeto demonstra os seguintes aspectos técnicos:
- Custom hooks para consumo de API (
usePopularMovies,useMovieById,useMovieByQuery,useFavoriteMovies) - Hooks de UI (
useIntersectionObserver,useFavorites,useGlowEffect) - Uso adequado de hooks nativos do React (
useState,useEffect,useCallback,useLayoutEffect,useRef)
- Context API implementado para gerenciamento de favoritos (
FavoritesContext) - Persistência de estado em localStorage
- TanStack Query para gerenciamento de estado do servidor e cache
- Cliente Axios configurado com interceptors
- Integração com API do TMDB
- Tratamento de respostas paginadas
- Infinite queries para scroll infinito
- Queries com parâmetros dinâmicos
- React Router configurado com rotas aninhadas
- Layout compartilhado entre rotas
- Navegação programática
- Parâmetros de rota e query strings
- Componentes de erro reutilizáveis com opção de retry
- Componentes de loading com labels personalizáveis
- Estados de loading, error e success gerenciados pelo TanStack Query
- Mensagens de erro contextuais
- Separação clara de responsabilidades
- Estrutura de pastas organizada por feature
- Componentes reutilizáveis
- Hooks customizados para lógica de negócio
- Tipos TypeScript bem definidos
- Configurações centralizadas (axios, query-client)
- Design mobile-first
- Grid responsivo com breakpoints
- Componentes adaptáveis a diferentes tamanhos de tela
- Navegação otimizada para mobile e desktop
npm testnpm run test:ciOs testes estão organizados junto aos componentes e hooks, seguindo o padrão *.test.tsx ou *.test.ts. A configuração do Jest utiliza:
- Ambiente jsdom para simulação do DOM
- Setup automático com
@testing-library/jest-dom - Suporte a TypeScript e ES Modules
- Transformação com ts-jest
- Testes de componentes (
Layout,Header,Error,Loading,MovieCard, etc.) - Testes de hooks customizados
- Testes de funcionalidades de favoritos
- Testes de ordenação
A aplicação foi desenvolvida seguindo boas práticas de acessibilidade, garantindo uma experiência acessível para todos os usuários.
- Navegação por Teclado: Suporte completo para navegação usando apenas o teclado
- Skip Link: Link de navegação rápida para pular para o conteúdo principal (visível ao focar com Tab)
- ARIA Labels: Todos os elementos interativos possuem labels descritivos para leitores de tela
- Semantic HTML: Uso de elementos semânticos (
<main>,<nav>,<section>, etc.) para melhor estruturação - Hierarquia de Cabeçalhos: Estrutura adequada de h1-h6 em todas as páginas
- Anúncios de Estado: Uso de
aria-livepara anunciar mudanças dinâmicas de conteúdo (loading, erros) - Atributo Lang Dinâmico: O atributo
langdo HTML é atualizado automaticamente conforme o idioma selecionado - Ícones Decorativos: Todos os ícones decorativos possuem
aria-hidden="true" - Foco Visível: Indicadores de foco claros e visíveis para todos os elementos interativos
- Contraste de Cores: Cores seguem os requisitos de contraste WCAG AA (4.5:1 para texto, 3:1 para componentes)
- ESLint Plugin: Configurado com
eslint-plugin-jsx-a11ypara validação automática de acessibilidade durante o desenvolvimento - Validação Contínua: Regras de acessibilidade são verificadas automaticamente no processo de linting
A aplicação foi testada e otimizada para funcionar com leitores de tela populares:
- VoiceOver (macOS/iOS)
A aplicação possui suporte completo para internacionalização usando i18next e react-i18next, permitindo que os usuários alternem entre diferentes idiomas.
- Inglês (en): Idioma padrão
- Português (pt): Suporte completo
- Detecção Automática de Idioma: O sistema detecta automaticamente o idioma preferido do navegador
- Persistência de Preferência: A preferência de idioma é salva no localStorage
A aplicação está configurada para deploy usando Docker e Nginx.
docker build \
--build-arg VITE_TMDB_URL=https://api.themoviedb.org/3 \
--build-arg VITE_TMDB_API_KEY=sua_chave_api \
--build-arg VITE_TMDB_IMAGE_URL=https://image.tmdb.org/t/p \
-t movie-app .docker run -p 80:80 movie-appA aplicação está hospedada em: https://movie.luislab.xyz
O deploy utiliza:
- Build multi-stage com Docker
- Nginx como servidor web
- Configuração de SPA (Single Page Application) com fallback para
index.html - Cache otimizado para assets estáticos
- Compressão gzip habilitada
movie/
├── dist/ # Build de produção
├── public/ # Arquivos estáticos públicos
├── src/
│ ├── components/ # Componentes React reutilizáveis
│ │ ├── favorite/ # Componentes relacionados a favoritos
│ │ ├── language-switcher/ # Componente de troca de idioma
│ │ ├── layout/ # Componentes de layout (Header, Error, Loading)
│ │ ├── movie/ # Componentes relacionados a filmes
│ │ ├── rating/ # Componente de avaliação
│ │ └── search-input/ # Componente de busca
│ ├── contexts/ # Context API providers
│ │ └── favorites/ # Context de favoritos
│ ├── hooks/ # Custom hooks
│ │ ├── ui/ # Hooks de UI
│ │ └── *.ts # Hooks de API
│ ├── lib/ # Configurações e utilitários
│ │ ├── axios.ts # Cliente HTTP configurado
│ │ ├── i18n.ts # Configuração do i18next
│ │ └── query-client.ts # Configuração do TanStack Query
│ ├── locales/ # Arquivos de tradução
│ │ ├── en/ # Traduções em inglês
│ │ └── pt/ # Traduções em português
│ ├── pages/ # Páginas da aplicação
│ │ ├── favorites/ # Página de favoritos
│ │ ├── home/ # Página inicial
│ │ ├── movie/id/ # Página de detalhes do filme
│ │ └── search/ # Página de busca
│ ├── test/ # Configurações e helpers de teste
│ ├── types/ # Definições de tipos TypeScript
│ ├── index.css # Estilos globais e tema
│ ├── main.tsx # Ponto de entrada da aplicação
│ └── router.tsx # Configuração de rotas
├── Dockerfile # Configuração Docker
├── nginx.conf # Configuração Nginx
├── jest.config.js # Configuração Jest
├── vite.config.ts # Configuração Vite
└── package.json # Dependências e scripts
MIT