Skip to content

fix: corrige regressões do Lovable (gates TS/ESLint, teste do player, lockfile e mute do autoplay)#502

Merged
adm01-debug merged 3 commits into
mainfrom
claude/lovable-changes-review-h0tpJ
May 29, 2026
Merged

fix: corrige regressões do Lovable (gates TS/ESLint, teste do player, lockfile e mute do autoplay)#502
adm01-debug merged 3 commits into
mainfrom
claude/lovable-changes-review-h0tpJ

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

@adm01-debug adm01-debug commented May 29, 2026

Contexto

Revisão exaustiva dos commits recentes do Lovable (gpt-engineer-app[bot], 28/05/2026 — player HLS, mock do SKU 09138, tooltip do badge, comparação de fornecedores, bateria de testes do PromoFlixPlayer). Foram encontradas regressões que quebravam os gates de qualidade do CI, um teste unitário e o npm ci. Mesmo padrão da rodada anterior (PR #499).

Diagnóstico (antes)

  • npm run typecheck (gate tsc baseline) → ❌ 4 pares file:rule novos
  • npm run lint:baseline (gate eslint baseline) → ❌ 10 grupos novos
  • vitest PromoFlixPlayer → ❌ 1 teste (race condition)
  • npm ci → ❌ fast-check/pure-rand ausentes do lock

Correções

TypeScript

  • ProductDetail: usa it.image_url (campos og_image_url/images não existem em SimilarProductItem) — TS2551/TS2339.
  • PromoFlixPlayer.test: remove prop inexistente isMuted; tipa o mock de hls.js (MockHlsInstance/MockHlsStatic) e os <video> (cast HTMLVideoElement).

ESLint

  • SupplierComparisonModal: remove imports/vars não usados, !=!==, e tipa as props de ComparisonRow/ComparisonCard (sem any).
  • PromoFlixPlayer: details: unknown, telemetria com eslint-disable justificado, deps de hooks ajustadas.
  • PriceFreshnessBadge / price-freshness / SmartRecommendationsMock: remove bindings e import mortos.

Teste unitário

  • PromoFlixPlayer.test: corrige o teste de race condition (usa rerender na mesma instância em vez de um segundo render), validando o cleanup da instância HLS anterior.

Bug de comportamento (player)

  • O mute forçado pela política de autoplay não é mais persistido em localStorage como preferência do usuário (antes deixava o vídeo mudo permanentemente entre sessões). Mute/unmute manual continua sendo persistido. Inclui 2 testes de regressão.

Lockfile

  • package-lock.json sincronizado com fast-check/pure-rand (usados em tests/hooks/useSupplierComparison.property.test.ts), destravando npm ci.

Verificação (depois)

  • npm run typecheck — "Nenhuma regressão de TypeScript detectada"
  • npm run lint:baseline — "Nenhuma regressão de lint detectada"
  • vitest PromoFlixPlayer — 22/22 · PriceFreshnessBadge + property test — verde
  • npm run test:deploy-gate — 309/309
  • npm install sincronizou o lock

Pendente (decisão de produto — ver comentário/conversa)

Há um drift pré-existente (não causado por este PR): a batch recente do Lovable mudou o formato dos rótulos em src/utils/price-freshness.ts (ex.: Atualizado (há N dias) / Possivelmente defasado (há N dias)), mas 3 arquivos de teste mais antigos ainda esperam os rótulos canônicos antigos (Atualizado hoje / Preço pode estar defasado (...)), causando 19 falhas no job coverage do CI. Aguardando decisão: atualizar os testes para o novo copy (recomendado) ou reverter o copy do util.

https://claude.ai/code/session_01B2ghtor8Q4zfS5yQWCNDYW


Generated by Claude Code


Summary by cubic

Corrige regressões do pacote Lovable que quebravam os gates de TS/ESLint, um teste do player, o npm ci e o job Test Coverage; também restaura o copy canônico de price‑freshness e cobre um gap pequeno no hook de comparação. Todos os gates passam agora, incluindo PromoFlixPlayer, PriceFreshnessBadge e cobertura.

  • Bug Fixes

    • Restaura baselines de TS/ESLint: tipagem estrita em comparação e testes; remove código morto; ProductDetail usa image_url.
    • PromoFlixPlayer: mute imposto pelo autoplay não persiste em localStorage; init/cleanup mais robustos; loading/erros refinados; testes atualizados e com regressões.
    • Price freshness: copy canônico — “Atualizado hoje/Atualizado há N dias” e “Preço pode estar defasado (há N dias)”; PDP mostra “· há N dias”; testes e snapshots atualizados.
    • Supplier comparison: adiciona testes para fallback por nome de categoria e sem categoria para fechar o piso de cobertura.
    • Cobertura: remove o threshold per‑file global em vitest.config.ts que derrubava o job Test Coverage; a exigência do hook segue aplicada no job dedicado.
  • Dependencies

    • Adiciona fast-check e pure-rand ao package-lock.json, destravando npm ci.

Written for commit d2bd1b1. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

Notas de Lançamento

  • New Features

    • Modal de comparação de fornecedores aprimorado com cartões de KPI, alternância entre visualizações de tabela e cards, e filtros otimizados.
    • Rodapé de decisão redesenhado com resumo de seleções.
  • Bug Fixes

    • Corrigida persistência de mute forçado no player de vídeo.
    • Melhorado tratamento de erros de vídeo travado com opção "Carregar Manualmente".
  • UI/UX

    • Mensagens de atualização de preço atualizadas ("Atualizado hoje", "Preço pode estar defasado").
    • Formatação aprimorada de dados de data/hora nos badges de frescor de preço.

Review Change Stack

… lockfile e mute do autoplay)

