From 3750a0f6616aa369ecdb574e299810aa8c9a47d4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 11:14:54 +0000 Subject: [PATCH] =?UTF-8?q?fix(quotes):=20autosave=20resiliente=20a=20vers?= =?UTF-8?q?=C3=A3o=20hist=C3=B3rica=20corrompida?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O autosave de cotações lia todas as versões históricas do localStorage e fazia JSON.parse de cada uma SEM guarda, dentro do try/catch principal do save. Uma única versão corrompida (storage truncado por quota, adulteração ou drift de schema) lançava exceção e abortava o save inteiro → status 'error' e a cotação parava de persistir silenciosamente, com risco de perda de dados num fluxo crítico. Fix: parse defensivo por entrada — versões inválidas são ignoradas e a chave corrompida é removida do localStorage, sem afetar o save da versão nova. Gates: typecheck ✅ · lint:baseline ✅ (90 err vs baseline 107). https://claude.ai/code/session_01B2ghtor8Q4zfS5yQWCNDYW --- src/components/quotes/QuoteAutoSave.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/quotes/QuoteAutoSave.tsx b/src/components/quotes/QuoteAutoSave.tsx index 87f58d7d8..b77560acc 100644 --- a/src/components/quotes/QuoteAutoSave.tsx +++ b/src/components/quotes/QuoteAutoSave.tsx @@ -114,13 +114,19 @@ export function QuoteAutoSave({ setStatus('saving'); try { - // Obter versões anteriores + // Obter versões anteriores. Uma versão histórica corrompida (storage + // truncado por quota, adulteração, drift de schema) NÃO deve abortar o + // autosave inteiro — senão a cotação para de persistir silenciosamente. + // Parse defensivo por entrada: ignora e remove a chave inválida. const existingDrafts: QuoteDraft[] = []; for (let i = 0; i < localStorage.length; i++) { const key = localStorage.key(i); if (key?.startsWith(storageKey + '_v')) { - const draft = JSON.parse(localStorage.getItem(key) || ''); - existingDrafts.push(draft); + try { + existingDrafts.push(JSON.parse(localStorage.getItem(key) || '') as QuoteDraft); + } catch { + localStorage.removeItem(key); + } } }