Skip to content

fix(types): useGravacaoV2 tipa rpc/external-db results (-32 erros TS) — F1-1.x Onda C #5#128

Merged
adm01-debug merged 1 commit into
mainfrom
fix/ts-onda-c-gravacao-32
May 10, 2026
Merged

fix(types): useGravacaoV2 tipa rpc/external-db results (-32 erros TS) — F1-1.x Onda C #5#128
adm01-debug merged 1 commit into
mainfrom
fix/ts-onda-c-gravacao-32

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

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

Onda C #5 — useGravacaoV2.ts: 32 → 0 ✨

Dois problemas distintos, ambos com mesmo padrão (Record<string, unknown> que vira unknown/{} em todo acesso):

1) Tabela tabela_preco_gravacao_oficial sem tipo

invokeExternalDb<Record<string, unknown>> devolvia records com campos unknownt.id, t.nome, t.codigo_curto, t.codigo_tabela viraram TS2322/TS2339.

Fix: tipo auxiliar TecnicaRow.

2) RPC fn_get_customization_price retorna estrutura aninhada

O RPC retorna { area, faixa, tabela, parametros, custos, precos, ... } mas estava tipado como Record<string, unknown>rawResult.area?.id virava {}.

Fix: tipo auxiliar RpcCustomizationPriceResult com a estrutura completa documentada (extraída do código que já lia esses campos).

📊 Resultado

Métrica Antes Depois Delta
Total tsc errors 892 860 -32 (-3.6%)
useGravacaoV2.ts 32 0 -100%

⚠️ Risk

🟢 Baixo. Tipos refletem o schema real (verificados contra uso no próprio arquivo). Comportamento runtime equivalente — JS gerado idêntico.

📋 Test plan

  • tsc total: 892 → 860 (-32) — validado localmente
  • useGravacaoV2.ts: 32 → 0 erros (-100%)
  • .tsc-baseline.json regenerado
  • CI verde
  • CodeRabbit OK
  • Vercel preview funciona (cálculo de preço de gravação/personalização)

Summary by CodeRabbit

Refactor

  • Otimizações internas que reduziram erros de compilação de 892 para 860, contribuindo para maior estabilidade e confiabilidade da aplicação durante o processo de build.

Review Change Stack

… F1-1.x Onda C #5)

## Onda C #5 — useGravacaoV2.ts: 32 → 0 erros

Dois problemas independentes no arquivo:

### 1) Tabela tabela_preco_gravacao_oficial sem tipo

`invokeExternalDb<Record<string, unknown>>(...)` devolvia records com
campos `unknown`, então `t.id`, `t.nome`, `t.codigo_curto`,
`t.codigo_tabela` davam TS2322/TS2339.

Fix: tipo auxiliar `TecnicaRow`:
- `id: string; nome: string; codigo_curto: string | null; codigo_tabela: string | null`

### 2) RPC fn_get_customization_price com retorno object aninhado

O RPC retorna estrutura aninhada (rawResult.area, rawResult.faixa,
rawResult.tabela, rawResult.parametros, rawResult.custos,
rawResult.precos), mas estava tipado como `Record<string, unknown>` —
todo acesso `rawResult.area?.id` virava `{}`.

Fix: tipo auxiliar `RpcCustomizationPriceResult` com a estrutura
completa documentada inline.

## Resultado

| Métrica | Antes | Depois | Delta |
|---|---|---|---|
| Total tsc errors | 892 | **860** | -32 (-3.6%) |
| useGravacaoV2.ts | 32 | **0** | **-100%** ✨

## Risk

🟢 **Baixo**. Tipos refletem o schema real:
- `tabela_preco_gravacao_oficial`: campos verificados no uso real
- RPC structure: extraída do código que processa `rawResult` 5 linhas
  abaixo; só formaliza o que já era assumido implicitamente

Comportamento runtime equivalente — JS gerado idêntico.
Copilot AI review requested due to automatic review settings May 10, 2026 01:12
@vercel
Copy link
Copy Markdown