Análise dos commits recentes do Lovable encontrou regressões que quebravam os
gates de qualidade do CI, um teste unitário e o `npm ci`. Correções:

TypeScript (gate `npm run typecheck`):
- ProductDetail: usa `it.image_url` (campos `og_image_url`/`images` não existem
  em SimilarProductItem) — TS2551/TS2339.
- PromoFlixPlayer.test: remove prop inexistente `isMuted`; tipa o mock de hls.js
  (MockHlsInstance/MockHlsStatic) e os elementos `<video>` (cast HTMLVideoElement).

ESLint (gate `npm run lint:baseline`):
- SupplierComparisonModal: remove imports/vars não usados, `!=`→`!==` e tipa as
  props de ComparisonRow/ComparisonCard (remove `any`).
- PromoFlixPlayer: `details: unknown`, telemetria com eslint-disable, deps de
  hooks ajustadas.
- PriceFreshnessBadge / price-freshness / SmartRecommendationsMock: remove
  bindings e import mortos.

Teste unitário:
- PromoFlixPlayer.test: corrige o teste de race condition (usa `rerender` na
  mesma instância em vez de um segundo `render`), validando o cleanup do HLS.

Comportamento (bug do player):
- PromoFlixPlayer: o mute forçado pela política de autoplay não é mais
  persistido em localStorage como preferência do usuário. Mute/unmute manual
  continua sendo persistido. Adiciona testes de regressão.

Lockfile:
- package-lock.json sincronizado com fast-check/pure-rand (usados em
  tests/hooks/useSupplierComparison.property.test.ts), destravando `npm ci`.

https://claude.ai/code/session_01B2ghtor8Q4zfS5yQWCNDYW
@vercel
Copy link
Copy Markdown

vercel Bot commented May 29, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
we-dream-big Error Error May 29, 2026 1:42am

@supabase
Copy link
Copy Markdown

supabase Bot commented May 29, 2026

This pull request has been ignored for the connected project doufsxqlfjyuvxuezpln because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 29, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 2aa03361-6f4c-49c1-8bd6-cc06edf011bd

📥 Commits

Reviewing files that changed from the base of the PR and between 1ec1363 and d2bd1b1.

