From 4586e809d755f354a6a1874c4a18076d7f08ecf9 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Fri, 20 Mar 2026 16:36:59 -0400 Subject: [PATCH] =?UTF-8?q?fix:=20leads=20scanner=20=E2=80=94=20handle=20f?= =?UTF-8?q?alsy=20API=20result=20to=20prevent=20frozen=20'adding'=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When create_ae_obj__exhibit_tracking returns false/null (API down, network error, auth failure), the scanner was left frozen at 'adding' indefinitely. Added else branch to surface an error state in both single and multi scanners. Also fixes multi scanner which wasn't capturing the API return value at all. Co-Authored-By: Claude Sonnet 4.6 --- .../ae_comp__lead_qr_scanner.svelte | 7 ++++++- .../ae_comp__lead_qr_scanner_multi.svelte | 17 +++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__lead_qr_scanner.svelte b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__lead_qr_scanner.svelte index 0f78acd2..976c0f1e 100644 --- a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__lead_qr_scanner.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__lead_qr_scanner.svelte @@ -121,9 +121,14 @@ // Qualify mode: navigate directly to lead detail to fill in notes/qualifiers goto(`/events/${page.params.event_id}/leads/exhibit/${exhibit_id}/lead/${new_tracking_id}`); } else { - // Rapid mode: auto-reset after 2 seconds to scan the next person + // Rapid/auto mode: auto-reset after 2 seconds to scan the next person setTimeout(reset_scanner, 2000); } + } else { + // API returned false/null — network error, API down, auth failure, or duplicate. + // Surface the error rather than leaving the scanner frozen at 'adding'. + scanning_status = 'error'; + error_msg = 'Failed to add lead. Check your connection and try again.'; } } catch (e) { scanning_status = 'error'; diff --git a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__lead_qr_scanner_multi.svelte b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__lead_qr_scanner_multi.svelte index d8be603c..5c73a213 100644 --- a/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__lead_qr_scanner_multi.svelte +++ b/src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__lead_qr_scanner_multi.svelte @@ -177,17 +177,22 @@ const user_email = $events_loc.leads.auth_exhibit_kv?.[exhibit_id]?.key || 'shared_passcode'; try { - await events_func.create_ae_obj__exhibit_tracking({ + const result = await events_func.create_ae_obj__exhibit_tracking({ api_cfg: $ae_api, exhibit_id, event_badge_id: item.badge.event_badge_id_random, external_person_id: user_email, group: user_email }); - item.status = 'added'; - if (on_lead_added) on_lead_added(item.badge); - // Brief success display, then fade out - setTimeout(() => dismiss_item(item), 1000); + if (result) { + item.status = 'added'; + if (on_lead_added) on_lead_added(item.badge); + // Brief success display, then fade out + setTimeout(() => dismiss_item(item), 1000); + } else { + // API returned false/null — network error, API down, or auth failure. + item.status = 'error'; + } } catch { item.status = 'error'; } @@ -299,7 +304,7 @@
{#each batch as item (item.id)}
{#if item.status === 'loading'}