Skip to content

fix(compare): corrige regress\u00e3o de runtime do PR #174 (CompareTableView camelCase) + remove casts Record/as-any#177

Merged
adm01-debug merged 4 commits into
mainfrom
claude/fix-compare-runtime-types
May 23, 2026
Merged

fix(compare): corrige regress\u00e3o de runtime do PR #174 (CompareTableView camelCase) + remove casts Record/as-any#177
adm01-debug merged 4 commits into
mainfrom
claude/fix-compare-runtime-types

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

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

Resumo

Corrige uma regress\u00e3o de runtime introduzida pelo PR #174 no m\u00f3dulo de compara\u00e7\u00e3o e, de quebra, remove os casts Record<string,unknown>/as any da cadeia-folha (follow-up registrado).

\ud83d\udc1b Causa-raiz (regress\u00e3o de runtime, n\u00e3o vis\u00edvel ao TSC)

Existem 3 tipos Product no c\u00f3digo. Os produtos que chegam \u00e0 ComparePage v\u00eam de getProductsByIds \u2192 mapPromobrindToProduct, cujo shape de runtime \u00e9 camelCase (@/types/product-catalog): minQuantity, stockStatus, isKit, category/supplier aninhados.

No PR #174, o CompareTableView foi tipado como @/types/product (snake_case) e seus acessos trocados para is_kit/min_quantity/stock_status. Contra objetos camelCase reais, esses campos retornam undefined em runtime. O TSC ficou verde (o tipo batia), mas a UI quebrou:

  • coluna \u201c\u00c9 Kit?\u201d \u2192 sempre \u201cn\u00e3o\u201d
  • \u201cQuantidade m\u00ednima\u201d \u2192 0 \u00b7 \u201cTCO\u201d (Custo total) \u2192 c\u00e1lculo errado
  • \u201cLead time\u201d \u2192 sempre o default
  • \u201cEstoque (status)\u201d \u2192 label errado
  • detec\u00e7\u00e3o de diferen\u00e7as (modo \u201cs\u00f3 diferen\u00e7as\u201d) \u2192 isKit/categoria/fornecedor comparados como undefined

N\u00e3o h\u00e1 teste unit\u00e1rio cobrindo o CompareTableView, por isso passou no merge.

\u2705 Corre\u00e7\u00e3o

Re-aponta a cadeia-folha do compare para o tipo correto @/types/product-catalog (camelCase), que casa com o runtime + ComparePage + o hook useSupplierComparison:

Arquivo Mudan\u00e7a Blob
compare/CompareTableView.tsx import \u2192 product-catalog; acessos revertidos a camelCase; category.icon/supplier.verified removidos (n\u00e3o existem no tipo); tagArray \u2192 acesso tipado; 2 casts removidos; CompareEntry exportado 9dda877
compare/StockRiskBadge.tsx Record<string,unknown> \u2192 Product 4b0a438
compare/OtherSuppliersRow.tsx Record<string,unknown> + as any \u2192 Product 6c35f79
pages/products/ComparePage.tsx importa CompareEntry; uma asser\u00e7\u00e3o honesta e documentada no \u00fanico call-site (confina a mentira de tipo pr\u00e9-existente da p\u00e1gina) 991f731

Valida\u00e7\u00e3o (same-env, container)

  • TSC: 1273 \u2192 1273 (zero mudan\u00e7a l\u00edquida). CompareTableView, StockRiskBadge, OtherSuppliersRow = 0 erros.
  • Regress\u00e3o: o \u00fanico item no diff comm -13 \u00e9 o mesmo erro pr\u00e9-existente do SimilarProductsRail na ComparePage deslocado 6 linhas (388\u2192394) pelo coment\u00e1rio que adicionei. O baseline rastreia c\u00f3digo\u2192contagem por arquivo (n\u00e3o linha), ent\u00e3o ComparePage segue com 10 erros e os mesmos c\u00f3digos \u2014 gate typecheck verde, sem update de baseline.
  • Build de produ\u00e7\u00e3o: vite build exit 0 \u2705
  • ESLint: 0 erros nos 4 arquivos.
  • Fidelidade: os 4 blobs validados por SHA-1 (git hash-object local == \u00e1rvore remota).

Follow-up (fora de escopo)