vercel Bot commented May 10, 2026

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

Project Deployment Actions Updated (UTC)
promo-gifts Ready Ready Preview, Comment May 10, 2026 1:13am

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 10, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 30f89ee1-f8c5-4bcc-a847-73c9b8c62bc4

📥 Commits

Reviewing files that changed from the base of the PR and between 8ed8163 and b8ac7f7.

📒 Files selected for processing (2)
  • .tsc-baseline.json
  • src/hooks/useGravacaoV2.ts

Walkthrough

Mudanças focadas em tipagem TypeScript para hooks de cálculo de preços de gravação. Novos tipos locais (TecnicaRow, RpcCustomizationPriceResult) tipificam resultados de consultas externas ao banco de dados e chamadas RPC, eliminando casts genéricos. Baseline de erros do compilador atualizado refletindo a redução de 32 erros.

Changes

Tipagem de Hooks de Gravação

Layer / File(s) Resumo
Definições de Tipos
src/hooks/useGravacaoV2.ts
Novos tipos TecnicaRow e RpcCustomizationPriceResult definem a forma exata dos dados retornados por chamadas externas ao banco de dados e RPC.
Aplicação de Tipos nos Hooks
src/hooks/useGravacaoV2.ts
useProductPrintAreas e useCustomizationPriceLegacy agora chamam invokeExternalDb e invokeExternalRpc com tipos específicos, construindo mapas com valores tipificados diretos.
Atualização de Baseline
.tsc-baseline.json
Baseline do compilador TypeScript atualizado: generatedAt renovado, totalErrors reduzido de 892 para 860, entrada de useGravacaoV2.ts removida, entrada de useGravacaoPriceV2.ts adicionada.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • adm01-debug/Promo_Gifts#110: Ambos os PRs modificam .tsc-baseline.json atualizando generatedAt e contagens de erros TypeScript por arquivo, indicando ajustes no baseline do compilador relacionados.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.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
Title check ✅ Passed O título é claro e específico sobre a mudança principal: fix de tipos no useGravacaoV2 que reduz erros TS em 32, com referência ao contexto (F1-1.x Onda C).
Description check ✅ Passed A descrição segue o template com seções bem definidas (Descrição, Tipo, Issue, Checklist, Resultado, Risk, Test plan), embora o template não tenha sido preenchido formalmente.
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 fix/ts-onda-c-gravacao-32

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

Copy link
Copy Markdown

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

Reduces TypeScript errors by replacing Record<string, unknown> with explicit result shapes for external-db table queries and the fn_get_customization_price RPC inside useGravacaoV2, then updates the TypeScript baseline accordingly.

Changes:

  • Added TecnicaRow and RpcCustomizationPriceResult helper types to strongly-type invokeExternalDb / invokeExternalRpc results in useGravacaoV2.ts.
  • Updated useProductPrintAreas and useCustomizationPriceLegacy to use the new generic types (eliminating 32 TS errors in this file).
  • Regenerated .tsc-baseline.json to reflect the reduced error count and removal of useGravacaoV2.ts entries.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
src/hooks/useGravacaoV2.ts Introduces typed result shapes for external DB/RPC calls to remove unknown-property TS errors.
.tsc-baseline.json Updates baseline totals and removes resolved useGravacaoV2.ts error entries.

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

