fix(BUG-02,BUG-05): contactId errado e dep fantasma em useQuoteBuilderState#431
Conversation
…rState BUG-02: setContactId usava quote.client_id (ID da empresa) em vez de quote.contact_id (ID do contato). Validação do step 'client' passava incorretamente com dados semanticamente errados no modo edição. BUG-05: productSearch estava nas deps do useMemo de filteredProducts mas nunca era usado no corpo do cálculo — causava re-computações desnecessárias a cada keystroke na busca de produto.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
This pull request has been ignored for the connected project Preview Branches by Supabase. |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
WalkthroughO PR corrige um bug crítico onde ChangesAjustes no hook de carregamento de orçamento
🎯 2 (Simple) | ⏱️ ~8 minutos ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7b0da62c99
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| * contactId != ''), mas semanticamente errada — contactId deveria ser o ID | ||
| * da pessoa de contato, não da empresa. | ||
| */ | ||
| setContactId((quote as Record<string, unknown>).contact_id as string || ''); |
There was a problem hiding this comment.
Load contactId from a field that actually exists
fetchQuote returns a Quote, but this code now reads quote.contact_id via a cast even though the current quote model/schema does not expose that field (see Quote in src/hooks/quotes/quoteTypes.ts and quotes.Row in src/integrations/supabase/types.ts), so contactId resolves to '' for edited quotes. Because the client step is only considered complete when both clientId and contactId are set (useQuoteBuilderState.ts line 221), edit flows lose their preselected contact and can be blocked from completing/saving unless the user manually reselects a contact (or cannot proceed at all when no contacts are available).
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Pull request overview
Este PR corrige dois problemas no hook useQuoteBuilderState relacionado ao modo edição de orçamentos e a recomputações desnecessárias na lista de produtos.
Changes:
- Ajusta o carregamento de
contactIdao abrir um orçamento em modo edição (BUG-02). - Remove uma dependência não utilizada (
productSearch) douseMemodefilteredProductspara evitar recomputações (BUG-05).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| * BUG-02 FIX: usar contact_id (ID do contato) em vez de client_id (ID da empresa). | ||
| * | ||
| * PROBLEMA ORIGINAL: setContactId recebia quote.client_id, ou seja, o ID da | ||
| * empresa. Isso fazia a validação do step 'client' passar (ambos clientId e | ||
| * contactId != ''), mas semanticamente errada — contactId deveria ser o ID | ||
| * da pessoa de contato, não da empresa. | ||
| */ | ||
| setContactId((quote as Record<string, unknown>).contact_id as string || ''); |
| useEffect(() => { | ||
| if (!isEditMode || !quoteId) return; | ||
| setLoadingQuote(true); | ||
| fetchQuote(quoteId).then((quote) => { | ||
| if (quote) { | ||
| setClientId(quote.client_id || ''); | ||
| setContactId(quote.client_id || ''); | ||
| /** | ||
| * BUG-02 FIX: usar contact_id (ID do contato) em vez de client_id (ID da empresa). | ||
| * | ||
| * PROBLEMA ORIGINAL: setContactId recebia quote.client_id, ou seja, o ID da | ||
| * empresa. Isso fazia a validação do step 'client' passar (ambos clientId e | ||
| * contactId != ''), mas semanticamente errada — contactId deveria ser o ID | ||
| * da pessoa de contato, não da empresa. | ||
| */ | ||
| setContactId((quote as Record<string, unknown>).contact_id as string || ''); | ||
| setValidUntil(quote.valid_until || format(addDays(new Date(), 30), 'yyyy-MM-dd')); |
🐛 Correção de BUG-02 e BUG-05 em
useQuoteBuilderState.tsEstes dois bugs foram identificados na auditoria de hooks (PR #427) mas o arquivo
useQuoteBuilderState.tsnão foi incluído naquele PR por omissão. Este PR corrige o pendente.BUG-02 —
contactIdpreenchido com ID da empresa (P0)Arquivo:
src/hooks/quotes/useQuoteBuilderState.tsImpacto: No modo edição de cotação,
contactIdficava com o ID da empresa em vez do ID do contato. A validação do step'client'passava incorretamente porqueclientIdecontactIderam iguais (ambos o ID da empresa), gerando dados semanticamente errados ao salvar.BUG-05 — Dependência fantasma
productSearchemfilteredProducts(P2)Impacto: Re-computações desnecessárias a cada keystroke na busca de produto.
Relacionado ao PR #427 (auditoria de hooks maio/2026).
Summary by cubic
Fixes BUG-02 and BUG-05 in
useQuoteBuilderStateto load the correctcontactIdand stop unnecessary recomputes in product filtering. This corrects client/contact validation on edit and improves search responsiveness.contactIdfromquote.contact_idinstead ofquote.client_idwhen loading a quote (BUG-02).productSearchfromuseMemodeps infilteredProductsto avoid recomputation on each keystroke (BUG-05).Written for commit 7b0da62. Summary will update on new commits. Review in cubic
Summary by CodeRabbit
Notas de Lançamento
Correções de Erros
Melhorias de Desempenho