Aplicativo React Native (Expo) para controle de entrada e saída de produtos com manifesto, geração de relatórios
demo.mp4
| Tecnologia | Uso |
|---|---|
| Expo + expo-router | Framework e navegação baseada em arquivos |
| React Native Paper | Componentes de UI (Material Design) |
| Zustand | Gerenciamento de estado global |
| React Hook Form + Zod | Formulários com validação de schema |
| AsyncStorage | Persistência local dos dados |
| expo-local-authentication | Autenticação biométrica (mobile) |
| expo-print + expo-sharing | Geração e compartilhamento de PDF |
| expo-file-system | Geração de arquivos CSV |
| NativeWind + Tailwind CSS | Estilização utilitária |
app/
├── (tabs)/
│ ├── _layout.tsx # Tab bar com 3 abas
│ ├── index.tsx # Aba: Manifesto (formulário)
│ ├── products.tsx # Aba: Produtos (lista + filtros)
│ └── settings.tsx # Aba: Configurações (perfil + auth)
├── _layout.tsx # Layout raiz (Stack)
├── index.tsx # Redireciona para /(tabs)
└── +not-found.tsx # Tela 404
src/
├── components/
│ └── AuthGuard.tsx # Guarda de autenticação (biometria/senha)
├── store/
│ ├── manifest.ts # Store Zustand dos produtos
│ └── auth.ts # Store Zustand de autenticação
├── services/
│ └── db.ts # Serviço de banco de dados (SQLite, reservado)
└── view/
└── ManifestFormScreen.tsx # Tela legada (referência)
Formulário para registrar a entrada ou saída de um produto no manifesto.
Campos:
- Nome do produto
- Lote
- Unidade
- Responsável
- Data de hoje
- Validade (
YYYY-MM-DD) - Tipo: Entrada / Saída
- Observações (opcional)
Ao submeter, o produto é salvo no store global (Zustand) e persistido via AsyncStorage.
Lista todos os produtos cadastrados com filtros e ações de exportação.
Filtros disponíveis (via Chips):
| Filtro | Ordenação |
|---|---|
| Últimos adicionados | Por createdAt decrescente |
| Data de vencimento | Por validade crescente |
| Dias restantes | Por dias para vencer crescente |
Indicador de urgência por cor:
| Cor | Critério |
|---|---|
| 🔘 Cinza | Mais de 35 dias para vencer |
| 🟢 Verde | 26 a 35 dias para vencer |
| 🟡 Amarelo | 16 a 25 dias para vencer |
| 🔴 Vermelho | 15 dias ou menos / vencido |
Ações:
- Remover produto individualmente
- Exportar lista como PDF (via
expo-print) - Exportar lista como CSV (via
expo-file-system) - Limpar todos os produtos
Gerenciamento do perfil do usuário e método de autenticação.
Opções:
- Definir nome de exibição
- Criar ou alterar senha (mínimo 4 caracteres)
- Ativar/desativar autenticação biométrica (apenas mobile, se o hardware suportar)
- Botão para sair / bloquear o app
O componente AuthGuard envolve toda a navegação por tabs e controla o acesso ao app.
Comportamento por plataforma:
| Plataforma | Comportamento |
|---|---|
| Mobile (iOS/Android) | Tenta biometria automaticamente se habilitada. Fallback para senha |
| Web | Exibe campo de senha diretamente |
| Sem configuração | Permite entrada sem senha e orienta o usuário a configurar |
A senha é armazenada como hash simples via AsyncStorage. A biometria usa expo-local-authentication.
# Instalar dependências
yarn install
# Iniciar em modo desenvolvimento
yarn start
# Android
yarn android
# iOS
yarn ios
# Web
yarn web| Script | Descrição |
|---|---|
yarn start |
Inicia o servidor Expo com cache limpo |
yarn android |
Roda no Android |
yarn ios |
Roda no iOS |
yarn web |
Roda no navegador |
yarn lint |
Verifica lint e formatação |
yarn format |
Corrige lint e formata o código |
yarn prebuild |
Gera código nativo (Android/iOS) |
O projeto está configurado com EAS Build via eas.json.
| Perfil | Descrição |
|---|---|
development |
Build de desenvolvimento com DevClient |
preview |
Build interno para testes |
production |
Build de produção com auto-increment de versão |
# Build de preview
eas build --profile preview --platform android
# Build de produção
eas build --profile production --platform all