CurrencyHub e um dashboard frontend para acompanhar moedas e visualizar cotacoes em relacao ao real brasileiro (BRL). O projeto foi estruturado com foco em arquitetura feature-based, performance e clareza de manutencao.
Este projeto foi desenvolvido como estudo pratico de arquitetura frontend, componentizacao e decisoes voltadas a performance. A interface de consulta de moedas serve como base para exercitar conceitos modernos do ecossistema React, como separacao por dominio, carregamento sob demanda de rotas, cache de dados, estado global enxuto e testes funcionais.
Hoje a aplicacao consome dados do Frankfurter para listagem e detalhe de moedas, usa favoritos persistidos com Zustand e ja possui uma base de testes voltada a comportamento visivel da interface.
React 19TypeScriptViteReact RouterTanStack React QueryZustandReact Hook FormTailwind CSSshadcn/uieRadix UIRechartsVitestReact Testing LibraryMSWESLint
src/
app/
providers/ # Providers globais da aplicacao
router/ # Configuracao de rotas
components/
shared/ # Layout e componentes compartilhados
ui/ # Componentes de interface reutilizaveis
features/
rates/
components/ # Componentes da feature de moedas
hooks/ # Hooks da feature
services/ # Camada de acesso a dados
store/ # Estado global com Zustand
types/ # Tipagens da feature
lib/
utils/ # Utilitarios genericos
pages/ # Paginas ligadas as rotas
test/ # Infra de testes, mocks e helpers
Node.js20 ou superior recomendadonpm
npm installnpm run devDepois, abra o endereco exibido no terminal, normalmente http://localhost:5173.
O projeto usa a URL base da API do Frankfurter via variavel de ambiente:
VITE_FRANKFURTER_API_BASE_URL=https://api.frankfurter.dev/v1Voce pode copiar o arquivo .env.example para .env.local se quiser customizar esse valor.
npm run buildOs arquivos gerados ficam em dist/.
npm run previewnpm run lintA aplicacao possui uma base de testes funcionais com foco em comportamento do usuario, evitando excesso de testes de implementacao.
Vitestcomo test runnerReact Testing Librarypara interacao e renderizacao@testing-library/user-eventpara simular acoes reaisjsdomcomo ambiente de navegadorMSWpara mockar as respostas da API do Frankfurter sem rede real
npm run testModo watch:
npm run test:watchCurrencySearchForm- render do campo e CTA
- erro ao enviar codigo invalido
- navegacao para
/currencies/:codecom codigo valido
CurrenciesTable- render da listagem a partir da API mockada
- favoritar e desfavoritar moeda
- navegacao para a rota de detalhe
- fallback em caso de erro de API
CurrencyDetailContent- render do snapshot principal
- toggle de favoritos
- render do bloco principal mesmo com o grafico lazy
AppHeader- ausencia de spotlight sem favoritos
- render do spotlight com favorita
- atualizacao do
document.title
NotFound- mensagem e acao esperadas para 404
src/test/setup.ts: setup global do Vitest, cleanup e reset da storesrc/test/server.ts: servidor MSW para os testessrc/test/mocks/handlers.ts: handlers das rotas mockadas do Frankfurtersrc/test/render-with-providers.tsx: helper para renderizar com Query Client e Router
O projeto possui uma pipeline de CI/CD com GitHub Actions e publicacao no GitHub Pages.
O arquivo .github/workflows/ci.yaml executa tres etapas principais:
quality- instala dependencias com
npm ci - roda
npm run lint - roda
npm run test - roda
npm run build
- instala dependencias com
github-pages-build- roda apenas em
mainoumaster - gera o build de producao
- publica o artifact do
dist/para o GitHub Pages
- roda apenas em
github-pages-deploy- roda apenas em
mainoumaster - faz o deploy final com
actions/deploy-pages
- roda apenas em
pull_request- executa validacao de qualidade
develop- executa validacao de qualidade
- nao faz deploy
mainemaster- executam validacao de qualidade
- executam build para Pages
- executam deploy no GitHub Pages
- Alias
@apontando parasrc/para simplificar imports - Rotas carregadas com
lazyeSuspense, ajudando nocode splitting React Queryconfigurado comstaleTime,retryerefetchOnWindowFocus: falseZustandusado para favoritos persistidos no clienteReact Hook Formusado para controlar o formulario de busca com validacoes simples- Estrutura orientada a feature para manter componentes, hooks, services e types proximos do dominio
npm run dev: inicia o servidor de desenvolvimentonpm run build: gera a build de producaonpm run preview: sobe a build localmente para validacaonpm run lint: executa a analise estatica com ESLintnpm run test: executa a suite de testes com Vitestnpm run test:watch: executa os testes em modo watch