Kontas é um aplicativo mobile para gestão financeira colaborativa em repúblicas e moradias compartilhadas. Ele permite que moradores organizem contas coletivas, acompanhem pagamentos individuais e gerenciem quem divide cada despesa — tudo em um único lugar.
O app oferece um painel por república com abas de resumo financeiro, contas e moradores. O administrador da república pode confirmar pagamentos, enviar convites por e-mail e acompanhar convites enviados. Os moradores acompanham suas obrigações, marcam pagamentos como realizados e consultam os dados de contato e a chave Pix dos demais moradores na aba de moradores.
✔️ Login com Google (OAuth)
✔️ Persistência segura de sessão (Expo SecureStore)
✔️ Validação automática de sessão ao iniciar o app
✔️ Logout com limpeza local e encerramento da sessão no Google Sign-In
✔️ Fluxo de onboarding com introdução ao app
✔️ Controle de perfil incompleto com redirecionamento
✔️ Atualização de dados (nome, telefone, chave Pix)
✔️ Seleção de foto de perfil pela galeria
✔️ Acesso a Termos de Uso e Política de Privacidade
✔️ Criação, edição e exclusão de repúblicas
✔️ Listagem de repúblicas do usuário
✔️ Estrutura em abas: Contas • Moradores • Resumo
✔️ Envio de convites por e-mail
✔️ Caixa de entrada de convites
✔️ Visualização de convites enviados por república
✔️ Aceite e recusa
✔️ Navegação padronizada nas telas de convites
✔️ Listagem de moradores por república
✔️ Exibição de dados (e-mail, telefone, Pix)
✔️ Cópia rápida da chave Pix com feedback visual (ícone de sucesso/erro)
✔️ Redirecionamento para contato (WhatsApp/telefone) direto do card
✔️ Controle de permissões (ADMIN / USER)
✔️ Cadastro de contas compartilhadas com navegação por abas (dados da conta / seleção de moradores)
✔️ Associação de moradores às contas
✔️ Divisão igualitária ou com valores customizados por morador
✔️ Cálculo automático de distribuição igualitária com valores customizados que respeitam o total
✔️ Filtro por mês de referência
✔️ Separação entre contas pendentes e pagas
✔️ Menu contextual por toque longo no card da conta
✔️ Cópia da chave Pix diretamente do card da conta com feedback visual
✔️ Remoção de contas com restrição por perfil (ADMIN)
✔️ Marcação e remoção de contas (com undo)
✔️ Restauração de contas deletadas (undo estendido)
✔️ Seleção de método de pagamento (PIX, Cartão, Dinheiro) na criação da conta
✔️ Resumo financeiro por república:
-
Total geral
-
Total pago
-
Total pendente
-
Dívida por morador
✔️ Status da conta: PENDENTE, PAGA e ATRASADA
✔️ Fluxo de status do pagamento por morador: PENDENTE → AGUARDANDO_CONFIRMACAO → PAGO
✔️ Confirmação de pagamentos pelo admin
✔️ Filtros por status para gestão
O projeto segue arquitetura orientada a domínios (feature-based), onde cada domínio de negócio vive de forma isolada dentro de src/features/.
src/
├── app/ # Rotas file-based com Expo Router
│ ├── (auth)/ # Login, onboarding, checkEmail
│ ├── (republics)/[id]/ # República com abas dinâmicas
│ ├── (userProfile)/ # Perfil, convites, cadastro de república
│ ├── privacy-policy.tsx # Tela de política de privacidade
│ └── terms-of-use.tsx # Tela de termos de uso
│
├── features/
│ ├── auth/ # Autenticação, contexto de sessão, Google Sign-In
│ ├── republic/ # CRUD de repúblicas, contexto de listagem
│ ├── residents/ # Listagem e detalhes de moradores
│ ├── invites/ # Envio, recebimento e gestão de convites
│ ├── accounts/ # Contas compartilhadas e pagamentos
│ ├── legal/ # Exibição de termos de uso e política de privacidade
│ └── user/ # Perfil, edição de dados e listagem de repúblicas
│
├── hooks/ # Hooks globais (useAppReady, useAppFonts)
├── lib/ # Inicialização de libs externas (Sentry, Google Sign-In, Fonts)
├── providers/ # AppProviders — composição centralizada de providers
│
├── services/
│ ├── api.ts # Axios com bearer token via SecureStore, timeout, circuit breaker e interceptors
│ ├── httpError.ts # Normalização de erros HTTP
│ └── queryClient.ts # Configuração global do React Query
│
└── shared/
├── components/ # ScreenLayout, SideMenu, ContextMenu, Tabs, error boundaries, UI base
│ └── ui/ # Componentes base: Button, Input, LoadingScreen, EmptyState, etc.
├── constants/ # Conteúdo legal, configurações de feedback de cópia Pix
├── contexts/ # RefreshContext para coordenação global de recargas
├── hooks/ # Hooks compartilhados (useCopyFeedback, useComponentLogger, etc.)
├── types/ # Tipos globais (Resident, Resume, assets)
└── utils/ # Formatação (BRL), máscaras (moeda, telefone), logger, toasts
O projeto conta com uma biblioteca de componentes reutilizáveis:
| Componente | Descrição |
|---|---|
ScreenLayout |
Layout padrão de tela com header configurável |
ContextMenu |
Menu contextual com posicionamento dinâmico |
Tabs |
Navegação por abas com indicador animado |
ErrorBoundary |
Captura e tratamento de erros por rota |
LoadingScreen |
Tela de carregamento com mensagem |
EmptyState |
Estado vazio com ícone e mensagem |
NextButton |
Botão primário com ações next/cancel |
Header |
Header padrão com título e ações opcionais |
Toast |
Notificações via Sonner Native |
Cada feature segue a mesma estrutura interna:
features/<domínio>/
├── screens/ # Componentes de tela (conectam tudo)
├── components/ # UI específica do domínio
├── hooks/ # Lógica de estado e efeitos colaterais
├── services/ # Chamadas à API
├── types/ # Tipagem do domínio
├── utils/ # Utilitários do domínio (formatação, validação, helpers)
├── constants/ # Constantes do domínio
└── contexts/ # Contexto React quando necessário
O app usa Expo Router com rotas file-based e grupos de layout.
/(auth)/login → /(auth)/onboarding → /(userProfile)/profile
| Condição | Destino |
|---|---|
| Carregando sessão | LoadingScreen |
| Sem usuário | /(auth)/login |
| Perfil incompleto | /(auth)/onboarding |
Com republicData em cache local |
/(republics)/[rep.id] |
| Sem república | /(userProfile)/profile |
Hoje, o redirecionamento automático para uma república depende do cache local republic-data. Sem esse dado salvo, o fluxo segue para /(userProfile)/profile.
/(userProfile)/profile— hub principal com listagem de repúblicas/(userProfile)/invites— caixa de entrada de convites/(userProfile)/register/republic— cadastro de nova república
/(republics)/[id]— tela principal com abas (Contas / Moradores / Resumo)/(republics)/[id]/invites-sent— convites enviados para a república/(republics)/[id]/payments— confirmação de pagamentos (admin)
git clone https://github.com/warlleyrocha/kontas
cd kontasnpm installO projeto usa variáveis de ambiente sincronizadas pelo EAS. Para desenvolvimento local, gere o arquivo .env com:
eas env:pull --environment development --path .envO app.config.ts carrega .env automaticamente quando o app roda no dev server. Se estiver usando backend local no Android Emulator, mantenha EXPO_PUBLIC_API_URL=http://10.0.2.2:3333.
O app usa plugins nativos (Google Sign-In, Image Picker), então é necessário usar um Development Build ou build nativa local — o Expo Go não é suportado.
# Inicia o servidor Expo com dev-client
npm run dev
# Abre diretamente no emulador Android
npm run android
# Abre no simulador iOS
npm run ios| Script | O que faz |
|---|---|
npm run start |
Inicia o servidor Expo |
npm run dev |
Inicia com dev-client |
npm run android |
Build e abre no Android |
npm run ios |
Build e abre no iOS |
npm run web |
Servidor web com Metro |
npm run lint |
Executa o ESLint |
npm run lint:biome |
Executa o Biome em modo de verificação |
npm run fix:biome |
Corrige verificações do Biome |
npm run format |
Formata o código com Biome |
npm test |
Roda o Jest em modo watch |
npm run test:coverage |
Gera cobertura de testes |
npm run sonar:scan |
Executa cobertura + scanner SonarQube |
npm run reset-project |
Reseta o template Expo base (script destrutivo) |
Perfis definidos em eas.json. As variáveis de ambiente (incluindo EXPO_PUBLIC_API_URL) são gerenciadas pelo EAS Environments — não há valores hardcoded nos perfis de build.
| Perfil | Distribuição | Ambiente EAS |
|---|---|---|
development |
Interna (dev client) | development |
preview |
Interna (APK) | preview |
production |
App Store / Play Store | production |
# Build de preview para Android
eas build --platform android --profile preview
# Build de produção para iOS
eas build --platform ios --profile productionO backend é hospedado no Railway: https://kontas-back-end-production.up.railway.app
Repositório da API: https://github.com/Ameglebm/kontas-back-end
- Bearer token automático — injeta o JWT (armazenado via SecureStore) em toda requisição autenticada
- Circuit breaker — abre após 3 falhas consecutivas, fecha após 10 segundos
- Timeout — 10 segundos por requisição
- Logs HTTP — integração com o logger estruturado do app
- Normalização de erros — mensagens amigáveis independente do formato da API
- Compatibilidade com payloads nulos/opcionais — a UI trata campos como
nome,fotoPerfil,telefone,chavePixemetodoPagamentoconforme o retorno atual da API
| Domínio | Endpoints |
|---|---|
| Auth | POST /auth/google, POST /auth/completar-dados |
| Usuário | GET /usuarios/me, PATCH /usuarios/atualizar-perfil |
| Repúblicas | GET/POST /republicas, GET/PATCH/DELETE /republicas/:id |
| Moradores | GET /moradores/republica/:id |
| Convites | POST /convites, GET /convites/me, GET /convites/republica/:id, PATCH /convites/:id |
| Contas | POST /contas, GET /contas/republica/:id, PATCH/DELETE /contas/:id, PATCH /contas/:id/restaurar |
| Pagamentos | POST /contas-moradores, GET /contas-moradores/conta/:id, GET /contas-moradores/morador/:id, PATCH /contas-moradores/:id/pagar, PATCH /contas-moradores/:id/confirmar |
- Sentry — rastreamento de erros e crashes em tempo real
- Error boundary global — evita que erros derrubem toda a UI
- Error boundaries por rota — isolamento de falhas por domínio de navegação
- Toasts padronizados — via Sonner Native para feedback de sucesso e erro
- Logger estruturado — centraliza logs e breadcrumbs usados pelo app
- React Query — cache e sincronização de estado do servidor com stale-while-revalidate
- Jest + Testing Library — cobertura ampla cobrindo rotas, hooks, serviços, componentes, contextos, utilitários e configuração do app
- Biome — formatação e lint unificados
- SonarQube local — via Docker Compose para análise estática
# Sobe o SonarQube localmente
docker compose up --build
# Roda o scanner
npm run sonar:scan📝 A rota /(auth)/checkEmail existe como tela isolada, mas não participa do fluxo principal de autenticação.
📝 O menu contextual da conta possui a ação de edição comentada aguardando implementação do endpoint de atualização.
📝 Para CI e cobertura de testes, prefira npm run test:coverage, já que npm test roda em modo watch.
| Tecnologia | Uso |
|---|---|
| Expo | Plataforma de build e runtime |
| React Native | Framework mobile |
| TypeScript | Tipagem estática |
| Expo Router | Navegação file-based |
| NativeWind | Tailwind CSS para React Native |
| React Query | Gerenciamento de estado do servidor |
| Axios | Cliente HTTP com interceptors |
| React Native Reanimated | Animações nativas |
| Google Sign-In | Autenticação OAuth |
| Expo SecureStore | Armazenamento seguro de credenciais |
| Sentry | Rastreamento de erros |
| EAS | Build e distribuição |
| Sonner Native | Toasts e notificações |
| Expo Haptics | Feedback tátil |
| Expo Image Picker | Seleção de imagens da galeria |
| Expo Clipboard | Cópia para área de transferência |
| Biome | Lint e formatação de código |
| Jest | Testes unitários e de integração |
![]() Warlley Rocha |
|---|
Este projeto possui licença proprietária. Consulte LICENSE para os termos completos de uso, distribuição e restrições. Copyright (c) 2026 Éden. Todos os direitos reservados.
