Skip to content

fix(types): useSalesGoals usa untypedFrom<SalesGoal> (-32 erros TS) — F1-1.x Onda C #4#127

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

fix(types): useSalesGoals usa untypedFrom<SalesGoal> (-32 erros TS) — F1-1.x Onda C #4#127
adm01-debug merged 1 commit into
mainfrom
fix/ts-onda-c-sales-goals-32

Conversation

@adm01-debug
Copy link
Copy Markdown
Owner

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

Onda C #4 — useSalesGoals.ts: 32 → 0 ✨

A tabela sales_goals não está nos tipos gerados do Supabase, então supabase.from("sales_goals") fazia fallback para audit_logs e cuspia 32 erros TS (TS2769:6, TS2345:5, TS2322:10, TS2339:10, TS2353:1).

✨ Fix

Usar o helper untypedFrom<T> criado no PR #125. SalesGoal interface já existe no arquivo:

// ANTES
const { data, error } = await supabase.from("sales_goals").select("*")...

// DEPOIS
import { untypedFrom } from "@/lib/supabase-untyped";
const { data, error } = await untypedFrom<SalesGoal>("sales_goals").select("*")...

Trocas:

  • 6 chamadas supabase.from("sales_goals")untypedFrom<SalesGoal>("sales_goals")
  • Adicionar import untypedFrom
  • Remover import supabase (ficou unused)

📊 Resultado

Métrica Antes Depois Delta
Total tsc errors 924 892 -32 (-3.5%)
useSalesGoals.ts 32 0 -100%

⚠️ Risk