O subsistema de compara\u00e7\u00e3o ainda carrega a dualidade @/types/product (snake_case) vs @/types/product-catalog (camelCase) \u2014 ComparePage e v\u00e1rios irm\u00e3os (ComparisonScoreCard, SimilarProductsRail, etc.) ainda tipam @/types/product com casts no boundary. Unifica\u00e7\u00e3o dos tipos de Product fica como follow-up dedicado (documentado no coment\u00e1rio do call-site da ComparePage).


Summary by cubic

Fixes a runtime regression in the compare table from PR #174 by aligning it to camelCase product data, restoring correct values and comparisons. Also removes unsafe casts and standardizes compare components on @/types/product-catalog’s Product.

  • Bug Fixes
    • Pointed CompareTableView to @/types/product-catalog and switched field reads to camelCase (isKit, minQuantity, stockStatus); removed non-existent props (category.icon, supplier.verified).
    • Typed StockRiskBadge and OtherSuppliersRow with the same Product; removed Record<string, unknown>/as any casts and pass product directly.
    • Exported CompareEntry and added a single, documented assertion in ComparePage to bridge its local @/types/product to the table’s type.
    • Restores correct values for “É Kit?”, “Quantidade mínima”, “TCO”, “Lead time”, “Estoque (status)”, and difference highlighting.

Written for commit 38e2516. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

Release Notes

  • Bug Fixes

    • Corrigida a exibição de informações na tabela de comparação de produtos, incluindo status de estoque e dados de fornecedores.
  • Refactor

    • Simplificada a renderização de tags, categorias e badges na tabela comparativa com limite de itens exibidos.
    • Melhorado o tratamento de tipos nos componentes de comparação para maior consistência.

Review Change Stack

…roduct

Substitui `product: Record<string,unknown>` pelo tipo can\u00f4nico
`@/types/product-catalog`.Product \u2014 que \u00e9 o shape real em runtime
(mapPromobrindToProduct produz camelCase). Sem mudan\u00e7a de runtime; o
componente j\u00e1 lia minQuantity/stockStatus corretamente.
Substitui `product: Record<string,unknown>` + `useSupplierComparison(product as any)`
pelo tipo can\u00f4nico `@/types/product-catalog`.Product, que \u00e9 exatamente o que o
hook espera. Remove o `as any`. Sem mudan\u00e7a de runtime.
Corrige a regress\u00e3o de runtime do PR #174: o componente lia
is_kit/min_quantity/stock_status (snake_case) de objetos que em runtime
s\u00e3o camelCase (mapPromobrindToProduct -> @/types/product-catalog), logo
retornavam undefined (\u00c9 Kit?, Qtd m\u00ednima, TCO, Lead time, status e
diff-detection quebrados). Re-aponta para @/types/product-catalog e
reverte os acessos a camelCase (isKit/minQuantity/stockStatus). Remove
os dois casts `as unknown as Record<string,unknown>` (StockRiskBadge e
OtherSuppliersRow agora compartilham o mesmo tipo). Exporta CompareEntry.
TSC inalterado (1273->1273); build OK; ESLint limpo.
Importa o tipo CompareEntry e adiciona UMA asser\u00e7\u00e3o honesta e documentada
no \u00fanico call-site do CompareTableView. Os produtos v\u00eam de getProductsByIds
-> mapPromobrindToProduct (shape de runtime = @/types/product-catalog,
camelCase), mas a p\u00e1gina os declara como @/types/product. A asser\u00e7\u00e3o
confina essa mentira de tipo pr\u00e9-existente a um ponto documentado, em vez
de espalh\u00e1-la. Zero erro TSC novo (baseline rastreia c\u00f3digo->contagem).
Copilot AI review requested due to automatic review settings May 23, 2026 21:29
@vercel
Copy link
Copy Markdown

vercel Bot commented May 23, 2026

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

Project Deployment Actions Updated (UTC)
we-dream-big Ready Ready Preview, Comment May 23, 2026 9:30pm

@supabase
Copy link
Copy Markdown

supabase Bot commented May 23, 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 23, 2026

Caution

Review failed

Pull request was closed or merged during review

Walkthrough

