Conforme foi pedido no desafio desenvolvi essa aplicação de maneira rápida e aplicando alguns conceitos importantes na hora do desenvolvimento. priorizando a escalabilidade, performance e a experiência de usuário.
- Pesquisa de usuários do GitHub por nome de usuário fazendo uma única requisição para cada informação e reutilizada em todo o contexto do código.
- Visualização detalhada de informações do perfil incluindo avatar, biografia, localização, empresa, blog e links sociais retornada pela api do github.
- Navegação e filtragem de repositórios e repositórios favoritados do usuário sem fazer uma nova requisição.
- Responsividade para desktop, tablet e dispositivos móveis com a escolha da lib que já vem com suporte a responsividade
- Filtro dinâmico para repositórios (pesquisa, tipo, linguagem)
- Next.js 14: Para fazer o roteamento e estrutura geral da aplicação de maneira menos verbosa e rápida.
- TypeScript: Para tipar os dados retornados pela API e trabalhar melhor na hora de utilizar essas infomações.
- TanStack Query (React Query): Para busca eficiente de dados, cache e gerenciamento de estado configurado para invalidar as informações após um tempo.
- Zustand: Para gerenciamento dos dados retornados pela API sem precisar refazer requisições e buscas desnecessárias.
- Tailwind CSS: Para estilização baseada em design responsivo com rapidez e eficiência na hora de codar.
- Shadcn UI: Para componentes UI personalizáveis e que economizam tempo na hora de contruir as páginas
- React Hook Form: Para validação e gerenciamento de formulários principalmente os dados de entrada de formulário.
- Zod: Para validação de esquemas, não foi muito utilizado por não ter tantas validações de entrada mas caso tenha necessidade em algum momento.
- linguagem: escolhi o NextJS por roteamento e configurações mais rápidas e simples
- Não utilizar o vite: como estou utilizandon no Nextjs decidi criar direto pelo CLI do next, porque com o vite eu teria que criar a aplicação em react e depois configurala para o NextJs levando mais tempo de configuração.
- Estruturação de arquivos: Utilizei o conceito de MVC par organizar melhor a aplicação nos conceitos de buscas e salvamento dessas informações.
A aplicação segue uma arquitetura baseada em componentes com clara separação de responsabilidades:
components/
: Componentes UI reutilizáveis e com acessibilidade da biblioteca Shadcncontext/
: Gerenciamento de estado global usando Zustand que me permitiu armazenar o retorno da API e utilizalo da em diversas partes do meu código somente instânciandolib/
: Funções de API onde utilizei o Axios para instânciar todas as requisições na api do GitHub e utilitários de configuração do Tailwindtypes/
: Definições de tipos no profile e repos para trabalhar de maneira melhor na hora de apresentar essas informações.app/
: Páginas Next.js e roteamento
A aplicação foi projetada para ser totalmente responsiva com otimizações específicas para:
- Desktop (>= 1024px)
- Tablet (768px - 1023px)
- Mobile (< 768px)
Implementei uma abordagem mobile-first, aprimorando gradualmente a UI para telas maiores usando os breakpoints responsivos do Tailwind.
Durante o desenvolvimento, encontrei vários desafios:
-
Limitação de dados da API do GitHub: A API do GitHub tem limites de informações necessárias então ela retorna 30 repositórios de cada vez.
-
Melhoria de alguns pontos no design: Sem fugir do layout principal implementar algumas melhorias como tela home, posicionamento de alguns componentes.
-
Integração de Ícone de Status: não foi possível adcionar o emoji pos a api não retorna e para fazer essa busca seria necessário a implementação na rota graphQL do github.
Com tempo adicional, as seguintes melhorias poderiam ser feitas:
- Implementar paginação para repositórios para lidar com usuários com grande número de repositórios
- Otimizar o carregamento de imagens com prioridade e placeholder da Image do Next.js
- Adcionar um middleware para esse controle de users
- Adicionar autenticação para aumentar os limites de taxa da API e acessar repositórios privados
- Implementar página de detalhes do repositório com histórico de commits e navegador de código
- Incorporar mais dados do GitHub como organizações, contribuições e gráfico de atividade
- Refatorar para uma estrutura de pastas mais robusta para maior escala
- Adicionar testes unitários e de integração abrangentes
- Implementar storybook para documentação de componentes
- Implementar atualizações otimistas de UI para melhor desempenho percebido
- Adicionar funcionalidade de troca de tema (modo claro/escuro)
- Melhorar o tratamento de erros com mensagens de erro mais específicas
- Node.js 18.x ou superior
- npm ou yarn
- Clone o repositório:
git clone https://github.com/seuusuario/github-profile-viewer.git
cd github-profile-viewer
- Instale as dependências:
npm install
# ou
yarn install
- Rodar a aplicação
npm run dev
#ou
yarn dev
e acesse na porta 3000