⛔ Files ignored due to path filters (2)
  • package-lock.json is excluded by !**/package-lock.json, !**/package-lock.json
  • src/components/products/__snapshots__/PriceFreshnessBadge.snapshots.test.tsx.snap is excluded by !**/*.snap
📒 Files selected for processing (10)
  • src/components/compare/SupplierComparisonModal.tsx
  • src/components/products/PriceFreshnessBadge.test.tsx
  • src/components/products/PriceFreshnessBadge.tsx
  • src/components/products/SmartRecommendationsMock.tsx
  • src/components/products/gallery/PromoFlixPlayer.test.tsx
  • src/components/products/gallery/PromoFlixPlayer.tsx
  • src/pages/products/ProductDetail.tsx
  • src/utils/price-freshness.ts
  • tests/hooks/useSupplierComparison.test.ts
  • vitest.config.ts

Walkthrough

PR refatora o modal de comparação de fornecedores com novos tipos e layout expandido, atualiza labels de "price freshness" em múltiplos pontos da UI, melhora persistência de mute no player de vídeo com fallback de autoplay, e estende cobertura de testes.

Changes

Supplier Comparison Modal Refactoring

Layer / File(s) Summary
Imports & Type Definitions
src/components/compare/SupplierComparisonModal.tsx
Remoção de useEffect/useNavigate, reorganização de ícones lucide-react, novos tipos ComparisonRowData e ComparisonItemProps para padronizar dados de linha.
Filtering & Winner Logic
src/components/compare/SupplierComparisonModal.tsx
filteredProducts com atribuição incremental de filtros, reorganização de winner/winnerReason via reduce em scoreBreakdown com rótulos PT-BR.
Modal Header & Main UI Structure
src/components/compare/SupplierComparisonModal.tsx
Cabeçalho do DialogContent, TabsTrigger para tabela/cards, UI de ordenação com SelectItem, filtros via ToggleFilter, KPICard e card do vencedor.
Decision Footer & Utility Components
src/components/compare/SupplierComparisonModal.tsx
"Sticky Decision Footer" redesenhado com avatars/resumo/botões, implementação de ToggleFilter e KPICard.
ComparisonRow Component
src/components/compare/SupplierComparisonModal.tsx
Reimplementação com ComparisonItemProps, tooltip "MOQ Elevado", badge variação (TrendingUp/TrendingDown), delta preço unitário condicional, placeholders base, botão com estados.
ComparisonCard & ScoreBreakdown
src/components/compare/SupplierComparisonModal.tsx
ComparisonCard com imagem/score/preço/estoque/MOQ, ScoreBreakdown com rótulo "Análise IA", badge "Melhor Preço", PopoverContent com Progress proporcional.

Price Freshness Labels & Badge Display

Layer / File(s) Summary
Utility Labels
src/utils/price-freshness.ts
Texto relativo "hoje" para 0 dias, baseLabel padronizado Atualizado &lt;relativo&gt;, label stale → "Preço pode estar defasado", reutilização de baseLabel para aging/fresh.
Badge Rendering
src/components/products/PriceFreshnessBadge.tsx
Tooltip com formatExactDateTime (PT-BR), extração de texto em parênteses via IIFE, separador ponto ("· {relative}") em pdp para aging/fresh.
Test Coverage
src/components/products/PriceFreshnessBadge.test.tsx
Testes validam "Atualizado hoje" (0 dias), "Atualizado há 45 dias" (45d), "Preço pode estar defasado" (stale pdp).

PromoFlixPlayer Autoplay Mute Persistence

Layer / File(s) Summary
Mute State & Autoplay Fallback
src/components/products/gallery/PromoFlixPlayer.tsx
suppressMutePersistRef sinaliza mutes forçados, logTelemetry tipado, preservação de erro HLS anterior, fallback autoplay forçando mute sem persistir.
Volume Change & Persistence
src/components/products/gallery/PromoFlixPlayer.tsx
volumechange handler condicionado: suppressMutePersistRef ativo → só consome flag; caso contrário → persiste promoflix_muted. Dependências initPlayer expandidas.
Test Infrastructure & Scenarios
src/components/products/gallery/PromoFlixPlayer.test.tsx
Tipos MockHlsInstance/MockHlsStatic tipados, testes timeout/vídeo travado, erro SRC_NOT_SUPPORTED, ocultar overlay (progress/loadeddata/canplay), erros fatais HLS (rede/mídia), unmount/troca src/fallback muted/DECODE/race conditions/timeout cleanup/persistência mute.

Polish & Test Infrastructure

Layer / File(s) Summary
SmartRecommendationsMock Layout
src/components/products/SmartRecommendationsMock.tsx
Remoção import Badge, reorganização MockMiniCard props/classes, ícone badgeLabel via bloco condicional, seção/texto multilinha.
ProductDetail Image
src/pages/products/ProductDetail.tsx
imageUrl usa it.image_url, remove fallback it.og_image_url \|\\ it.images?.[0].
useSupplierComparison Tests
tests/hooks/useSupplierComparison.test.ts
Novos testes: category.name sem category.id, category undefined com filters/query desabilitados.
Vitest Coverage Config
vitest.config.ts
Remove threshold global por arquivo useSupplierComparison.ts, documenta relocação para job npm run test:supplier-comparison.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • adm01-debug/promo-gifts-v4#500: Altera PriceFreshnessBadge.tsx com mudanças em tooltip e labels pdp; ambos PRs compartilham refatoração de "price freshness" display.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/lovable-changes-review-h0tpJ

Comment @coderabbitai help to get the list of available commands and usage tips.

…ertura do comparador

CI verde (falhas pré-existentes da batch do Lovable, não causadas pelo PR original):

price-freshness (copy do badge) — o commit 2df1824 do Lovable renomeou os
rótulos do util, quebrando o contrato de cópia documentado
(PriceFreshnessBadge.copyAssertions.test.tsx) + labels-parity + colorMatrix +
thresholdMatrix + 2 testes do QuoteBuilder + os 3 testes do util. Revertido para
o copy canônico:
- fresh/aging: "Atualizado hoje" / "Atualizado há N dias"
- stale: "Preço pode estar defasado (há N dias)"
- variante pdp volta a usar "· há N dias" (em vez de "(há N dias)")
- regenerados os snapshots e ajustados os 3 asserts do teste unitário do badge
  que o Lovable havia mudado para o copy novo.

supplier-comparison (cobertura) — o hook useSupplierComparison ficava a 0,88% do
piso de branches (84,12% < 85%). Adicionados 2 casos cobrindo a seleção por
nome de categoria (sem id) e sem categoria → branches 86,04%, linhas 100%.

Gates: typecheck ✅ · lint:baseline ✅ · test:price-freshness ✅ (461) ·
test:supplier-comparison ✅ (14).

https://claude.ai/code/session_01B2ghtor8Q4zfS5yQWCNDYW
…b "Test Coverage"

O commit 32c6cc6 do Lovable adicionou um threshold per-file de cobertura para
`src/hooks/products/useSupplierComparison.ts` (90/90/85/90) dentro de
`vitest.config.ts` (config GLOBAL). Como os flags `--coverage.thresholds.*=0` da
CLI só sobrescrevem os thresholds de topo (não o objeto aninhado por arquivo), esse
gate disparava em QUALQUER run de cobertura que não exercita o hook — em particular
`npm run test:ci-core:coverage` (job "Test Coverage" do CI), que roda só 3 arquivos
não relacionados → cobertura 0% do hook → falha.

A exigência T14 (90/85) continua aplicada no job dedicado
`npm run test:supplier-comparison` (via --coverage.include + --coverage.thresholds.*),
que segue verde (branches 86,04%, linhas 100%). Removido apenas o bloco do config
global; enforcement real preservado.

Verificação: test:ci-core:coverage ✅ (309) · test:supplier-comparison ✅ (14, gate 90/85 ok).

https://claude.ai/code/session_01B2ghtor8Q4zfS5yQWCNDYW
@adm01-debug adm01-debug marked this pull request as ready for review May 29, 2026 10:26
Copilot AI review requested due to automatic review settings May 29, 2026 10:26
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@adm01-debug adm01-debug merged commit 21c2888 into main May 29, 2026
46 of 52 checks passed
@adm01-debug adm01-debug deleted the claude/lovable-changes-review-h0tpJ branch May 29, 2026 10:27
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants