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 @@