🎬 Desafio Front-end Gazin Tech
💫 Biblioteca visual de componentes
✨ Temas dark e light
💫 Base de dados em português mantida pela comunidade
✨ Testes unitários para componentes
💫 Cache do front-end com geração estática incremental
✨ Imagens otimizadas
💫 CI / CD
✨ Typescript
Resumo:
Desenvolver uma aplicação Front-end na linguagem/framework de sua preferência, tendo como requisito ser em SPA (single-page application) e atender os requisitos listados abaixo.
Você deve seguir como base para o desenvolvimento do layout da aplicação o seguinte mockup:
[...]
Seguindo o enunciado do desafio e seus requisitos, desenvolvi em 60 horas de trabalho, um front-end SPA com React
para exibir informações sobre filmes.
Eu ainda não tinha conhecimento em server side rendering, mas por notar que a Gazin utilizava NextJS
em sua stack, decidi estudar e desenvolver o projeto usando o framework.
Portanto, para o front-end, utilizei:
-
next
como base do desenvolvimento.Apesar de nascer como um framework para renderização da interface no servidor, o
next
oferece ferramentas muito robustas para otimização do front-end e eu o utilizei gerando as páginas de forma estática no momento da build. Utilizando funcionalidades recém lançadas da versão 12, conforme os usuários vão acessando, as páginas são re-geradas se necessário e "cacheadas". -
styled-components
esanitize.css
para estilização.Basicamente, toda a estilização foi criado do zero a partir de uma base normalizada.
styled-components
é uma biblioteca de estilizações CSS in JS com escopo fechado por componentes.sanitize.css
é uma lista de estilos criados para normalizar o comportamento dos diferentes navegadores do mercado. -
fontawesome
para ícones. -
framer-motion
para animações.É uma biblioteca de animações focada em componentes
React
. É uma boa utilidade para desenvolver animações com rapidez, mas também oferece ferramentas para criar interações do zero.
Os componentes banner
e listFilms
utilizam um slider e um carousel que foram feitos do zero. Não utiizei bibliotecas prontas e desenvolvi uma solução otimizada para a aplicação.
No desafio, foi sugerido usar a API do IMDB da RapidAPI. Mas depois de muitas horas insistindo e desenvolvendo uma integração que atendesse as necessidades do projeto, percebi que usar esta API iria limitar demais a aplicação final que eu estava desenvolvendo.
Os motivos foram:
-
O limite de requisições gratuítas do serviço é ridiculamente pequeno.
Numa conta gratuíta era possível fazer apenas 500 requisições por mês. Apenas nos testes iniciais, mesmo fazendo cache em memória das requisições, eu já tinha gasto quase 200 requisições. Nos primeiros acessos de usuários reais eu já excederia o limite mensal e a aplicação seria inutilizada por várias semanas.
-
Péssima documentação de endpoints.
-
Resultados arbitrários e não normalizados.
-
A API retorna apenas informações em inglês (não existe opção de troca de idioma, como está escrito no enunciado do desafio).
Outra API da RapidAPI que abri mão de usar foi a de traduções do google translate, por conta do limite baixíssimo de 500 caracteres por mês. Isso mesmo, 500 caracteres de traduções por mês. Isso significa que ao traduzir um título "Iron Man" para "Homem de Ferro", eu já gastaria 8 caracteres da cota mensal, até espaços contam. Qualquer tradução de sinopse já gastaria fácil a cota de 500 caracteres.
Busquei outras provedoras de API que ofereciam dados da base do IMDB, mas todas tinham alguma limitação. Os dados não eram consistentes, não exisitia suporte integral ao português e o limite de requisições era baixo.
Então, o que eu decidi fazer para desenvolver uma aplicação com dados de qualidade, foi abrir mão da base de dados do IMDB (Internet Movie Database) e passar a usar a base de dados alternativa criada e mantida pela comunidade, TMDB (The Movie Database).
Esta é completamente aberta ao público, não há limite de requisições e é muito mais focada na internacionalidade, portanto, o português é completamente suportado, excluindo a necessidade de usar API's de tradução. A documentação é melhor que a da RapidAPI e os dados são melhor distribuídos entre os endpoints, diminuindo a quantidade de requests necessárias para obter informações completas.
- Clone o projeto:
git clone https://github.com/alpfilho/gazin-tech-desafio-frontend.git
- Copie o .env de exemplo e forneça uma Api Key do IMDB:
cp .env.local.example .env.local
- Instale as dependências:
yarn install
-
Execute:
-
Para a versão de desenvolvimento:
yarn dev
-
Para a versão de produção:
yarn build; yarn start
-