QABot

Revisão técnica assistida por IA

Históricob89ed41a-8b75-4137-a01f-db27299ab3a3
ANÁLISE SALVA

cellarvinhostechteam/novo-app-cellar

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

48/ 100

A análise estática dos 24 arquivos identificou riscos relevantes de segurança, distribuição e disponibilidade. Os principais problemas são tráfego inseguro habilitado nas builds, credencial de autenticação transmitida na URL, publicação no canal de produção controlada apenas pela mensagem de commit, configuração de push de desenvolvimento aplicada à produção e possibilidade de splash infinito quando as fontes falham. Também há scripts de migração defeituosos, requisições desnecessárias e ausência de automação de testes no package.json.

Achados 11

24 arquivos analisados

Alto

Builds permitem tráfego HTTP e desabilitam proteções de transporte

security
app.config.js:16

O iOS configura NSAllowsArbitraryLoads: true, inclusive dentro de infoPlist, e o Android configura usesCleartextTraffic: true. Essas opções são aplicadas globalmente, sem separação por ambiente ou perfil de build.

RecomendaçãoRemover NSAllowsArbitraryLoads e usesCleartextTraffic das builds de produção. Se algum endpoint legado exigir HTTP, criar exceções específicas por domínio e restringi-las a builds internas.
Alto

Token de autenticação e e-mail são enviados na query string da WebView

security
src/components/home/ClubeWelcome.tsx

A navegação constrói `https://socio.cellarvinhos.com/loginWebview?email=${userEmail}&tokenVtex=${authCookie?.Value}`. Tokens em query strings podem aparecer em logs, histórico, telemetria, ferramentas de observabilidade e cabeçalhos Referer. Os valores também não passam por encodeURIComponent; quando authCookie estiver ausente, a URL conterá tokenVtex=undefined.

RecomendaçãoSubstituir o token na URL por um código de uso único e curta duração, obtido por troca autenticada. Alternativamente, transmitir a credencial por cabeçalho ou mecanismo seguro da WebView. Validar a presença dos dados antes da navegação e codificar parâmetros não sensíveis com encodeURIComponent.
Alto

Push na branch development pode publicar diretamente no canal production

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

O job dev_update_production é executado em pushes para development quando a mensagem do head commit contém simultaneamente `update` e `production`. Não existe aprovação, tag, branch de release ou validação adicional no workflow apresentado.

RecomendaçãoRestringir atualizações de produção a tags ou branch protegida, exigir aprovação manual/environment protection e separar os workflows de preview e production. Evitar usar substring da mensagem de commit como autorização de deploy.
Alto

Configuração de push de desenvolvimento é usada também em builds de produção

reliability
app.config.js

A configuração é incondicional: o entitlement `aps-environment` está como `development` e o onesignal-expo-plugin recebe `mode: "development"`. O eas.json possui perfil production, mas app.config.js não altera esses valores conforme o perfil.

RecomendaçãoDefinir `mode: "production"` e entitlement de produção para builds distribuídas pela App Store, usando variável como EAS_BUILD_PROFILE para separar development, preview e production. Validar recebimento de push em uma build assinada para distribuição antes do release.
Alto

Falha no carregamento de fontes mantém o aplicativo indefinidamente no splash

reliability
App.tsx

O retorno `useFonts` é desestruturado apenas como `[fontsLoaded]`. Enquanto fontsLoaded for false, o componente sempre retorna AnimatedSplash. O erro fornecido pelo hook não é tratado, portanto qualquer falha permanente de fonte impede que a árvore principal seja renderizada.

RecomendaçãoCapturar também o erro de useFonts e liberar a inicialização com fonte de fallback quando ocorrer falha. Registrar o erro no Honeybadger e adicionar timeout controlado para impedir bloqueio infinito.
Médio

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

bug
replace_scrollviews.js:33

Antes da condição de import, o script substitui `<ScrollView` por `<AppScrollView`. Em seguida verifica `if (!content.includes('AppScrollView'))`, que sempre será falso para qualquer arquivo efetivamente substituído. Assim, o arquivo pode passar a usar AppScrollView sem importá-lo.

RecomendaçãoVerificar a existência de um import específico antes de substituir as tags, por exemplo com expressão regular para `import { AppScrollView }`. Adicionar o import quando ausente e executar TypeScript/ESLint após a transformação.
Médio

Erro no AsyncStorage impede o fechamento do modal

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. loadPref também não trata rejeições.

RecomendaçãoColocar a persistência em try/catch e executar onClose em finally. No carregamento inicial, capturar falhas e manter o comportamento padrão sem bloquear ou gerar rejeição não tratada.
Médio

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

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

useAdegaProductsQuery(skus) é chamado antes da condição que retorna null para usuários fora do clube ou sem cluster. Além disso, skus recebe uma lista padrão, portanto usuários inelegíveis ainda podem iniciar a consulta desses produtos.

RecomendaçãoAdicionar uma opção `enabled` à query baseada na elegibilidade do usuário e na existência de SKUs válidos. Outra opção é separar a área consultada em um componente filho montado apenas depois da validação.
Médio

Builds de produção reutilizam buildNumber e versionCode fixos

reliability
eas.json

O perfil production possui `autoIncrement: false`, enquanto app.config.js fixa iOS buildNumber e Android versionCode em 70. Builds sucessivas geradas sem alteração manual reutilizarão os mesmos identificadores, que não podem ser submetidos novamente às lojas após uso.

RecomendaçãoHabilitar autoIncrement no perfil production ou adicionar uma etapa obrigatória e validada de incremento. Incluir verificação no CI que falhe quando o identificador não for superior ao último release.
Médio

Não há comando nem infraestrutura de testes automatizados declarados

testing
package.json:5

A seção scripts não contém `test`, e as dependências apresentadas não incluem runner de testes. Fluxos críticos modificados ou configurados nestes arquivos, como deep links, splash, atualizações OTA, modal persistente e scripts de transformação, ficam sem proteção automatizada visível.

RecomendaçãoAdicionar Jest com React Native Testing Library para componentes e hooks, testes unitários dos parsers de deep link e scripts Node, e smoke tests de inicialização. Cobrir pelo menos falha de fontes, falha do AsyncStorage, elegibilidade da vitrine, navegação por notificação e substituição de ScrollView.
Baixo

Logs verbosos do OneSignal permanecem habilitados em produção

security
App.tsx

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

RecomendaçãoUsar Verbose somente em desenvolvimento e reduzir o nível para Warn ou Error em produção, evitando exposição desnecessária de dados operacionais e excesso de logs.