From 9b471f66398570dc1e04c4ba7925d53767eacef8 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Wed, 24 Jun 2026 14:10:16 -0400 Subject: [PATCH] refactor: consolidate obscure_email and browser reset into shared utilities - Remove 6 local copies of obscure_email(); all now use ae_util.obscure_email() (badges list, badge review, badge print, presenter list, presenter detail, session view) - badge review page: add missing ae_util import - e_app_sys_bar: replace inline IDB/storage clear implementations with core_func.clear_idb() and core_func.clear_all_storage(); adds known-names fallback the inline version lacked - fix-sw page: replace 110-line inline nuke with core_func.clear_all_storage(log_callback); step-by-step logging and countdown UI preserved via BrowserResetLogFn callback Co-Authored-By: Claude Sonnet 4.6 --- src/lib/app_components/e_app_sys_bar.svelte | 26 +--- .../badges/[badge_id]/print/+page.svelte | 8 +- .../badges/[badge_id]/review/+page.svelte | 9 +- .../badges/ae_comp__badge_obj_li.svelte | 17 +-- .../presenter/[presenter_id]/+page.svelte | 10 +- .../ae_comp__event_presenter_obj_li.svelte | 10 +- .../[session_id]/ae_comp__session_view.svelte | 10 +- src/routes/testing/fix-sw/+page.svelte | 121 +----------------- 8 files changed, 21 insertions(+), 190 deletions(-) diff --git a/src/lib/app_components/e_app_sys_bar.svelte b/src/lib/app_components/e_app_sys_bar.svelte index b3e349dc..81010dc6 100644 --- a/src/lib/app_components/e_app_sys_bar.svelte +++ b/src/lib/app_components/e_app_sys_bar.svelte @@ -37,6 +37,7 @@ import { User } from '@lucide/svelte'; import { ae_loc, ae_sess } from '$lib/stores/ae_stores'; +import { core_func } from '$lib/ae_core/ae_core_functions'; import Element_access_type from '$lib/app_components/e_app_access_type.svelte'; import Element_sign_in_out from '$lib/app_components/e_app_sign_in_out.svelte'; @@ -91,18 +92,11 @@ async function handle_clear_idb_only() { ) ) return; - const db_list = await indexedDB.databases(); - console.log('[clear_idb] IDB databases found:', db_list.map((d) => d.name)); - for (const db of db_list) { - if (db.name) indexedDB.deleteDatabase(db.name); - } + await core_func.clear_idb(); window.location.reload(); } // ── Dev: full reset — SW + Cache Storage + IDB + localStorage/sessionStorage ── -// SW and Cache Storage MUST be cleared here. Clearing IDB/localStorage alone leaves -// the SW serving old JS bundles from its own Cache Storage on the next reload, -// which means the user stays stuck on old code. Order: SW → cache → IDB → storage. async function handle_clear_storage_and_idb() { if ( !confirm( @@ -110,21 +104,7 @@ async function handle_clear_storage_and_idb() { ) ) return; - - if ('serviceWorker' in navigator) { - const registrations = await navigator.serviceWorker.getRegistrations(); - for (const reg of registrations) await reg.unregister(); - } - const cache_keys = await caches.keys(); - for (const key of cache_keys) await caches.delete(key); - - const db_list = await indexedDB.databases(); - console.log('[clear_all] IDB databases found:', db_list.map((d) => d.name)); - for (const db of db_list) { - if (db.name) indexedDB.deleteDatabase(db.name); - } - localStorage.clear(); - sessionStorage.clear(); + await core_func.clear_all_storage(); window.location.reload(); } diff --git a/src/routes/events/[event_id]/(badges)/badges/[badge_id]/print/+page.svelte b/src/routes/events/[event_id]/(badges)/badges/[badge_id]/print/+page.svelte index 09e9b3d2..1e413e5f 100644 --- a/src/routes/events/[event_id]/(badges)/badges/[badge_id]/print/+page.svelte +++ b/src/routes/events/[event_id]/(badges)/badges/[badge_id]/print/+page.svelte @@ -76,12 +76,6 @@ function build_review_url(): string { return `/events/${$lq__event_badge_obj?.event_id}/badges/${$lq__event_badge_obj?.event_badge_id}/review`; } -function obscure_email(email: string | null | undefined): string { - if (!email) return ''; - const at = email.indexOf('@'); - if (at < 0) return email; - return `${email.slice(0, Math.min(3, at))}***${email.slice(at)}`; -} // TODO: replace alert with actual email API call when available function send_review_email() { @@ -92,7 +86,7 @@ function send_review_email() { `${badge?.given_name ?? ''} ${badge?.family_name ?? ''}`.trim(); const email = is_trusted ? (badge?.email ?? '(no email on file)') - : obscure_email(badge?.email); + : ae_util.obscure_email(badge?.email); const event_name = EVENTS_MODULE_TITLE; alert( `PLACEHOLDER: An email will be sent to ${name} at ${email}. Use that link to review your ${event_name} badge.` diff --git a/src/routes/events/[event_id]/(badges)/badges/[badge_id]/review/+page.svelte b/src/routes/events/[event_id]/(badges)/badges/[badge_id]/review/+page.svelte index 6e9e4c65..91b57e02 100644 --- a/src/routes/events/[event_id]/(badges)/badges/[badge_id]/review/+page.svelte +++ b/src/routes/events/[event_id]/(badges)/badges/[badge_id]/review/+page.svelte @@ -24,6 +24,7 @@ import { untrack } from 'svelte'; import { liveQuery } from 'dexie'; import { ae_loc } from '$lib/stores/ae_stores'; +import { ae_util } from '$lib/ae_utils/ae_utils'; import { db_events } from '$lib/ae_events/db_events'; import { EVENTS_MODULE_TITLE } from '$lib/stores/ae_events_stores'; import { events_func } from '$lib/ae_events/ae_events_functions'; @@ -158,12 +159,6 @@ async function copy_review_link() { } } -function obscure_email(email: string | null | undefined): string { - if (!email) return ''; - const at = email.indexOf('@'); - if (at < 0) return email; - return `${email.slice(0, Math.min(3, at))}***${email.slice(at)}`; -} // TODO: replace alert with actual email API call when available function send_review_email() { @@ -174,7 +169,7 @@ function send_review_email() { `${badge?.given_name ?? ''} ${badge?.family_name ?? ''}`.trim(); const email = is_trusted ? (badge?.email ?? '(no email on file)') - : obscure_email(badge?.email); + : ae_util.obscure_email(badge?.email); const event_name = EVENTS_MODULE_TITLE; alert( `PLACEHOLDER: An email will be sent to ${name} at ${email}. Use that link to review your ${event_name} badge.` diff --git a/src/routes/events/[event_id]/(badges)/badges/ae_comp__badge_obj_li.svelte b/src/routes/events/[event_id]/(badges)/badges/ae_comp__badge_obj_li.svelte index c62dbafd..d42c2e8b 100644 --- a/src/routes/events/[event_id]/(badges)/badges/ae_comp__badge_obj_li.svelte +++ b/src/routes/events/[event_id]/(badges)/badges/ae_comp__badge_obj_li.svelte @@ -52,17 +52,6 @@ let is_manager = $derived($ae_loc.manager_access === true); let is_public = $derived($ae_loc.public_access === true); // public passcode or higher — may print first prints let is_edit_mode = $derived($ae_loc.edit_mode === true); -/** - * Obscures an email address for display to non-trusted users. - * e.g. john.doe@example.com → joh***@example.com - */ -function obscure_email(email: string | null | undefined): string { - if (!email) return ''; - const at = email.indexOf('@'); - if (at < 0) return email; - const visible = email.slice(0, Math.min(3, at)); - return `${visible}***${email.slice(at)}`; -} function build_review_url(event_badge_obj: any): string { // TODO: append ?passcode=... when person_passcode is added to the event_badge schema @@ -96,7 +85,7 @@ function do_send_review_email(event_badge_obj: any) { `${event_badge_obj?.given_name ?? ''} ${event_badge_obj?.family_name ?? ''}`.trim(); const email = is_trusted ? (event_badge_obj?.email ?? '(no email on file)') - : obscure_email(event_badge_obj?.email); + : ae_util.obscure_email(event_badge_obj?.email); const event_name = EVENTS_MODULE_TITLE; alert( `PLACEHOLDER: An email will be sent to ${name} at ${email}. Use that link to review your ${event_name} badge.` @@ -243,7 +232,7 @@ let visible_badge_obj_li = $derived( > {is_trusted ? event_badge_obj.email - : obscure_email(event_badge_obj.email)} + : ae_util.obscure_email(event_badge_obj.email)} {/if} @@ -315,7 +304,7 @@ let visible_badge_obj_li = $derived( "> {is_trusted ? event_badge_obj.email - : obscure_email(event_badge_obj.email)} + : ae_util.obscure_email(event_badge_obj.email)} {/if} diff --git a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte index aeda5fda..1a98a0d7 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/presenter/[presenter_id]/+page.svelte @@ -185,12 +185,6 @@ let presenter_sign_in_url = $derived((() => { // *** Functions and Logic -function obscure_email(email: string | null | undefined): string { - if (!email) return ''; - const at = email.indexOf('@'); - if (at < 0) return email; - return `${email.slice(0, Math.min(3, at))}***${email.slice(at)}`; -} @@ -335,7 +329,7 @@ function obscure_email(email: string | null | undefined): string { } const display_email = $ae_loc.trusted_access ? use_email - : obscure_email(use_email); + : ae_util.obscure_email(use_email); if (!confirm(`This will send the sign in email to ${display_email}`)) { return; } @@ -366,7 +360,7 @@ function obscure_email(email: string | null | undefined): string { }); }} class="btn btn-sm preset-tonal-secondary border-secondary-500 hover:preset-filled-secondary-500 m-0.25 border" - title="Email the access link to {$lq__event_presenter_obj?.full_name ?? 'presenter'} ({$ae_loc.trusted_access ? ($lq__event_presenter_obj?.person_primary_email ?? $lq__event_presenter_obj?.email ?? 'no email on file') : obscure_email($lq__event_presenter_obj?.person_primary_email ?? $lq__event_presenter_obj?.email)})"> + title="Email the access link to {$lq__event_presenter_obj?.full_name ?? 'presenter'} ({$ae_loc.trusted_access ? ($lq__event_presenter_obj?.person_primary_email ?? $lq__event_presenter_obj?.email ?? 'no email on file') : ae_util.obscure_email($lq__event_presenter_obj?.person_primary_email ?? $lq__event_presenter_obj?.email)})"> Email Access Link diff --git a/src/routes/events/[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li.svelte b/src/routes/events/[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li.svelte index 2704c03d..2b38cafc 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/presenter/ae_comp__event_presenter_obj_li.svelte @@ -68,12 +68,6 @@ let ae_tmp: key_val = $state({}); // *** Functions and Logic -function obscure_email(email: string | null | undefined): string { - if (!email) return ''; - const at = email.indexOf('@'); - if (at < 0) return email; - return `${email.slice(0, Math.min(3, at))}***${email.slice(at)}`; -}
@@ -210,7 +204,7 @@ function obscure_email(email: string | null | undefined): string { } const display_email = $ae_loc.trusted_access ? use_email - : obscure_email(use_email); + : ae_util.obscure_email(use_email); if (!confirm(`This will send the access link email to ${event_presenter_obj.full_name ?? 'this presenter'} (${display_email})?`)) { return; } @@ -241,7 +235,7 @@ function obscure_email(email: string | null | undefined): string { }} class="btn preset-tonal-secondary border-secondary-500 hover:preset-filled-secondary-500 my-0.5 border transition-all hover:transition-all" class:btn-sm={display_mode != 'default'} - title="Email the access link to {event_presenter_obj.full_name ?? 'presenter'} ({$ae_loc.trusted_access ? (event_presenter_obj.person_primary_email ?? event_presenter_obj.email ?? 'no email on file') : obscure_email(event_presenter_obj.person_primary_email ?? event_presenter_obj.email)})"> + title="Email the access link to {event_presenter_obj.full_name ?? 'presenter'} ({$ae_loc.trusted_access ? (event_presenter_obj.person_primary_email ?? event_presenter_obj.email ?? 'no email on file') : ae_util.obscure_email(event_presenter_obj.person_primary_email ?? event_presenter_obj.email)})"> Email Access Link diff --git a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__session_view.svelte b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__session_view.svelte index 87dadfe4..658875a4 100644 --- a/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__session_view.svelte +++ b/src/routes/events/[event_id]/(pres_mgmt)/session/[session_id]/ae_comp__session_view.svelte @@ -191,19 +191,13 @@ $effect(() => { } }); -function obscure_email(email: string | null | undefined): string { - if (!email) return ''; - const at = email.indexOf('@'); - if (at < 0) return email; - return `${email.slice(0, Math.min(3, at))}***${email.slice(at)}`; -} async function send_poc_email_link() { const sess = $lq__event_session_obj; if (!sess?.poc_person_primary_email) return; const display_email = $ae_loc.trusted_access ? sess.poc_person_primary_email - : obscure_email(sess.poc_person_primary_email); + : ae_util.obscure_email(sess.poc_person_primary_email); if (!confirm(`Send sign-in link to ${sess.poc_person_full_name} (${display_email})?`)) return; poc_email_status = 'sending'; try { @@ -498,7 +492,7 @@ async function send_poc_email_link() { type="button" disabled={poc_email_status === 'sending'} onclick={send_poc_email_link} - title="Email the sign-in link to {pres_mgmt_loc.current.label__session_poc_name}: {$lq__event_session_obj?.poc_person_full_name} ({$ae_loc.trusted_access ? $lq__event_session_obj?.poc_person_primary_email : obscure_email($lq__event_session_obj?.poc_person_primary_email)})" + title="Email the sign-in link to {pres_mgmt_loc.current.label__session_poc_name}: {$lq__event_session_obj?.poc_person_full_name} ({$ae_loc.trusted_access ? $lq__event_session_obj?.poc_person_primary_email : ae_util.obscure_email($lq__event_session_obj?.poc_person_primary_email)})" class="btn btn-sm preset-outlined-secondary-300-700 transition-all duration-200" class:preset-tonal-secondary={poc_email_status === 'idle'} class:preset-tonal-warning={poc_email_status === 'sending'} diff --git a/src/routes/testing/fix-sw/+page.svelte b/src/routes/testing/fix-sw/+page.svelte index 0dfe21c7..359634bb 100644 --- a/src/routes/testing/fix-sw/+page.svelte +++ b/src/routes/testing/fix-sw/+page.svelte @@ -1,6 +1,7 @@