Refatoração de tipo e segurança: CompareTableView, OtherSuppliersRow e StockRiskBadge migram para usar Product tipado de @/types/product-catalog com campos camelCase (minQuantity, stockStatus, isKit, tags.publicoAlvo, tags.datasComemorativas). Casts inseguros removidos. ComparePage adiciona type assertions para compatibilidade.

Changes

Tipagem Product e simplificação de casts em CompareTableView

Layer / File(s) Summary
Imports e export de CompareEntry
src/components/compare/CompareTableView.tsx, src/components/compare/OtherSuppliersRow.tsx, src/components/compare/StockRiskBadge.tsx, src/pages/products/ComparePage.tsx
Product importado de @/types/product-catalog em todos os componentes. Interface CompareEntry exportada de CompareTableView. ComparePage passa a importar CompareEntry para type assertions.
Atualização de campos e renderização em CompareTableView
src/components/compare/CompareTableView.tsx
Campos renomeados para camelCase (minQuantity, stockStatus, isKit). Lógica de igualdade (eq) compara isKit e tags via optional chaining (tags.publicoAlvo, tags.datasComemorativas). Renderização de "Público-alvo" (até 3 badges) e "Datas comemorativas" (até 2) implementada inline. Linhas de Estoque, Fornecedor e Categoria ajustadas para novos campos.
Remoção de casts inseguros em componentes filhos
src/components/compare/CompareTableView.tsx, src/components/compare/OtherSuppliersRow.tsx, src/components/compare/StockRiskBadge.tsx
StockRiskBadge e OtherSuppliersRow passam a receber product tipado como Product direto, removendo casts as any e as Record<string, unknown>. useSupplierComparison recebe product sem conversão.
Type assertions de compatibilidade em ComparePage
src/pages/products/ComparePage.tsx
CompareTableView recebe entries e products via type assertions (as unknown as ...) para reconciliar descompasso de tipagem entre runtime (camelCase) e tipos locais. Comentário documenta a incompatibilidade pré-existente.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Justificativa: Refatoração consistente de tipos com padrão repetido entre componentes (import + type update). Campos camelCase são mecânicos. Type assertions em ComparePage isolam o problema de tipagem. Sem lógica de negócio nova nem risco de regressão em runtime (tipos já são validados na tipagem).

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed O título descreve com precisão a principal correção: regressão de tipo introduzida pelo PR #174 (camelCase em CompareTableView) e remoção de casts Record/as-any.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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/fix-compare-runtime-types

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

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.

Pull request overview

Corrige uma regressão de runtime na comparação de produtos ao realinhar o CompareTableView (e componentes auxiliares) com o tipo de runtime do catálogo (@/types/product-catalog, camelCase), removendo casts genéricos (Record<string, unknown> / as any) na cadeia-folha.

Changes:

  • CompareTableView volta a acessar campos camelCase compatíveis com o runtime (ex.: isKit, minQuantity, stockStatus) e exporta CompareEntry.
  • StockRiskBadge e OtherSuppliersRow passam a receber Product tipado do catálogo, eliminando casts genéricos e as any.
  • ComparePage passa a importar CompareEntry e adiciona uma asserção localizada ao integrar com CompareTableView.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

File Description
src/components/compare/CompareTableView.tsx Troca o Product para @/types/product-catalog, restaura acessos camelCase e remove casts genéricos em StockRiskBadge/OtherSuppliersRow.
src/components/compare/StockRiskBadge.tsx Tipagem do product como Product (catálogo) e remoção de coerções desnecessárias via Number(...).
src/components/compare/OtherSuppliersRow.tsx Tipagem do product como Product (catálogo) e remoção do as any ao chamar useSupplierComparison.
src/pages/products/ComparePage.tsx Importa CompareEntry e adiciona casts localizados para compatibilizar tipagem da página com o CompareTableView.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +375 to +383
{/* Os produtos vêm de getProductsByIds → mapPromobrindToProduct,
cujo shape de runtime é o de @/types/product-catalog (camelCase).
A tipagem local desta página os declara como @/types/product;
a asserção abaixo reconcilia esse descompasso pré-existente no
único ponto de contato com o CompareTableView (já migrado ao
tipo correto). Ver follow-up de unificação dos tipos de Product. */}
<CompareTableView
entries={compareEntries}
products={products}
entries={compareEntries as unknown as CompareEntry[]}
products={products as unknown as CompareEntry['product'][]}
@adm01-debug adm01-debug merged commit 80da684 into main May 23, 2026
28 of 31 checks passed
@adm01-debug adm01-debug deleted the claude/fix-compare-runtime-types branch May 23, 2026 21:35
adm01-debug added a commit that referenced this pull request May 23, 2026
Gate check:toast-leaks estava VERMELHO no main (78 "novas" ocorrências).
Causa: keyOf = ${file}::${line}; baseline de 2026-05-18 ficou desalinhado
após a faxina #160 (2026-05-23, -21.877 linhas) deslocar os números de
linha. Das 78: 13 drift puro de linha + restantes de 27 arquivos de
features pós-18/05 (kit-builder, intelligence, permissions, CRM, etc.).
Nenhuma introduzida pelas Etapas 9-13.

