From 0551efe69e83e501e40a7a7ce9f61989ab7a8543 Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Sun, 12 Apr 2026 11:44:32 -0400 Subject: [PATCH] fix: avoid full re-render on image upload in setup wizard Calling setState() after FileReader.onload triggered a full popup re-render which could crash or close the popup with large images. Update DOM elements in place instead, and add error handling. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/popup/components/setup-wizard.ts | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/extension/src/popup/components/setup-wizard.ts b/extension/src/popup/components/setup-wizard.ts index 934412e..c571477 100644 --- a/extension/src/popup/components/setup-wizard.ts +++ b/extension/src/popup/components/setup-wizard.ts @@ -156,11 +156,26 @@ function attachStep1Listeners(): void { const reader = new FileReader(); reader.onload = () => { - const result = reader.result as string; - // Remove the data:image/jpeg;base64, prefix. - const base64 = result.split(',')[1] ?? result; - wizardImageBase64 = base64; - setState({ error: null }); // Re-render to show "image loaded". + try { + const result = reader.result as string; + // Remove the data:image/jpeg;base64, prefix. + const base64 = result.split(',')[1] ?? result; + wizardImageBase64 = base64; + // Update UI without a full re-render to avoid resetting file input state. + const dropEl = document.getElementById('file-drop'); + if (dropEl) { + dropEl.classList.add('has-file'); + const p = dropEl.querySelector('p'); + if (p) p.textContent = `image loaded (${(file.size / 1024).toFixed(0)} KB)`; + } + const nextBtn = document.getElementById('next-btn') as HTMLButtonElement; + if (nextBtn) nextBtn.disabled = false; + } catch (err) { + setState({ error: `Failed to read image: ${err}` }); + } + }; + reader.onerror = () => { + setState({ error: 'Failed to read image file' }); }; reader.readAsDataURL(file); });