QABot

Revisão técnica assistida por IA

Histórico0159c91a-366f-48bb-a4d9-4edbea000cd3
ANÁLISE SALVA

cellarvinhostechteam/novo-app-cellar

feat/tab-pop-to-top · 22 de setembro de 2026 às 14:27 · gpt-5.6-sol

54/ 100

Análise restrita aos 24 arquivos fornecidos como diff da branch feat/tab-pop-to-top em relação à main. Foram identificados riscos relevantes de segurança de transporte, publicação OTA em produção a partir de development, configuração incompatível de push iOS em produção e bloqueio permanente na splash quando fontes falham. Também há bugs reproduzíveis em deep links e scripts de migração, além de chamadas desnecessárias de API e ausência de automação de testes visível. O achado solicitado sobre credenciais na query string da WebView foi integralmente ignorado e não afetou a pontuação.

Achados 9

24 arquivos analisados

Alto

Transporte inseguro está liberado globalmente em iOS e Android

security
app.config.js:17

A configuração define NSAllowsArbitraryLoads: true no iOS, inclusive novamente dentro de infoPlist, e usesCleartextTraffic: true no Android. Isso permite tráfego HTTP sem criptografia de forma global, expondo qualquer comunicação acidental ou redirecionamento HTTP a interceptação e alteração em trânsito.

RecomendaçãoRemover as liberações globais. Se algum domínio legado exigir HTTP, criar exceções restritas por domínio usando ATS no iOS e Network Security Config no Android. Adicionar uma validação de build que rejeite essas opções em perfis de produção.
Alto

Workflow permite publicar diretamente no canal production a partir da branch development

reliability
.eas/workflows/publish-development-updates.yml:16

O workflow é disparado em push para development e o job dev_update_production executa quando a mensagem do commit contém “update” e “production”, publicando no channel: production. Não há aprovação, validação de branch main, ambiente protegido ou etapa de teste no arquivo.

RecomendaçãoRestringir atualizações do canal production a pushes ou tags provenientes da main, preferencialmente com aprovação de ambiente. Evitar controlar publicação por substrings livres na mensagem do commit e incluir gates de lint, typecheck e testes antes do update.
Alto

Configuração de push iOS permanece em modo development para builds de produção

reliability
app.config.js:30

O entitlement aps-environment está fixado como development e o onesignal-expo-plugin também está configurado com mode: development. O mesmo app.config.js é usado pelo perfil production definido no eas.json, sem seleção condicional por perfil.

RecomendaçãoSelecionar aps-environment e o mode do OneSignal conforme o perfil de build, usando variáveis como EAS_BUILD_PROFILE. Garantir que builds production usem configuração de produção e validar o entitlement do artefato iOS em CI.
Alto

Falha no carregamento de fontes pode manter o aplicativo permanentemente na splash

reliability
App.tsx

O retorno de useFonts é desestruturado apenas como [fontsLoaded], ignorando o erro. Enquanto fontsLoaded for false, o componente sempre retorna AnimatedSplash. Portanto, uma rejeição definitiva no carregamento de qualquer fonte não possui caminho de fallback para liberar a interface.

RecomendaçãoCapturar também o erro retornado por useFonts e considerar o app pronto quando fontsLoaded ou fontError estiver definido, registrando a falha no Honeybadger. Adicionar teste simulando rejeição no carregamento das fontes.
Médio

Correspondência parcial de deep link pode redirecionar URLs não relacionadas para o Bolão

bug
App.tsx

getStateFromPath usa path.includes("bolao"). Assim, qualquer caminho ou parâmetro contendo esse texto, como collection/nao-bolao ou uma query de campanha contendo “bolao”, é convertido para a rota Home com openBolao: true, em vez de seguir o parser padrão.

RecomendaçãoAnalisar o pathname e comparar segmentos completos, por exemplo com uma expressão ancorada para /collection/bolao ou uma lista explícita de rotas aceitas. Criar testes para caminhos válidos, nomes que apenas contêm “bolao” e parâmetros de query.
Médio

Script de substituição nunca adiciona o import de AppScrollView

bug
replace_scrollviews.js:38

O script primeiro substitui <ScrollView por <AppScrollView e depois verifica if (!content.includes('AppScrollView')). Após a substituição, a condição sempre é falsa, inclusive quando o arquivo originalmente não possuía o import. O resultado gerado referencia AppScrollView sem import e pode falhar na compilação.

RecomendaçãoVerificar a existência do import antes de substituir as tags, ou testar especificamente uma declaração de import. Executar o script sobre fixtures com e sem import e validar o resultado com TypeScript.
Médio

Consulta da vitrine é executada mesmo para usuários que não podem visualizar o componente

performance
src/components/home/MinhaVitrine.tsx

skus recebe uma lista padrão quando o usuário não possui skusVitrinePersonalizada e useAdegaProductsQuery(skus) é chamado antes da condição que retorna null para usuários fora do clube ou sem cluster. Portanto, montar o componente para um usuário não elegível ainda dispara a consulta dos SKUs padrão.

RecomendaçãoAdicionar uma opção enabled à query baseada na elegibilidade do usuário, mantendo a chamada do hook incondicional, mas impedindo a requisição quando user?.clube !== true, o cluster estiver ausente ou não houver SKUs aplicáveis.
Médio

Falha no AsyncStorage impede o fechamento do modal de instruções

reliability
src/components/home/SelecaoCupons/HowToUseCouponsModal.tsx

handleClose aguarda AsyncStorage.setItem ou removeItem antes de chamar onClose, sem try/finally. Se a operação de armazenamento rejeitar, onClose não é executado e o modal permanece aberto. loadPref também é iniciado sem tratamento de rejeição.

RecomendaçãoColocar as operações de AsyncStorage em try/catch e chamar onClose em finally. Registrar a falha sem bloquear a ação do usuário e testar rejeições de getItem, setItem e removeItem.
Baixo

Não há comando de testes automatizados exposto no package.json

testing
package.json:5

A seção scripts contém comandos de execução, build, submit e upload de source maps, mas não define test, lint ou typecheck. A diff fornecida altera inicialização, deep links, workflows, modal e scripts de transformação sem incluir testes correspondentes.

RecomendaçãoAdicionar scripts de test, lint e typecheck e executá-los antes de builds e atualizações OTA. Priorizar testes para falha de fontes, parsing de deep links, fechamento do modal com erro de armazenamento e transformação de ScrollView.