fix(types): useSalesGoals usa untypedFrom<SalesGoal> (-32 erros TS) — F1-1.x Onda C #4#127
Conversation
…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
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
WalkthroughRefatoração de ChangesMigração para Cliente Untyped
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
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")poruntypedFrom<SalesGoal>("sales_goals")emuseSalesGoals. - Ajusta imports removendo
supabase(unused) e adicionandountypedFrom. - Atualiza
.tsc-baseline.jsonrefletindo a redução de erros (924 → 892) e removendo as entradas deuseSalesGoals.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.
There was a problem hiding this comment.
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
📒 Files selected for processing (2)
.tsc-baseline.jsonsrc/hooks/useSalesGoals.ts
| const { data: currentGoal, error: fetchError } = await untypedFrom<SalesGoal>("sales_goals") | ||
| .select("*") | ||
| .eq("id", goalId) | ||
| .single(); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
cat -n src/hooks/useSalesGoals.tsRepository: 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.
…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%)**
Onda C #4 — useSalesGoals.ts: 32 → 0 ✨
A tabela
sales_goalsnão está nos tipos gerados do Supabase, entãosupabase.from("sales_goals")fazia fallback paraaudit_logse cuspia 32 erros TS (TS2769:6, TS2345:5, TS2322:10, TS2339:10, TS2353:1).✨ Fix
Usar o helper
untypedFrom<T>criado no PR #125.SalesGoalinterface já existe no arquivo:Trocas:
supabase.from("sales_goals")→untypedFrom<SalesGoal>("sales_goals")untypedFromsupabase(ficou unused)📊 Resultado
🟢 Baixo.
untypedFromé um wrapper sobre o mesmosupabase.from()(verificado no PR #125). JS gerado é idêntico.📋 Test plan
.tsc-baseline.jsonregeneradoSummary by CodeRabbit