Skip to content

Latest commit

 

History

669 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Kontas

Tópicos

🔹 Descrição do projeto

🔹 Funcionalidades

🔹 Arquitetura

🔹 Navegação

🔹 Pré-requisitos

🔹 Como rodar a aplicação

🔹 Build e distribuição

🔹 Integração com API

🔹 Qualidade e observabilidade

🔹 Pontos de atenção

🔹 Tecnologias utilizadas

🔹 Desenvolvedor


Descrição do projeto

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.


Funcionalidades

Autenticação e sessão

✔️ 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

Perfil e onboarding

✔️ 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

Gestão de Repúblicas

✔️ Criação, edição e exclusão de repúblicas

✔️ Listagem de repúblicas do usuário

✔️ Estrutura em abas: Contas • Moradores • Resumo

Sistema de Convites

✔️ 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

Gestão de Moradores

✔️ 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)

Contas e pagamentos

✔️ 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

Controle Financeiro

✔️ Resumo financeiro por república:

  • Total geral

  • Total pago

  • Total pendente

  • Dívida por morador

Fluxo de contas e pagamentos

✔️ Status da conta: PENDENTE, PAGA e ATRASADA

✔️ Fluxo de status do pagamento por morador: PENDENTEAGUARDANDO_CONFIRMACAOPAGO

✔️ Confirmação de pagamentos pelo admin

✔️ Filtros por status para gestão


Arquitetura

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

Componentes compartilhados (src/shared/components/)

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

Navegação

O app usa Expo Router com rotas file-based e grupos de layout.

Fluxo de autenticação

/(auth)/login → /(auth)/onboarding → /(userProfile)/profile

Redirecionamento inicial (app/index.tsx)

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.

Rotas de perfil

  • /(userProfile)/profile — hub principal com listagem de repúblicas
  • /(userProfile)/invites — caixa de entrada de convites
  • /(userProfile)/register/republic — cadastro de nova república

Rotas da 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)

Pré-requisitos

⚠️ Node.js 18+

⚠️ Expo CLI

⚠️ EAS CLI

⚠️ Android Studio (para emulador Android) e/ou Xcode (para simulador iOS)

⚠️ Backend da API em execução (local ou Railway)


Como rodar a aplicação ▶️

1. Clone o repositório

git clone https://github.com/warlleyrocha/kontas
cd kontas

2. Instale as dependências

npm install

3. Puxe as variáveis de ambiente com EAS

O projeto usa variáveis de ambiente sincronizadas pelo EAS. Para desenvolvimento local, gere o arquivo .env com:

eas env:pull --environment development --path .env

O 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.

4. Execute

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

Scripts disponíveis

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)

Build e distribuição

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 production

Integração com API

O backend é hospedado no Railway: https://kontas-back-end-production.up.railway.app

Repositório da API: https://github.com/Ameglebm/kontas-back-end

Camada HTTP (src/services/api.ts)

  • 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, chavePix e metodoPagamento conforme o retorno atual da API

Endpoints consumidos

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

Qualidade e observabilidade

  • 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

Pontos de atenção

📝 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.


Documentos legais


Tecnologias utilizadas 📚

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

Desenvolvedor


Warlley Rocha

Licença

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.

About

Um aplicativo para gestão financeira de repúblicas e moradia compartilhada, desenvolvido com React Native e Expo. O Kontas facilita o controle de contas, divisão de despesas e gerenciamento de moradores.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages