Documentação
Guia completo para desenvolvedores da plataforma Ameciclo
Visão Geral
O projeto Ameciclo é uma plataforma web desenvolvida com Remix e TypeScriptque tem como objetivo fornecer dados sobre mobilidade ativa na região metropolitana do Recife.
A plataforma oferece visualização de dados de contagens de ciclistas, documentos relacionados à mobilidade urbana, observatórios especializados em diferentes aspectos da mobilidade ativa, e ferramentas de monitoramento para garantir a disponibilidade e performance de todos os serviços.
Monitoramento em Tempo Real
A plataforma conta com uma página dedicada ao monitoramento do status de todos os serviços e páginas em tempo real.
Ver Status dos ServiçosObjetivo
Promover a mobilidade ativa através de dados e informações acessíveis
Tecnologias
Remix, TypeScript, React, Tailwind CSS
Instalação
Pré-requisitos
- Node.js ≥ 20.0.0
- npm ou yarn
- Git
Passos para instalação
1. Clone o repositório:
git clone https://github.com/Ameciclo/ameciclo.git
2. Instale as dependências:
npm install
3. Inicie o servidor de desenvolvimento:
npm run dev
4. Acesse a aplicação:
http://localhost:5173
Estrutura do Projeto
ameciclo/ ├── app/ │ ├── components/ # Componentes React organizados por funcionalidade │ │ ├── Commom/ # Componentes reutilizáveis (Navbar, Footer, Banner, etc.) │ │ │ ├── Navbar.tsx # Barra de navegação principal │ │ │ ├── Footer.tsx # Rodapé do site │ │ │ ├── Banner.tsx # Banner de páginas │ │ │ ├── Breadcrumb.tsx # Navegação estrutural │ │ │ └── Icones/ # Ícones SVG personalizados │ │ ├── Agenda/ # Componentes específicos da agenda │ │ ├── Contagens/ # Componentes para visualização de contagens │ │ ├── Dados/ # Componentes da seção de dados │ │ ├── Documentacao/ # Componentes da documentação │ │ ├── Projetos/ # Componentes da seção de projetos │ │ └── QuemSomos/ # Componentes da página "Quem Somos" │ ├── routes/ # Rotas da aplicação (file-based routing) │ │ ├── _index.tsx # Página inicial (/) │ │ ├── agenda.tsx # Página da agenda (/agenda) │ │ ├── dados._index.tsx # Página principal de dados (/dados) │ │ ├── dados.contagens.tsx # Página de contagens (/dados/contagens) │ │ ├── contagens.$slug.tsx # Página individual de contagem │ │ ├── projetos._index.tsx # Página de projetos │ │ ├── projetos.$projeto.tsx # Página individual de projeto │ │ ├── documentacao._index.tsx # Esta documentação │ │ └── *.tsx # Outras rotas │ ├── loader/ # Funções de carregamento de dados │ │ ├── agenda.ts # Loader para dados da agenda │ │ ├── dados.contagens.ts # Loader para contagens │ │ ├── projetos.ts # Loader para projetos │ │ └── *.ts # Outros loaders │ ├── services/ # Serviços e utilitários │ │ └── utils.ts # Funções utilitárias │ └── types/ # Definições de tipos TypeScript ├── public/ # Arquivos estáticos │ ├── icons/ # Ícones e imagens │ └── *.webp # Imagens otimizadas ├── documentation/ # Documentação adicional └── package.json # Dependências e scripts
Detalhamento das Pastas
app/components/Commom/
Pasta de componentes reutilizáveis usados em toda a aplicação:
- • Navbar.tsx - Barra de navegação com logo responsiva
- • Footer.tsx - Rodapé com links e informações
- • Banner.tsx - Banner de cabeçalho das páginas
- • Breadcrumb.tsx - Navegação estrutural
- • GoogleAnalytics.tsx - Integração com GA
- • Icones/ - Ícones SVG personalizados
app/routes/
Sistema de roteamento baseado em arquivos do Remix:
- • _index.tsx - Página inicial com seções dinâmicas
- • dados._index.tsx - Hub central de dados
- • contagens.$slug.tsx - Páginas dinâmicas de contagens
- • projetos.$projeto.tsx - Páginas dinâmicas de projetos
- • documentacao._index.tsx - Esta documentação
app/loader/
Funções para carregamento de dados do servidor:
- • dados.contagens.ts - Carrega dados de contagens de ciclistas
- • projetos.ts - Carrega informações dos projetos
- • agenda.ts - Integração com Google Calendar
Componentes
Os componentes são organizados por funcionalidade e reutilizabilidade:
Componentes Comuns
app/components/Commom/
├── Navbar.tsx # Barra de navegação
├── Footer.tsx # Rodapé
├── Banner.tsx # Banner de páginas
├── Breadcrumb.tsx # Navegação estrutural
└── GoogleAnalytics.tsx # Analytics
Exemplo de uso
import Banner from "~/components/Commom/Banner";
import Breadcrumb from "~/components/Commom/Breadcrumb";
export default function MinhaPage() {
return (
<>
<Banner image="/imagem.webp" alt="Descrição" />
<Breadcrumb
label="Página Atual"
slug="/pagina-atual"
routes={["/", "/secao"]}
/>
{/* Conteúdo da página */}
</>
);
}
Rotas
O Remix utiliza roteamento baseado em arquivos. Cada arquivo em app/routes/
representa uma rota:
Rotas principais:
/_index.tsx → /
agenda.tsx → /agenda
dados._index.tsx → /dados
dados.contagens.tsx → /dados/contagens
contagens.$slug.tsx → /contagens/:slug
projetos.$projeto.tsx → /projetos/:projeto
Exemplo de rota com loader:
// app/routes/contagens.$slug.tsx
import { LoaderFunctionArgs } from "@remix-run/node";
import { fetchWithTimeout } from "~/services/fetchWithTimeout";
export async function loader({ params }: LoaderFunctionArgs) {
const { slug } = params;
// Usando fetchWithTimeout para evitar timeouts
const data = await fetchWithTimeout(
"http://api.garfo.ameciclo.org/cyclist-counts",
{ cache: "no-cache" },
5000,
{ counts: [] }
);
const contagem = data.counts?.find((c: any) => c.slug === slug);
if (!contagem) {
throw new Response("Contagem não encontrada", { status: 404 });
}
return { contagem };
}
API
A aplicação consome dados de diferentes APIs para fornecer informações sobre mobilidade ativa:
Endpoints principais
GET http://api.garfo.ameciclo.org/cyclist-counts
Retorna dados de contagens de ciclistas realizadas em diferentes pontos da cidade
GET http://api.garfo.ameciclo.org/cyclist-counts/edition/:id
Retorna dados detalhados de uma contagem específica
GET http://cms.ameciclo.org/api/
Sistema de gerenciamento de conteúdo para projetos e informações
Estrutura de Dados - Contagens
{
"counts": [
{
"id": 1,
"name": "Ponte do Jiquiá",
"slug": "ponte-do-jiquia",
"date": "2024-03-15",
"total_cyclists": 245,
"total_women": 89,
"total_helmet": 156,
"total_juveniles": 23,
"location": {
"lat": -8.0476,
"lng": -34.8770
}
}
]
}
Testes
O projeto utiliza ferramentas de qualidade de código para garantir a confiabilidade:
Linting e Type Checking
Verificar qualidade do código:
npm run lint
Verificar tipos TypeScript:
npm run typecheck
Configuração do ESLint
// .eslintrc.cjs
module.exports = {
extends: [
"@remix-run/eslint-config",
"@remix-run/eslint-config/node"
],
rules: {
// Regras personalizadas do projeto
}
};
Dica: Execute os testes antes de fazer commit para garantir a qualidade do código.
Configuração
Variáveis de Ambiente
O projeto pode utilizar variáveis de ambiente para configurações específicas:
Crie um arquivo .env
na raiz do projeto:
# APIs
API_BASE_URL=http://api.garfo.ameciclo.org
CMS_BASE_URL=http://cms.ameciclo.org
# Analytics
GOOGLE_ANALYTICS_ID=G-PQNS7S7FD3
# Desenvolvimento
NODE_ENV=development
Configurações do Tailwind
// tailwind.config.ts
export default {
content: ["./app/**/*.{js,jsx,ts,tsx}"],
theme: {
extend: {
colors: {
ameciclo: "#2E8B57", // Verde Ameciclo
},
},
},
plugins: [],
};
Soluções
Problemas Comuns
Erro: "Module not found"
Solução:
npm install
Reinstale as dependências se algum módulo não for encontrado.
Erro: "Port already in use"
Solução:
npx kill-port 5173
Mate o processo que está usando a porta 5173.
Erro de API: "Failed to fetch" ou "504 Gateway Timeout"
Possíveis causas:
- API externa indisponível
- Problemas de CORS
- URL da API incorreta
- Timeout na conexão com a API
Solução: Use o utilitário fetchWithTimeout para definir um timeout e fornecer dados de fallback.
Problemas com react-map-gl
Solução:
npm remove react-map-gl && npm install react-map-gl@6
Use a versão 6 para compatibilidade com Vite.
Dica: Se o problema persistir, consulte os issues no GitHub ou abra um novo issue com detalhes do erro.
Deploy
Dependências Principais
Framework e Core
- @remix-run/* - Framework full-stack React com SSR
- react - Biblioteca para interfaces de usuário
- typescript - Superset do JavaScript com tipagem
- vite - Build tool rápido e moderno
UI e Estilização
- tailwindcss - Framework CSS utilitário
- framer-motion - Animações e transições
- styled-components - CSS-in-JS
Funcionalidades Específicas
- @fullcalendar/* - Calendário interativo para agenda
- highcharts - Gráficos e visualizações
- react-map-gl - Mapas interativos
- keen-slider - Carrossel/slider responsivo
- react-markdown - Renderização de Markdown
Utilitários
- match-sorter - Busca e ordenação inteligente
- react-spinners - Indicadores de carregamento
- react-lazyload - Carregamento lazy de componentes
Build para produção
1. Gerar build otimizado:
npm run build
2. Iniciar servidor de produção:
npm start
Nota: O pipeline de deploy ainda está em desenvolvimento. Consulte o README.md para atualizações sobre o processo de deploy.
Contribuição
Contribuições são sempre bem-vindas! Siga este guia para contribuir com o projeto:
Processo de Contribuição
1. Fork e Clone
git clone https://github.com/SEU-USUARIO/ameciclo.git
cd ameciclo
2. Crie uma branch
git checkout -b feature/nova-funcionalidade
Use nomes descritivos: feature/
, fix/
, docs/
3. Desenvolva e Teste
npm install
npm run dev
npm run lint
npm run typecheck
4. Commit e Push
git add .
git commit -m "feat: adiciona nova funcionalidade"
git push origin feature/nova-funcionalidade
5. Abra um Pull Request
Descreva claramente as alterações e inclua screenshots se necessário
Padrões de Código
Use conventional commits: feat:
, fix:
, docs:
Sempre tipifique variáveis e funções
Use nomes descritivos e organize por funcionalidade
Tipos de Contribuição
Identifique e corrija problemas existentes
Adicione recursos que melhorem a plataforma
Melhore ou adicione documentação
Melhore a interface e experiência do usuário
Dica: Consulte os issues abertos no GitHub para encontrar tarefas que precisam de ajuda.