QABot

Revisão técnica assistida por IA

Históricof3922304-713b-45ea-9fc7-136413ba03a4
ANÁLISE SALVA

cellarvinhostechteam/novo-app-cellar

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

58/ 100

Score 58/100. A base apresenta boas proteções de execução, como ErrorBoundary, tratamento de atualização e configuração idempotente do Podfile. Entretanto, há riscos relevantes de segurança e entrega: tráfego HTTP é permitido globalmente, a configuração iOS de push permanece em ambiente de desenvolvimento e código da branch development pode ser publicado diretamente no canal production. Também foram encontrados defeitos reproduzíveis em script de migração, deep links, tratamento de falhas de armazenamento e carregamento inicial.

Achados 10

24 arquivos analisados

Alto

Aplicativo permite tráfego HTTP sem criptografia em iOS e Android

security
app.config.js:17

No iOS, NSAllowsArbitraryLoads está definido como true, inclusive dentro de infoPlist. No Android, expo-build-properties define usesCleartextTraffic: true. Assim, requisições HTTP podem ser realizadas sem proteção de transporte nas duas plataformas.

RecomendaçãoRemover NSAllowsArbitraryLoads e definir usesCleartextTraffic como false. Se algum endpoint legado exigir HTTP, criar exceções restritas por domínio usando NSExceptionDomains no iOS e Network Security Config no Android.
Alto

Build de produção iOS está configurado para o ambiente de push de desenvolvimento

reliability
app.config.js:32

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 é utilizado pelo perfil production definido em eas.json.

RecomendaçãoSelecionar "production" para builds de distribuição e manter "development" apenas nos perfis internos. Derivar mode e entitlements de uma variável de perfil, como APP_ENV ou EAS_BUILD_PROFILE, e validar o entitlement gerado no artefato de produção.
Alto

Commits da branch development podem publicar diretamente no canal production

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

O workflow é executado em push para development e o job dev_update_production publica no channel production quando a mensagem do commit contém simultaneamente "update" e "production". Não há aprovação, tag ou restrição adicional presente no workflow.

RecomendaçãoRestringir publicações no canal production a uma branch ou tag de release protegida. Adicionar aprovação de ambiente e evitar usar palavras da mensagem de commit como único controle para uma publicação de produção.
Médio

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

bug
replace_scrollviews.js:32

O script primeiro substitui <ScrollView por <AppScrollView e, depois, testa if (!content.includes('AppScrollView')). Após a substituição essa condição sempre é falsa, mesmo quando não existe import. O arquivo é então salvo com AppScrollView não definido, causando falha de compilação nos arquivos migrados.

RecomendaçãoVerificar a existência do import antes de substituir as tags, ou testar especificamente uma declaração de import. Adicionar um teste com um arquivo que contenha ScrollView sem import de AppScrollView e validar que a saída inclui tags e import corretos.
Médio

Correspondência parcial de deep links direciona caminhos não relacionados

bug
App.tsx

getStateFromPath usa path.includes("wishlist"), path.includes("favoritos"), path.includes("bolao") e path.includes("minha-cellar"). Portanto, caminhos como favoritos-extra ou collection/nao-e-bolao também satisfazem as condições e abrem telas especiais incorretamente.

RecomendaçãoNormalizar o pathname e comparar segmentos completos ou expressões regulares ancoradas, por exemplo (^|/)favoritos/?$ e (^|/)collection/bolao/?$. Criar casos de teste positivos e negativos para cada deep link.
Médio

Falha no AsyncStorage pode impedir o fechamento do modal

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

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

RecomendaçãoEnvolver as operações de armazenamento em try/catch e executar onClose em finally. Tratar também a rejeição em loadPref, mantendo um valor padrão seguro e reportando o erro.
Médio

Consulta da vitrine é executada mesmo quando o componente não será exibido

performance
src/components/home/MinhaVitrine.tsx:16

useAdegaProductsQuery(skus) é chamado antes da validação que retorna null para usuários que não pertencem ao clube ou não atendem aos critérios. Além disso, skus recebe uma lista padrão, de modo que a consulta sempre recebe um valor mesmo para usuários sem dados personalizados.

RecomendaçãoAdicionar uma opção enabled à query baseada na elegibilidade do usuário, por exemplo clube === true, cluster válido e SKUs existentes. Se o hook não aceitar enabled, adaptar sua implementação para evitar a requisição até que essas condições sejam satisfeitas.
Médio

Erro no carregamento de fontes pode manter o aplicativo indefinidamente no splash

reliability
App.tsx

O retorno de useFonts é desestruturado apenas como fontsLoaded, ignorando o erro. Enquanto fontsLoaded for false, o componente sempre retorna AnimatedSplash, inclusive depois de a animação terminar. Não existe caminho alternativo para uma falha definitiva de carregamento.

RecomendaçãoCapturar o segundo valor retornado por useFonts e permitir inicialização com fontes de fallback quando houver erro, registrando a falha no monitoramento. Adicionar teste para o cenário em que a fonte rejeita ou não pode ser carregada.
Médio

Projeto não possui comandos de teste, lint ou verificação de tipos nos scripts apresentados

testing
package.json:5

A seção scripts contém comandos de execução, build, submit e upload de sourcemaps, mas não contém test, lint ou typecheck. Nenhum framework de testes aparece nas dependências ou devDependencies apresentadas.

RecomendaçãoAdicionar ao menos scripts de typecheck com tsc --noEmit, lint e testes automatizados. Priorizar cobertura para getStateFromPath, comportamento de pop-to-top das tabs, scripts de migração, falhas do AsyncStorage e inicialização com erro de fontes.
Baixo

Log detalhado do OneSignal permanece habilitado em produção

performance
App.tsx

OneSignal.Debug.setLogLevel(LogLevel.Verbose) é executado incondicionalmente no escopo do módulo, sem verificação de __DEV__ ou ambiente.

RecomendaçãoUsar LogLevel.Verbose somente em desenvolvimento e reduzir ou desabilitar o nível de log em builds de produção.