const techResult = await invokeExternalDb<Record<string, unknown>>({
const techResult = await invokeExternalDb<TecnicaRow>({
table: 'tabela_preco_gravacao_oficial',
operation: 'select',

// Shape returned by RPC fn_get_customization_price.
type RpcCustomizationPriceResult = {
success: boolean;
faixa?: {
ordem: number;
quantidade_minima: number;
quantidade_maxima: number;
@adm01-debug adm01-debug merged commit 7ebffee into main May 10, 2026
21 of 22 checks passed
@adm01-debug adm01-debug deleted the fix/ts-onda-c-gravacao-32 branch May 10, 2026 01:54
adm01-debug added a commit that referenced this pull request May 10, 2026
## Onda C #6 — techniques.ts: 19 → 0 erros

Mesmo padrão do products.ts (#126) e useGravacaoV2.ts (#128): tipos
auxiliares para records do bridge externo + correções incrementais
em campos null vs undefined.

## Fix

1) **Tipo TechniqueRawRow** (mesmo do useGravacaoV2):
   - id, codigo, code, nome, name, descricao, description, etc.

2) **Trocas no invokeExternalDb**:
   - `<Record<string, unknown>>` → `<TechniqueRawRow>` em fetchPromobrindPrintAreas
   - `<PromobrindTechnique>` → `<TechniqueRawRow>` em fetchPromobrindTechniques e
     fetchPromobrindTechniqueById (depois mapTechniqueFields converte)

3) **Map<string, TechniqueRawRow>** explícito.

4) **`undefined as unknown` → `null`** nos casts de pre-fix
   (technique_id, technique_code, technique_name, max_colors,
   area_image_url) — agora compatíveis com `string | null` /
   `number | null` da interface PromobrindPrintArea.

5) **Interface PromobrindTechnique aceita null** em campos:
   requires_color_count, price_by_color, price_by_area, is_active,
   display_order. Antes eram `?: boolean`/`number` — incompatíveis com
   o resultado real do mapTechniqueFields que retorna `?? null`.

6) **Fallbacks adicionais**:
   - `code: (t.codigo ?? t.code) ?? undefined` (interface tem code?: string)
   - `name: (t.nome ?? t.name) ?? ''` (interface tem name: string)
   - `tech?.id ?? tid` em vez de `tech?.id || tid`
   - `(result.records || []).map(...)` defensive

## Resultado

| Métrica | Antes | Depois | Delta |
|---|---|---|---|
| Total tsc errors | 851 | **841** | -10 (-1.2%) |
| techniques.ts | 19 | **0** | **-100%** ✨

(Apenas -10 no total porque o baseline anterior já considerava parte
dos erros eliminados pelos PRs em paralelo — +1 noise.)

## Risk

🟢 **Baixo**. Tipos refletem o schema real (mesmo TechniqueRawRow do
useGravacaoV2 que já passou em produção). `undefined as unknown` → `null`
é semanticamente equivalente em runtime (ambos serializam pra null em JSON).

Comportamento runtime equivalente — JS gerado idêntico.
adm01-debug added a commit that referenced this pull request May 10, 2026
…F1-1.x Onda C #7) [encerramento] (#137)

## Onda C #7 — encerramento da F1-1.x

MockupGenerator.tsx tinha 29 erros TS distribuídos em 4 categorias.
Resolvidos com fixes cirúrgicos em 7 arquivos.

## Fixes aplicados

### 1. `MockupGenerator.tsx` (29 erros)

**a)** `selectedColor.name/hex` → `colorName/colorHex` (5x)
   MockupProductSelection nunca teve `selectedColor` — só
   `colorName` e `colorHex` flat. Código antigo era bug latente.

**b)** `tech.name` → `tech.name ?? ''` (1x)
   MockupTechnique.name é opcional (`?: string`). Destino exige string.

**c)** `pantoneMatch?.name` → `pantoneMatch?.pantoneCode` (1x)
   PantoneMatch tem `{ pantoneCode, pantoneHex, deltaE }` — nunca
   teve `name`. Era acesso a campo inexistente em runtime.

**d)** Guards `'maxWidth' in mg.selectedTechnique` (5x linhas 313-314, 342-344)
   useMockupGenerator narrows para `Technique | TechniqueWithLimits`.
   Só TechniqueWithLimits tem maxWidth/maxHeight/locationName.

