Sub-projeto 7: tela principal - #11
Open
lucasjosee wants to merge 9 commits into
Open
lucasjosee wants to merge 9 commits into
lucasjosee wants to merge 9 commits into
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Sub-projeto 7 de 7 — o último. A tela principal vira o resumo do app, e as duas telas que existiam sem porta de entrada passam a ser alcançáveis.
Spec:
CropAI-docs/especificacoes/2026-09-14-tela-principal-design.mdPlano:
CropAI-docs/planos/2026-09-14-tela-principal.mdLedger:
CropAI-docs/historico/execucoes/2026-09-14-tela-principal-ledger.mdBackend não muda.
git diff -- backend/é vazio. Nenhuma tabela, nenhuma migração, nenhum endpoint.O que este PR fecha
app/index.tsxera a única tela que a reformulação não tinha tocado. 763 linhas mostrando um mundo que deixou de existir: duas abas — "Meus Diagnósticos", lendofila_diagnosticoscomSELECT *cru dentro da tela, e "Enciclopédia de Doenças" —, uma busca, um botão de mock de desenvolvimento, e uma barra inferior que não era navegação: trêsTouchableOpacityfazendorouter.push, com "Catálogo" fixo como aba ativa.Depois do sub-projeto 3, toda foto vira conversa. Isso tornou a aba "Meus Diagnósticos" uma segunda leitura pior da mesma informação — sem o que a IA respondeu, sem o que o produtor perguntou depois. Ela some sem substituta.
E duas telas prontas não tinham porta nenhuma:
/mapa, construída inteira no sub-projeto 6, era inalcançável pela interface.A Home
Dois blocos de resumo e um botão. Conversas recentes, contagem do mapa, Analisar.
O bloco do mapa é contagem, não
MapView, e isso foi decisão de risco. A chave do Google Maps para Android não está provisionada, e a falha é silenciosa — o mapa desenha em branco. UmMapViewna Home transformaria um pendente de deploy na primeira coisa que o produtor vê, a cada boot. Contagem funciona offline, não depende de chave, e a informação útil ("tem análise lá, e tem problema") chega igual.O texto diz "com problema", não "com doença", pela mesma razão que o sub-projeto 6 pintou os pinos em duas cores só: Fitotoxicidade é dano químico, não doença.
A Home faz duas consultas e nenhuma dentro de laço. Isso exigiu trabalho:
montarPinoschamaresolveDiseaseNameuma vez por linha — N consultas ao SQLite para N pinos, lacuna registrada na spec do sub-projeto 6. A classificação foi extraída para uma função pura e síncrona, e o resumo conta sem tocar o catálogo. A lacuna continua de pé em/mapa, mas deixa de se propagar para a tela de entrada.O bug do
PROBING, e por que a correção óbvia estava erradaO sub-projeto 6 deixou nomeado:
/mapachecaconnectionMode === 'FIELD'e ignora'PROBING', o estado inicial do app por até ~7 s. Hoje é inalcançável; ligar a navegação torna real.A correção que a lacuna sugeria —
FIELD || PROBING— está errada. Durante o probe o app não sabe se há rede; dizer "o mapa precisa de conexão" a quem tem internet troca um falso negativo por um falso positivo. São três estados:PROBINGcarrega,FIELDavisa,ONLINE/DEGRADEDdesenham.O detalhe que fecha o argumento: quando o NetInfo detecta desconexão física, o store vai direto para
FIELDePROBINGnem acontece. A janela de dúvida é exatamente o cenário de campo — torre sem dados, wi-fi sem saída.Navegação: "Home e volta"
Sem barra. Câmera, conversas, mapa e catálogo já tinham seta de voltar.
As duas barras falsas foram apagadas — e a da câmera tinha ficado ativamente errada. Sua aba "Catálogo" chama
router.replace('/'), que depois desta mudança leva à Home e não a catálogo nenhum.app/_layout.tsxpassa a registrar as oito rotas;mapanunca constava.Duas perdas assumidas
Não há mais como forçar um sync à mão. A Home era o único lugar que mostrava a contagem de pendentes e o único que chamava
syncNow({ manual: true }). O sync automático continua —_layout.tsxdispara na transição paraONLINE, inclusive a do boot —, mas depois de uma falha não há retry manual, num app offline-first onde a fila é o produto. Registrado nas Lacunas.Falha de leitura vira só
console.warn, sem nada visível. A Home anterior mostrava Toast de erro. As três telas novas (Home,/catalogo,/mapa) compartilham esse padrão — o que foi achado só na revisão de branch inteira, porque nenhuma revisão por tarefa via as três juntas. Registrado para decidir se vira convenção ou dívida.Testes
Frontend 226 → 254 (26 arquivos). Backend intocado em 82. Typecheck limpo nos dois pacotes.
Quatro das oito tarefas são de tela e corretamente não têm teste novo — o projeto não tem testing-library e não testa componentes nem telas. A lógica dessas tarefas vive em módulos puros que são testados:
classificarPino,resumoDoMapa,estadoDoMapa,filtrarDoencas,rotuloSeveridade,tipoSeveridade, e o limite delistSessions.Nada nunca rodou em aparelho real. Com a reformulação fechada, isto deixa de ser um pendente entre outros e passa a ser o próximo passo do projeto. A chave do Google Maps para Android segue sem provisionar —
/mapacontinua em branco no Android até ela existir.