🟢 Baixo. untypedFrom é um wrapper sobre o mesmo supabase.from() (verificado no PR #125). JS gerado é idêntico.

📋 Test plan

  • tsc total: 924 → 892 (-32) — validado localmente
  • useSalesGoals.ts: 32 → 0 erros (-100%)
  • .tsc-baseline.json regenerado
  • CI verde
  • CodeRabbit OK
  • Vercel preview funciona (página de metas de vendas)

Summary by CodeRabbit

  • Refactor
    • Melhorias internas de código para maior estabilidade da aplicação.

Review Change Stack

…1-1.x Onda C #4)

## Onda C #4 — useSalesGoals.ts: 32 → 0 erros

A tabela 'sales_goals' não está nos tipos gerados do Supabase, então
`supabase.from("sales_goals")` fazia fallback para 'audit_logs' e
cuspia 32 erros de TS2769/TS2345/TS2322/TS2339/TS2353.

## Fix

Usar `untypedFrom<SalesGoal>("sales_goals")` (helper criado no PR
#125), que recupera o tipo da row via generic. SalesGoal já estava
declarado no próprio arquivo.

Trocas:
- Adicionar import: `import { untypedFrom } from "@/lib/supabase-untyped";`
- 6 chamadas: `supabase.from("sales_goals")` → `untypedFrom<SalesGoal>("sales_goals")`
- Remover import unused do supabase

## Resultado

| Métrica | Antes | Depois | Delta |
|---|---|---|---|
| Total tsc errors | 924 | **892** | -32 (-3.5%) |
| useSalesGoals.ts | 32 | **0** | -100% ✨

## Risk

🟢 **Baixo**. `untypedFrom` chama internamente o mesmo `supabase.from()`
(verificado no PR #125). Comportamento runtime equivalente, JS gerado idêntico.

## Test plan

- [x] tsc: 924 → 892 (-32)
- [x] useSalesGoals.ts: 32 → 0
- [x] Baseline regenerado
- [ ] CI verde
- [ ] CodeRabbit OK
Copilot AI review requested due to automatic review settings May 10, 2026 01:02
@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:03am

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 10, 2026

Walkthrough

Refatoração de useSalesGoals migrando todas operações CRUD contra sales_goals de cliente Supabase tipado para helper untypedFrom. Sem alterações em interfaces públicas. Baseline TypeScript reduzida de 924 para 892 erros com remoção de entrada anterior.

Changes

Migração para Cliente Untyped

Layer / File(s) Summary
Importações e Dependências
src/hooks/useSalesGoals.ts
Import substituído de supabase tipado para untypedFrom de @/lib/supabase-untyped.
Operações de Leitura
src/hooks/useSalesGoals.ts
Queries SELECT (busca todas as metas e busca meta ativa por período) agora usam untypedFrom<SalesGoal>("sales_goals") com mesmos filtros preservados.
Operações de Escrita
src/hooks/useSalesGoals.ts
INSERT (nova meta com formatação de datas), UPDATE (progresso com recomputação de totais e status achieved_at), DELETE (por ID) migrados para untypedFrom; error handling e React Query invalidation mantidos.
Baseline TypeScript
.tsc-baseline.json
Metadata atualizado, contagem total reduzida (924→892), entrada anterior useSalesGoals.ts removida, entrada useReplenishmentsSelectionMode.ts adicionada com TS2352:1.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

  • adm01-debug/Promo_Gifts#125: Modificação do tipo retornado por untypedFrom em src/lib/supabase-untyped.ts que agora é dependência direta desta hook refatorada.
  • adm01-debug/Promo_Gifts#110: PR anterior que introduziu entrada de erro TypeScript em useSalesGoals.ts na baseline, agora removida nesta refatoração.
🚥 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
Title check ✅ Passed O título descreve com precisão a mudança principal: usar untypedFrom no useSalesGoals.ts para eliminar 32 erros TS. Específico, conciso e reflete o objetivo da PR.
Description check ✅ Passed A descrição segue o template com todas as seções essenciais preenchidas: problema explicado, solução com exemplos de código, métricas de resultado, avaliação de risco e test plan detalhado. Bem estruturada e informativa.
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-sales-goals-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

Corrige a tipagem das queries na tabela sales_goals (ausente do schema gerado do Supabase), trocando supabase.from("sales_goals") por untypedFrom<SalesGoal>("sales_goals") para eliminar o fallback incorreto para audit_logs e remover erros de TypeScript associados.

Changes:

  • Substitui 6 chamadas supabase.from("sales_goals") por untypedFrom<SalesGoal>("sales_goals") em useSalesGoals.
  • Ajusta imports removendo supabase (unused) e adicionando untypedFrom.
  • Atualiza .tsc-baseline.json refletindo a redução de erros (924 → 892) e removendo as entradas de useSalesGoals.ts.

Reviewed changes

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

File Description
src/hooks/useSalesGoals.ts Usa untypedFrom<SalesGoal> para queries em sales_goals, removendo o fallback de tipos e os erros TS associados.
.tsc-baseline.json Baseline regenerado com a redução de 32 erros TS e remoção do bloco de erros de useSalesGoals.ts.

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

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/hooks/useSalesGoals.ts`:
- Around line 143-146: Na função useSalesGoals, ajuste as mutações que
lêem/alteram/removem metas para garantir que só afetem metas do usuário
autenticado: em updateProgressMutation (onde você usa
untypedFrom<SalesGoal>("sales_goals").select(...).eq("id", goalId) e na seção de
update que faz .update(...).eq("id", goalId)) adicione .eq("user_id", user.id)
aos mesmos queries; em deleteGoalMutation, adicione .eq("user_id", user.id) ao
delete query e garanta que o usuário esteja autenticado (mesma validação usada
em createGoalMutation que verifica user/id antes de prosseguir). Isso evita
alterações/leitura de metas de outros usuários caso RLS falhe.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: a6551336-c09d-4178-b4a2-ead2ab6d1eeb

📥 Commits

Reviewing files that changed from the base of the PR and between 0489103 and 348644c.

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

Comment on lines +143 to 146
const { data: currentGoal, error: fetchError } = await untypedFrom<SalesGoal>("sales_goals")
.select("*")
.eq("id", goalId)
.single();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

cat -n src/hooks/useSalesGoals.ts

Repository: adm01-debug/Promo_Gifts

Length of output: 9028


Adicionar filtro user_id em update/delete de metas para evitar alteração fora da conta.

Em updateProgressMutation (linhas 143-146 e 162-171) e deleteGoalMutation (linha 196), o filtro está restrito apenas a id. Se houver falha de RLS no banco, isso abre brecha para atuar em metas de outro usuário.

Adicione .eq("user_id", user.id) nas queries de leitura e atualização, e valide autenticação no delete (padrão já usado em createGoalMutation nas linhas 94 e 98).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/hooks/useSalesGoals.ts` around lines 143 - 146, Na função useSalesGoals,
ajuste as mutações que lêem/alteram/removem metas para garantir que só afetem
metas do usuário autenticado: em updateProgressMutation (onde você usa
untypedFrom<SalesGoal>("sales_goals").select(...).eq("id", goalId) e na seção de
update que faz .update(...).eq("id", goalId)) adicione .eq("user_id", user.id)
aos mesmos queries; em deleteGoalMutation, adicione .eq("user_id", user.id) ao
delete query e garanta que o usuário esteja autenticado (mesma validação usada
em createGoalMutation que verifica user/id antes de prosseguir). Isso evita
alterações/leitura de metas de outros usuários caso RLS falhe.

@adm01-debug adm01-debug merged commit 8ed8163 into main May 10, 2026
18 of 19 checks passed
@adm01-debug adm01-debug deleted the fix/ts-onda-c-sales-goals-32 branch May 10, 2026 01:06
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