**e)** Cast `as MockupTechnique` em useTechniqueHandlers args (2x)
   useMockupGenerator emite `Technique|TechniqueWithLimits`,
   useTechniqueHandlers consome `MockupTechnique`. Compatíveis
   estruturalmente, TS não consegue widen `Dispatch<SetStateAction<T>>`.

**f)** Wrappers de variancia em `onTechniqueSelect` e
   `handleTechniqueChange(tech)` (2x) — adapter functions.

**g)** Acessos a `metadata.height_mm/width_mm` (8x) — corrigido em #2.

### 2. `product-catalog.ts` — adicionar `metadata`

Campo opcional em Product:
`metadata?: { height_mm?: number|null; width_mm?: number|null;
  [key: string]: unknown } | null`

Reflete o JSONB real do banco (legacy). Acessos antes eram falhas de tipo,
embora o runtime já tolerasse (optional chaining).

### 3. `useMockupTechniques.ts` — Technique extends index signature

Adicionada `[key: string]: unknown` em interface Technique.
Permite atribuição estrutural a MockupTechnique (que tem o mesmo).

### 4. `AIMockupAssistant.tsx` — adicionar prop `onApplySuggestion`

Componente expunha legacy `onSuggestionApply: (type, value) => void`.
Adicionada nova `onApplySuggestion: (suggestion: {techniqueId?, position?, ...}) => void`
que MockupGenerator já estava usando. Antiga mantida pra back-compat.

### 5. `MultiAreaManager.tsx` — `logoFile` em PersonalizationArea

Campo opcional `logoFile?: File | null` adicionado. Já era usado em
`updateActiveArea({ logoPreview: null, logoFile: null })`.

### 6. `MockupHistoryPanel.tsx` — usa GeneratedMockup do SSOT

Removida interface local duplicada (20 linhas), substituída por
`import type { GeneratedMockup } from '@/hooks/mockup/mockupGenerationService'`.
Também: handleSetViewMode aceita 3 modos (`grid|list|table`) e
mapeia `table → list` (compat com LayoutPopover que tem 3).

### 7. `MockupLightbox.tsx` — usa GeneratedMockup do SSOT

Mesma deduplicação. Interface local removida.

## Resultado

| Métrica | Antes | Depois | Δ |
|---|---|---|---|
| Total tsc errors | 841 | **811** | **-30 (-3.6%)** |
| MockupGenerator.tsx | 29 | **0** | **-100%** ✨
| MockupHistoryPanel.tsx | 0 | 0 | (sem regressão) |
| MockupLightbox.tsx | 0 | 0 | (sem regressão) |
| MultiAreaManager.tsx | 0 | 0 | (sem regressão) |
| useMockupTechniques.ts | 0 | 0 | (sem regressão) |
| AIMockupAssistant.tsx | 0 | 0 | (sem regressão) |
| product-catalog.ts | 0 | 0 | (sem regressão) |

## Risk

🟢 **Baixo**. Todas as mudanças são tipo-only ou refletem o schema/runtime real:
- selectedColor → colorName/colorHex era bug existente (corrige acesso a campo inexistente)
- pantoneMatch?.name → pantoneCode era bug existente (corrige acesso a campo inexistente)
- metadata em Product reflete JSONB real
- logoFile já era passado em runtime
- GeneratedMockup deduplicação remove drift entre 3 cópias

JS gerado equivalente em 95%+ dos casos. Pequenas mudanças semânticas:
- `tech.code || undefined` vs `tech.code ?? ''` — empty string vs undefined em
  edge case de techniqueCode vazio. Aceito porque destino tipa como string.

## Encerramento da Onda C

Sequência completa F1-1.x Onda C (-403 erros):
- #124 lazyWithRetry            -67
- #125 untypedFrom               -105
- #126 products.ts               -36
- #127 useSalesGoals             -32
- #128 useGravacaoV2             -32
- #129 techniques.ts             -10
- **#7 MockupGenerator (este)   -30** ← agora

TS baseline F1: **1214 → 811 (-33%)**
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