6.6 KiB
6.6 KiB
MeowSpool Mobile — TODO
Última atualização: 14/03/2026
Crítico — Funcionalidades Quebradas
Auth
-
Reset de senha não executado (
app/(auth)/reset-password.tsx)onSubmitapenas fazconsole.loge navega parapassword-reset-doneresetPasswordUseCasejá existe emsrc/infrastructure/container.ts- Chamar
resetPasswordUseCase.execute({ token, newPassword })no submit - O
tokendeve ser lido dos params de navegação (vindo do deep link do email) - Exibir
Alert.alertem caso de erro da API
-
Verificar email — sem resend (
app/(auth)/verify-email.tsx)- Tela é puramente estática
- Adicionar botão "Reenviar código"
- Criar
ResendVerificationUseCaseou reutilizarforgotPasswordUseCaseconforme API - Exibir feedback de sucesso/erro no reenvio
Filtros de Inventário — Desconexão Store/Lista
inventory.tsxnão consome oactiveFilterdo store (app/(app)/(tabs)/inventory.tsx)filters.tsxsalva corretamente emfilamentStore.setFilter()inventory.tsxfiltra o array local com estado interno, ignorandoactiveFilterpor completo- Refatorar: ler
activeFilterdo store e aplicar junto com a busca local - Ou: ao fechar
filters.tsx, dispararlistFilamentsUseCase.execute()com os filtros ativos
Médio — Funcionalidades Incompletas
Google OAuth
- Login com Google é stub (
app/(auth)/login.tsx)- Botão navega direto para
/(app)/(tabs)/homesem nenhuma autenticação real - Instalar e configurar
expo-auth-session+expo-web-browser - Obter
id_tokendo Google viaAuthSession.startAsync - Chamar
googleLoginUseCase.execute({ idToken })(use case já existe emcontainer.ts) - Configurar
GOOGLE_CLIENT_IDem.enveapp.json
- Botão navega direto para
Exportar Etiqueta SVG
- Botão de exportar é stub (
app/(app)/filaments/[id]/label.tsx)- Botão "Exportar SVG" exibe apenas um
Alert.alertinformativo - Chamar
GET /filaments/:id/label.svg?width_mm=W&height_mm=HviahttpClient - Usar
expo-file-systempara salvar o SVG localmente - Usar
expo-sharingpara abrir o sheet de compartilhamento nativo - Passar
width_mmeheight_mmconforme o tamanho selecionado na UI
- Botão "Exportar SVG" exibe apenas um
QR Code — Copiar Link
- "Copiar link" exibe Alert em vez de copiar (
app/(app)/filaments/[id]/qrcode.tsx)- Instalar
expo-clipboard(ou usar@react-native-clipboard/clipboard) - Substituir o
Alert.alertporClipboard.setStringAsync(deepLink) - Exibir feedback visual breve (toast ou mudança de ícone por 2s)
- Instalar
Perfil — Trocar Email / Senha
- Botões de edição sem navegação (
app/(app)/(tabs)/profile.tsx)- Botões "Trocar email" e "Trocar senha" existem na UI mas não navegam para nenhuma tela
- Criar telas
app/(app)/profile/change-email.tsxeapp/(app)/profile/change-password.tsx - Chamar
PUT /users/me(quando backend implementarupdate_me_handler)
Baixo — UX / Qualidade
-
Sort de filamentos sem ação (
app/(app)/(tabs)/inventory.tsx)- Botão de sort está renderizado mas não tem
onPresscom lógica - Implementar seleção de ordem:
net_weight_asc,net_weight_desc,created_at_desc - Passar
sortcomo parâmetro nolistFilamentsUseCase.execute() - Ou ordenar o array local sem nova chamada à API
- Botão de sort está renderizado mas não tem
-
Tipos
Dashboard.tsusados emHomeScreen(app/(app)/(tabs)/home.tsx)src/domain/Dashboard.tsdefineDashboardData,MaterialSummary, etc.HomeScreencalcula tudo inline sem usar esses tipos- Refatorar para tipar explicitamente os dados computados com as interfaces do domínio
- Opcional: criar
DashboardUseCaseque chamaGET /dashboarde retornaDashboardData
Arquitetura — Offline-First (Fase Futura)
A infraestrutura está parcialmente preparada. Os itens abaixo compõem a implementação completa:
-
SyncService— classe que drena async_queuee envia para a API- Criar
src/application/sync/SyncService.ts - Ler linhas de
sync_queueondesynced = 0 - Para cada item: chamar o use case correspondente (create/update/delete)
- Em sucesso: marcar
synced = 1na tabela de origem e deletar dasync_queue - Em conflito 409: aplicar last-write-wins (aceitar versão do servidor, atualizar local)
- Criar
-
Registrar background task (
src/infrastructure/backgroundSync.ts— novo arquivo)- Instalar
expo-background-fetch+expo-task-manager - Registrar task
BACKGROUND_SYNCcomTaskManager.defineTask - Chamar
SyncService.sync()dentro da task - Registrar com
BackgroundFetch.registerTaskAsync(intervalo mínimo: 15min)
- Instalar
-
Injetar adapters locais no container (
src/infrastructure/container.ts)- Substituir
ApiFilamentRepositorypor wrapper que escreve no SQLite e enfileira nasync_queue - Substituir
ApiSpoolPresetRepositoryporLocalSpoolPresetRepository LocalSpoolPresetRepository.upsertSystemPresets()já existe para sincronizar presets do sistema
- Substituir
-
Modo offline — fallback na leitura
- Ao detectar ausência de rede (
NetInfo), usarLocalFilamentRepositorycomo fonte de leitura - Exibir badge "Offline" no header quando sem conexão
- Ao detectar ausência de rede (
Testes
- Configurar Jest + Testing Library (
@testing-library/react-native) - Testes unitários para use cases (
CreateFilamentUseCase, cálculo de net weight) - Testes de integração para stores Zustand
- Testes de snapshot para componentes
FilamentCard,StockBar,Badge - Mock de
httpClientpara testes de repositórios remotos
Referência Rápida — Arquivos por Área
| Área | Arquivo |
|---|---|
| Login / Google OAuth | app/(auth)/login.tsx |
| Reset de senha | app/(auth)/reset-password.tsx |
| Verificar email | app/(auth)/verify-email.tsx |
| Lista de inventário + filtros + sort | app/(app)/(tabs)/inventory.tsx |
| Filtros (bottom sheet) | app/(app)/inventory/filters.tsx |
| Etiqueta SVG | app/(app)/filaments/[id]/label.tsx |
| QR Code | app/(app)/filaments/[id]/qrcode.tsx |
| Perfil | app/(app)/(tabs)/profile.tsx |
| DI Container | src/infrastructure/container.ts |
| DB local / schema | src/adapters/local/database.ts |
| Domínio Dashboard | src/domain/Dashboard.ts |