ProtegeOC é uma aplicação mobile desenvolvida para permitir que cidadãos relatem problemas urbanos em suas cidades, como buracos nas ruas, iluminação pública quebrada, lixo acumulado, entre outros. A aplicação oferece uma plataforma colaborativa onde os usuários podem visualizar ocorrências em um mapa interativo, registrar novos problemas com fotos e localização GPS, e acompanhar o status das ocorrências reportadas.
Facilitar a comunicação entre cidadãos e órgãos públicos, permitindo que problemas urbanos sejam identificados, registrados e acompanhados de forma eficiente através de uma interface mobile intuitiva e moderna.
- Sistema de login e registro com Firebase Authentication
- Recuperação de senha
- Perfil de usuário com informações personalizadas
- Gerenciamento de sessão com Context API
- Mapa interativo usando Mapbox GL JS
- Marcadores coloridos por status (Pendente, Em Andamento, Resolvido)
- Popups informativos ao clicar nos marcadores
- Legenda de status com contadores
- Ajuste automático do zoom para mostrar todas as ocorrências
- Atualização via pull-to-refresh
- Visualização em cards com fotos
- Filtros por status (Todas, Pendentes, Em Andamento, Resolvidas)
- Contadores de ocorrências por status
- Informações detalhadas: título, descrição, categoria, autor, data e localização
- Navegação para detalhes da ocorrência
- Formulário completo com validação (React Hook Form + Zod)
- Seleção de categoria (Infraestrutura, Segurança, Meio Ambiente, etc.)
- Upload de até 5 fotos (câmera ou galeria)
- Mapa interativo para seleção de localização
- Captura de GPS automática
- Geocoding reverso para obter endereço a partir de coordenadas
- Preview de fotos antes do envio
- Barra de progresso durante upload
- Visualização completa da ocorrência
- Galeria de fotos com carrossel
- Informações do autor e data
- Sistema de comentários
- Funcionalidade de favoritar
- Votação para marcar como resolvido
- Compartilhamento de ocorrência
- Atualização em tempo real
- Visualização e edição de dados pessoais
- Estatísticas do usuário
- Logout
- React 19.0.0 - Biblioteca JavaScript para construção de interfaces
- TypeScript 5.1.6 - Superset do JavaScript com tipagem estática
- Ionic React 8.5.0 - Framework UI para aplicações mobile híbridas
- Ionicons 7.4.0 - Biblioteca de ícones
- Vite 5.2.0 - Build tool moderna e rápida
- Terser - Minificador de código JavaScript
- Code Splitting - Divisão automática de código em chunks para otimização
- React Router 5.3.4 - Gerenciamento de rotas
- Lazy Loading - Carregamento sob demanda de componentes
- React Hook Form 7.65.0 - Gerenciamento de formulários performático
- Zod 4.1.12 - Validação de schemas TypeScript-first
- @hookform/resolvers 5.2.2 - Integração entre React Hook Form e Zod
- Firebase 12.5.0
- Firebase Authentication - Autenticação de usuários
- Cloud Firestore - Banco de dados NoSQL em tempo real
- Firebase Storage - Armazenamento de arquivos (não utilizado diretamente)
- Supabase 2.83.0 - Plataforma backend como serviço
- Supabase Storage - Armazenamento de imagens das ocorrências
- Mapbox GL JS 3.16.0 - Biblioteca de mapas interativos
- Geolocation API - Captura de coordenadas GPS do dispositivo
- Mapbox Geocoding API - Conversão de coordenadas em endereços
- Capacitor 7.4.3 - Runtime para aplicações web nativas
- @capacitor/android 7.4.4 - Suporte para Android
- @capacitor/app 7.0.2 - Controle de ciclo de vida do app
- @capacitor/haptics 7.0.2 - Feedback háptico
- @capacitor/keyboard 7.0.2 - Controle do teclado
- @capacitor/splash-screen 7.0.3 - Tela de splash
- @capacitor/status-bar 7.0.2 - Controle da barra de status
- React Context API - Gerenciamento de estado global (autenticação)
- React Hooks - useState, useEffect, useRef, useMemo, useContext
- Vitest 0.34.6 - Framework de testes unitários
- Cypress 13.5.0 - Framework de testes end-to-end
- Testing Library - Utilitários para testes de componentes React
- ESLint 9.20.1 - Linter para JavaScript/TypeScript
- TypeScript ESLint - Regras específicas para TypeScript
- Commitlint - Validação de mensagens de commit
protegeo/
├── android/ # Projeto Android nativo (Capacitor)
│ ├── app/
│ │ ├── build.gradle # Configuração de build Android
│ │ └── src/main/
│ │ ├── AndroidManifest.xml
│ │ └── java/ # Código Java/Kotlin nativo
│ └── build.gradle
│
├── src/
│ ├── components/ # Componentes reutilizáveis
│ │ ├── PageHeader/ # Cabeçalho de páginas
│ │ └── ExploreContainer/ # Container de exploração
│ │
│ ├── config/ # Configurações
│ │ └── firebase.ts # Configuração do Firebase
│ │
│ ├── context/ # Context API
│ │ └── AuthContext.tsx # Context de autenticação
│ │
│ ├── hooks/ # Custom hooks
│ │ └── useTheme.ts # Hook para gerenciamento de tema
│ │
│ ├── models/ # Modelos/Interfaces TypeScript
│ │ └── Auth.ts # Tipos de autenticação
│ │
│ ├── pages/ # Páginas da aplicação
│ │ ├── Login/ # Tela de login
│ │ ├── Register/ # Tela de registro
│ │ ├── ForgotPassword/ # Recuperação de senha
│ │ ├── Tab1.tsx # Mapa de ocorrências
│ │ ├── Tab2.tsx # Lista de ocorrências
│ │ ├── Tab3.tsx # Página adicional
│ │ ├── Profile/ # Perfil do usuário
│ │ ├── ReportIncident/ # Registrar ocorrência
│ │ ├── ReportDetail/ # Detalhes da ocorrência
│ │ └── Splash/ # Tela de splash
│ │
│ ├── router/ # Configuração de rotas
│ │ ├── AppRouter.tsx # Router principal
│ │ └── screens.tsx # Definição de telas
│ │
│ ├── services/ # Serviços e APIs
│ │ ├── AuthService.ts # Serviço de autenticação
│ │ ├── FirebaseAuthService.ts # Implementação Firebase Auth
│ │ ├── supabase.ts # Cliente Supabase
│ │ └── uploads.ts # Serviço de upload de imagens
│ │
│ ├── theme/ # Estilos globais
│ │ └── variables.css # Variáveis CSS do Ionic
│ │
│ ├── App.tsx # Componente raiz
│ └── main.tsx # Ponto de entrada
│
├── public/ # Arquivos estáticos
│ ├── favicon.png
│ └── manifest.json
│
├── dist/ # Build de produção
│
├── capacitor.config.ts # Configuração do Capacitor
├── vite.config.ts # Configuração do Vite
├── tsconfig.json # Configuração TypeScript
├── package.json # Dependências e scripts
└── README.md # Este arquivo
O projeto foi iniciado usando Ionic CLI com template React e TypeScript:
ionic start protegeo tabs --type=react --capacitor- Separação de responsabilidades: Componentes, páginas, serviços e contextos organizados em pastas específicas
- TypeScript: Todo o código foi escrito em TypeScript para maior segurança de tipos
- Code Splitting: Implementado lazy loading para otimizar o carregamento inicial
- Configuração do Firebase Authentication para login/registro
- Configuração do Firestore para armazenamento de dados
- Estruturação de coleções:
users: Dados dos usuáriosreports: Ocorrências reportadasreport_interactions: Interações (favoritos, votos, comentários)comments: Comentários das ocorrências
- Configuração do Mapbox GL JS para mapas interativos
- Implementação de marcadores customizados por status
- Integração com Geocoding API para conversão de coordenadas em endereços
- Uso de Geolocation API do navegador para captura de GPS
- Configuração do Supabase Storage para upload de imagens
- Implementação de serviço de upload com tratamento de erros
- Organização de imagens por usuário e timestamp
- Configuração do Capacitor para Android
- Implementação de plugins nativos (Haptics, Keyboard, Status Bar, etc.)
- Configuração de permissões no AndroidManifest.xml
- Build e geração de APK
- Implementação de React Hook Form para gerenciamento de formulários
- Validação com Zod schemas
- Feedback visual de erros
- Validação em tempo real (onChange)
- Context API para estado global de autenticação
- Hooks customizados para lógica reutilizável
- Estado local com useState para componentes específicos
- Code splitting com lazy loading
- Chunks separados para bibliotecas grandes (React, Ionic, Firebase, Mapbox)
- Minificação com Terser
- Otimização de imagens
- Pull-to-refresh para atualização de dados
- Node.js 18+ e npm/yarn
- Java JDK 11+ (para Android)
- Android Studio (para desenvolvimento Android)
- Git
git clone <url-do-repositorio>
cd protegeonpm install
# ou
yarn installCrie um arquivo .env na raiz do projeto ou configure diretamente em src/config/firebase.ts:
const firebaseConfig = {
apiKey: "SUA_API_KEY",
authDomain: "SEU_AUTH_DOMAIN",
projectId: "SEU_PROJECT_ID",
storageBucket: "SEU_STORAGE_BUCKET",
messagingSenderId: "SEU_MESSAGING_SENDER_ID",
appId: "SEU_APP_ID",
measurementId: "SEU_MEASUREMENT_ID"
}Configure em src/services/supabase.ts:
const SUPABASE_URL = 'SUA_SUPABASE_URL'
const SUPABASE_ANON_KEY = 'SUA_SUPABASE_ANON_KEY'Configure o token em src/pages/Tab1.tsx e src/pages/ReportIncident/index.tsx:
mapboxgl.accessToken = 'SEU_MAPBOX_TOKEN'Crie as seguintes coleções no Firestore:
- users: Coleção de usuários
- reports: Coleção de ocorrências
- report_interactions: Interações das ocorrências
- comments: Comentários
Crie índices compostos no Firestore:
reports:createdAt(descending)
- Crie um bucket chamado
protegeono Supabase - Configure políticas de acesso (público para leitura, autenticado para escrita)
npm run devA aplicação estará disponível em http://localhost:5173
npm run buildOs arquivos serão gerados na pasta dist/
npm run preview- Sincronizar com Capacitor:
npm run cap:sync- Abrir no Android Studio:
npm run cap:open:android- Build e Executar:
- No Android Studio, clique em "Run" ou use
Ctrl+R(Windows/Linux) /Cmd+R(Mac) - Ou execute via linha de comando:
cd android
./gradlew assembleDebugnpm run android:apkO APK será gerado em android/app/build/outputs/apk/debug/app-debug.apk
- Login: Email e senha com validação
- Registro: Criação de conta com nome, email e senha
- Recuperação de Senha: Envio de email de recuperação
- Persistência de Sessão: Mantém usuário logado entre sessões
- Context API: Estado global de autenticação acessível em toda aplicação
- Mapbox GL JS: Mapa vetorial de alta performance
- Marcadores Dinâmicos:
- 🟡 Amarelo: Pendente
- 🔵 Azul: Em Andamento
- 🟢 Verde: Resolvido
- Popups Informativos: Mostram título, descrição, categoria e status
- Navegação: Botão para ver detalhes da ocorrência
- Legenda: Mostra contadores por status
- Pull-to-Refresh: Atualização manual dos dados
- Filtros por Status: Segment buttons com contadores
- Cards Informativos:
- Foto de capa (se disponível)
- Título e descrição
- Badge de categoria
- Chip de status com ícone
- Metadados (autor, data, localização)
- Badge de quantidade de fotos
- Skeleton Loading: Feedback visual durante carregamento
- Empty State: Mensagem quando não há ocorrências
- Formulário Validado:
- Categoria (obrigatório)
- Título (mínimo 5 caracteres)
- Descrição (mínimo 10 caracteres)
- Upload de Fotos:
- Até 5 fotos
- Câmera ou galeria
- Preview antes do envio
- Upload para Supabase Storage
- Barra de progresso
- Localização:
- Mapa interativo (clique para definir)
- Botão GPS (captura automática)
- Geocoding reverso (endereço a partir de coordenadas)
- Validação de coordenadas
- Galeria de Fotos: Carrossel com navegação
- Informações Completas: Título, descrição, categoria, status, autor, data
- Sistema de Comentários:
- Lista de comentários
- Adicionar novo comentário
- Avatar do autor
- Data do comentário
- Interações:
- Favoritar/Desfavoritar
- Votar como resolvido
- Compartilhar ocorrência
- Atualização em Tempo Real: Dados sempre atualizados
- Visualização de Dados: Nome, email
- Edição de Perfil: Atualização de informações
- Estatísticas: (Pode ser expandido)
- Logout: Encerramento de sessão
-
Firebase Authentication:
- Método: Email/Senha
- Recuperação de senha
- Persistência de sessão
-
Cloud Firestore:
- Banco de dados NoSQL
- Estrutura de coleções e documentos
- Queries com ordenação e filtros
- Timestamps automáticos
- Índices compostos para performance
- Supabase Storage:
- Bucket:
protegeo - Organização:
reports/{userId}/{timestamp}_{index}_{filename} - URLs públicas para acesso às imagens
- Políticas de acesso configuradas
- Bucket:
-
Mapbox GL JS:
- Estilo: Streets v12
- Controles de navegação
- Marcadores customizados
- Popups interativos
-
Mapbox Geocoding API:
- Conversão de coordenadas em endereços
- Idioma: Português (pt)
- Navegador/Dispositivo:
- Captura de coordenadas GPS
- Alta precisão habilitada
- Timeout configurado
- Tratamento de erros e permissões
{
uid: string
email: string
name: string
createdAt: Timestamp
updatedAt: Timestamp
}{
id: string
title: string
description: string
category: string
status: 'pending' | 'in_progress' | 'resolved'
userId: string
userName: string
userEmail: string
photos: string[] // URLs das imagens no Supabase
latitude: number
longitude: number
createdAt: Timestamp
updatedAt: Timestamp
}{
reportId: string
favorites: string[] // Array de user IDs
resolvedVotes: string[] // Array de user IDs
commentsCount: number
}{
id: string
reportId: string
userId: string
userName: string
userEmail: string
text: string
createdAt: Timestamp
}- Componentes Nativos: Botões, cards, inputs, modais, etc.
- Tema Dark: Aplicação configurada com tema escuro
- Responsividade: Adaptação automática para diferentes tamanhos de tela
- Animações: Transições suaves entre telas
- Feedback Visual: Toasts, alerts, spinners, skeletons
- Feedback Imediato: Mensagens de sucesso/erro
- Estados de Loading: Spinners e skeletons durante carregamento
- Validação em Tempo Real: Formulários validam enquanto o usuário digita
- Navegação Intuitiva: Botões de voltar, breadcrumbs
- Empty States: Mensagens quando não há dados
- Pull-to-Refresh: Atualização manual de dados
npm run test.unitnpm run test.e2e{
"dev": "vite", // Servidor de desenvolvimento
"build": "tsc && vite build", // Build de produção
"preview": "vite preview", // Preview da build
"test.e2e": "cypress run", // Testes E2E
"test.unit": "vitest", // Testes unitários
"lint": "eslint", // Linter
"cap:sync": "npx cap sync", // Sincronizar Capacitor
"cap:open:android": "npx cap open android", // Abrir Android Studio
"android:build": "npm run build && npx cap sync && npx cap open android",
"android:apk": "npm run build && npx cap sync"
}- Validação de Dados: Zod schemas em todos os formulários
- Autenticação: Firebase Authentication com tokens JWT
- Regras do Firestore: (Devem ser configuradas no Firebase Console)
- HTTPS: Todas as comunicações via HTTPS
- Sanitização: Validação de inputs antes de salvar no banco
- Configurar regras de segurança no Firestore
- Implementar rate limiting
- Validar permissões no backend
- Usar variáveis de ambiente para credenciais sensíveis
- Notificações push
- Moderação de conteúdo
- Dashboard administrativo
- Relatórios e estatísticas
- Integração com órgãos públicos
- Sistema de recompensas
- Compartilhamento em redes sociais
- Modo offline
- Cache de imagens
- Filtros avançados (por categoria, data, localização)
- Busca de ocorrências
- Edição de ocorrências próprias
- Exclusão de ocorrências
O projeto inclui vários arquivos de documentação:
FIREBASE_SETUP.md- Guia de configuração do FirebaseMAPBOX_SETUP.md- Guia de configuração do MapboxANDROID_BUILD_GUIDE.md- Guia de build para AndroidANDROID_PERMISSIONS.md- Configuração de permissões AndroidQUICK_START_APK.md- Guia rápido para gerar APKREPORT_INCIDENT_GUIDE.md- Guia de uso da funcionalidade de relatoREPORT_DETAIL_GUIDE.md- Guia da tela de detalhesSPLASH_ICON_SETUP.md- Configuração de ícone e splash screen
Jefferson Fonseca
Este projeto foi desenvolvido para fins acadêmicos.
- Ionic Framework - Framework UI mobile
- Firebase - Backend como serviço
- Supabase - Plataforma de backend
- Mapbox - Serviços de mapas
- React - Biblioteca JavaScript
- Comunidade Open Source - Por todas as bibliotecas utilizadas
Para dúvidas ou sugestões sobre o projeto, entre em contato através do repositório.
Última atualização: Dezembro 2024