Regenera via UPDATE_BASELINE=1 (procedimento documentado no script).
176->173 entries: a #160 removeu mais toasts técnicos (código morto)
do que features novas adicionaram. check:toast-leaks volta a VERDE.

Validado contra main 80da684 (pós #176/#177): gate VERDE, 0 novas.

Divida registrada: os 173 toasts usam error.message cru — limpeza
retroativa fica como backlog dedicado.
adm01-debug added a commit that referenced this pull request May 23, 2026
Gate check:toast-leaks estava VERMELHO no main (78 "novas" ocorrências).
Causa: keyOf = ${file}::${line}; baseline de 2026-05-18 ficou desalinhado
após a faxina #160 (2026-05-23, -21.877 linhas) deslocar os números de
linha. Das 78: 13 drift puro de linha + restantes de 27 arquivos de
features pós-18/05 (kit-builder, intelligence, permissions, CRM, etc.).
Nenhuma introduzida pelas Etapas 9-13.

Regenera via UPDATE_BASELINE=1 (procedimento documentado no script).
176->173 entries: a #160 removeu mais toasts técnicos (código morto)
do que features novas adicionaram. check:toast-leaks volta a VERDE.

Validado contra main 80da684 (pós #176/#177): gate VERDE, 0 novas.

Divida registrada: os 173 toasts usam error.message cru — limpeza
retroativa fica como backlog dedicado.
adm01-debug added a commit that referenced this pull request May 23, 2026
…alog\n\nMigra ComparePage de @/types/product (snake_case) para\n@/types/product-catalog (camelCase), que casa com o shape de runtime vindo\nde getProductsByIds -> mapPromobrindToProduct. Remove a asser\u00e7\u00e3o\n'as unknown as CompareEntry[]' e o coment\u00e1rio de d\u00e9bito t\u00e9cnico do PR #177,\nagora desnecess\u00e1rios. Elimina 7 erros TSC reais.
adm01-debug added a commit that referenced this pull request May 24, 2026
…e product-catalog (-24 erros baseline) (#197)

* refactor(compare): unifica ComparePage ao tipo Product de product-catalog\n\nMigra ComparePage de @/types/product (snake_case) para\n@/types/product-catalog (camelCase), que casa com o shape de runtime vindo\nde getProductsByIds -> mapPromobrindToProduct. Remove a asser\u00e7\u00e3o\n'as unknown as CompareEntry[]' e o coment\u00e1rio de d\u00e9bito t\u00e9cnico do PR #177,\nagora desnecess\u00e1rios. Elimina 7 erros TSC reais.

* refactor(compare): unifica 6 componentes-irm\u00e3os ao tipo Product de product-catalog\n\nMigra AIComparisonAdvisor, ComparisonDuelView, ComparisonMobileView,\nComparisonPresentationLauncher, ComparisonRadarChart e FloatingCompareBar\nde @/types/product (snake_case) para @/types/product-catalog (camelCase).\nTodos j\u00e1 liam campos camelCase em runtime (minQuantity/stockStatus/colors/\nimages/supplier) \u2014 eram runtime-corretos mas type-inv\u00e1lidos. Swap puro de\nimport, sem mudan\u00e7a de l\u00f3gica. Elimina 17 erros TSC (TS2551/TS2339) reais.\nValidado same-env: 1273 -> 1249 (-24 com a ComparePage), zero regress\u00e3o.
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.

2 participants