O TechFinance App é uma aplicação mobile desenvolvida com React Native e Expo que consome a TechFinance API para fornecer insights empresariais através de uma interface intuitiva e moderna. O app inclui funcionalidades de cache offline, autenticação local e um assistente virtual (Dinho Bot) para análise de dados.
- Versão: 1.0.0
- Plataforma: React Native (iOS/Android/Web)
- Framework: Expo SDK 52
- Linguagem: TypeScript
- Estado Global: Zustand
- Estilização: NativeWind (Tailwind CSS)
// src/config/env.ts
export const env = {
OPENAI_API_KEY: 'sk-proj-...', // Chave da OpenAI para o chat bot
API_BASE_URL: 'https://techfinance-api.fly.dev/', // URL base da API
API_TOKEN: 'ronaldo' // Token de autenticação
};// src/lib/api.ts
export const api = axios.create({
baseURL: env.API_BASE_URL,
headers: {
'Authorization': `Bearer ${env.API_TOKEN}`
},
});- Screens/Pages (
src/app/): Telas da aplicação usando Expo Router - Components (
src/components/): Componentes reutilizáveis - Hooks (
src/hooks/): Lógica de estado e side effects - Repositories (
src/repositories/): Camada de acesso aos dados da API - Services (
src/services/): Serviços externos (OpenAI) - Models (
src/models/): Interfaces TypeScript - Utils (
src/utils/): Funções utilitárias
- Zustand: Store global para autenticação, cache e conectividade
- AsyncStorage: Persistência local de dados
- Cache offline: Dados ficam disponíveis sem conexão
// src/repositories/product.repository.ts
export interface ProductQuerySchema {
nome?: string;
categoria?: string;
limite?: number;
pagina?: number;
}
export class ProductRepository {
async search(query: ProductQuerySchema): Promise<Product[]>
}Endpoints utilizados:
GET /produtos- Busca produtos com filtros
// src/repositories/customer.repository.ts
export class CustomerRepository {
async search(query: any): Promise<Customer[]>
async fetchResumo(): Promise<ResumoAtraso>
}Endpoints utilizados:
GET /clientes- Busca clientesGET /contas_receber/resumo- Resumo de contas a receber
// src/repositories/sales.repository.ts
export class SalesRepository {
async getSales(query: SalesQuerySchema): Promise<Sales[]>
async getTopProductsByQuantity(query: SalesQuerySchema): Promise<TopProducts[]>
async getTopProductsByValue(query: SalesQuerySchema): Promise<TopProducts[]>
async getPriceVariation(query: SalesQuerySchema): Promise<TopProducts[]>
async getCompanyParticipation(query: SalesQuerySchema): Promise<CompanyParticipation[]>
async getCompanyParticipationByValue(query: SalesQuerySchema): Promise<CompanyParticipationByValue[]>
}Endpoints utilizados:
GET /vendas- Lista vendasGET /produtos/mais-vendidos- Produtos mais vendidos por quantidadeGET /produtos/maior-valor- Produtos com maior valorGET /produtos/variacao-preco- Variação de preçosGET /empresas/participacao- Participação por quantidadeGET /empresas/participacao-por-valor- Participação por valor
// src/hooks/useAuth.ts
interface AuthState {
isAuthenticated: boolean;
user: { email: string; name: string } | null;
login: (email: string, password: string) => Promise<boolean>;
logout: () => Promise<void>;
}Funcionalidades:
- Autenticação local (admin/admin)
- Persistência no AsyncStorage
- Estado global de autenticação
// src/hooks/useCache.ts
interface CacheState {
products: any[];
customers: any[];
sales: any[];
titles: any[];
setProducts: (products: any[]) => void;
setCustomers: (customers: any[]) => void;
setSales: (sales: any[]) => void;
setTitles: (titles: any[]) => void;
clearCache: () => void;
}Funcionalidades:
- Cache local de dados da API
- Funcionamento offline
- Sincronização automática
// src/hooks/useConnection.ts
interface ConnectionState {
isOnline: boolean;
lastSync: string | null;
setOnline: (status: boolean) => void;
setLastSync: (date: string) => void;
}Funcionalidades:
- Monitor de conectividade
- Timestamp da última sincronização
- Fallback para dados em cache
// src/hooks/useApi.ts
export function useApi() {
const fetchWithCache = async <T>(endpoint: string, options?: AxiosRequestConfig): Promise<T>
}Funcionalidades:
- Requisições HTTP com fallback para cache
- Atualização automática do status de conectividade
- Sincronização inteligente de dados
// src/models/product.ts
export interface Product {
codigo: string;
descricao_produto: string;
descricao_grupo: string;
id_grupo: string;
id_produto: string;
nome_porduto: string;
}// src/models/customer.ts
export interface Customer {
id_cliente: number;
razao_cliente: string;
nome_fantasia: string;
cidade: string;
uf: string;
id_grupo: string;
descricao_grupo: string;
}// src/models/sales.ts
export interface Sales {
idVenda: number;
dataEmissao: string;
tipo: number;
descricaoTipo: string;
idCliente: number;
razaoCliente: string;
nomeFantasia: string;
// ... outros campos
}// src/services/openai.service.ts
export class OpenAIService {
async sendMessage(prompt: string, addToUI?: boolean): Promise<void>
async sendImageMessage(prompt: string, imageUri: string): Promise<void>
}Funcionalidades:
- Chat com IA usando OpenAI
- Análise de imagens
- Histórico de conversas
- Interface de mensagens
src/app/
├── _layout.tsx # Layout raiz
├── index.tsx # Tela de login
├── home.tsx # Dashboard principal
├── chat/
│ └── index.tsx # Chat com Dinho Bot
├── customer/
│ ├── index.tsx # Lista de clientes
│ └── details.tsx # Detalhes do cliente
├── product/
│ ├── index.tsx # Lista de produtos
│ └── productdetails.tsx # Detalhes do produto
├── reports/
│ ├── index.tsx # Menu de relatórios
│ ├── customers.tsx # Relatório de clientes
│ ├── products.tsx # Relatório de produtos
│ ├── sales.tsx # Relatório de vendas
│ └── ... # Outros relatórios
└── sales/
└── index.tsx # Vendas
O aplicativo funciona offline utilizando:
- AsyncStorage para persistência
- Zustand para gerenciamento de estado
- Fallback automático para dados em cache
- Sincronização quando a conexão retorna
- Autenticação local (não integrada com backend)
- Credenciais:
admin/admin - Persistência da sessão
- Proteção de rotas
- Integração com OpenAI GPT
- Análise de dados empresariais
- Upload e análise de imagens
- Interface de chat em tempo real
- NativeWind para estilização
- Design adaptativo para mobile e web
- Componentes reutilizáveis
- Tema consistente
- Node.js 18+
- Expo CLI
- Android Studio (para Android)
- Xcode (para iOS)
# Clone o repositório
git clone <repository_url>
cd app
# Instale as dependências
npm install
# Configure as variáveis de ambiente
# Edite app.config.ts com suas chaves
# Execute o projeto
npm startnpm start # Inicia o servidor de desenvolvimento
npm run android # Executa no Android
npm run ios # Executa no iOS
npm run web # Executa no navegador
npm run export # Build para produção- expo: ^52.0.11 - Framework principal
- react-native: 0.76.2 - Runtime mobile
- expo-router: ~4.0.7 - Roteamento baseado em arquivos
- zustand: ^5.0.1 - Gerenciamento de estado
- axios: ^1.7.7 - Cliente HTTP
- zod: ^3.23.8 - Validação de schemas
- nativewind: ^4.1.23 - Tailwind CSS para React Native
- expo-linear-gradient: ~14.0.1 - Gradientes
- @expo/vector-icons: ^14.0.3 - Ícones
- @google/generative-ai: ^0.21.0 - OpenAI (alternativa)
- expo-image-picker: ~16.0.2 - Seleção de imagens
- react-native-markdown-display: ^7.0.2 - Renderização de Markdown
{
"android": {
"package": "br.com.techfinance.app",
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
}
}{
"ios": {
"bundleIdentifier": "com.techfinance.app",
"supportsTablet": true
}
}-
Erro de conexão com API
- Verificar
API_BASE_URLemsrc/config/env.ts - Confirmar se a API backend está rodando
- Validar token de autenticação
- Verificar
-
Problemas de cache
- Limpar AsyncStorage: usar
clearCache()do useCache - Reiniciar o app com
expo start --clear
- Limpar AsyncStorage: usar
-
Erro do OpenAI
- Verificar
OPENAI_API_KEYválida - Confirmar limites de uso da API
- Verificar
-
Build errors
- Limpar cache:
expo start --clear - Reinstalar dependências:
rm -rf node_modules && npm install
- Limpar cache:
- Console logs em desenvolvimento
- Error boundary para captura de erros
- Logs de sincronização de dados
- Lazy loading de telas
- Otimização de imagens com expo-image
- Cache inteligente de dados
- Debounce em pesquisas
- Tokens sensíveis em variáveis de ambiente
- Validação de dados com Zod
- Sanitização de inputs
- Timeout em requisições HTTP
- Chaves API não expostas no código
- Dados cacheados criptografados no AsyncStorage
- Autenticação local para desenvolvimento
- Autenticação integrada com backend
- Notificações push
- Sincronização em background
- Temas claro/escuro
- Exportação de relatórios
- Modo offline melhorado
- Analytics de uso
- Code splitting por rota
- Lazy loading de componentes
- Compressão de imagens
- Prefetch de dados críticos