From 1b8f6efc39b0fde7fb0409514fe224b0a1cf111f Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Wed, 24 Jun 2026 14:30:53 -0400 Subject: [PATCH] feat(core): add preserve_ls_keys and skip_ls options to clear_all_storage; update Clear & Reload buttons core__browser_reset: - clear_all_storage now accepts options: { preserve_ls_keys?, skip_ls? } - preserve_ls_keys: saves named localStorage keys before clearing and restores them after (use ['ae_loc'] to keep the user signed in through a full reset) - skip_ls: skips localStorage and sessionStorage entirely (for SW+Cache+IDB-only resets that should not disturb auth state) journals/+layout.svelte: - Replaced 60-line inline onclick with core_func.clear_idb() + ae_loc preserve pattern - Hardcoded indexedDB.deleteDatabase() name list replaced with core_func.clear_idb() (gets indexedDB.databases() enumeration + older-browser fallback automatically) - Non-edit mode: IDB clear + reload; edit mode: IDB + localStorage (ae_loc preserved) + goto('/') e_app_help_tech + +page.svelte Clear & Reload buttons: - Replaced inline SW/Cache/IDB/localStorage logic with core_func.clear_all_storage() - Non-edit: skip_ls=true (SW+Cache+IDB only; sign-in preserved naturally) - Edit mode: preserve_ls_keys=['ae_loc'] (full clear; sign-in survives the wipe) Co-Authored-By: Claude Sonnet 4.6 --- src/lib/ae_core/core__browser_reset.ts | 62 ++++++++++++------ src/lib/app_components/e_app_help_tech.svelte | 28 ++------ src/routes/+page.svelte | 25 ++----- src/routes/journals/+layout.svelte | 65 ++++--------------- 4 files changed, 67 insertions(+), 113 deletions(-) diff --git a/src/lib/ae_core/core__browser_reset.ts b/src/lib/ae_core/core__browser_reset.ts index d9a790c4..0e8e21e8 100644 --- a/src/lib/ae_core/core__browser_reset.ts +++ b/src/lib/ae_core/core__browser_reset.ts @@ -63,11 +63,20 @@ export async function clear_idb(log?: BrowserResetLogFn): Promise { * * Does not reload — caller decides whether to navigate after (e.g. window.location.href = '/'). * - * @param log Optional progress callback. Receives each step message and a severity level. - * Use this to surface step-by-step feedback to the user (e.g. the fix-sw page). - * Omit for silent operation (e.g. the sys bar reset buttons). + * @param log Optional progress callback. Receives each step message and a severity level. + * Use this to surface step-by-step feedback to the user (e.g. the fix-sw page). + * Omit for silent operation (e.g. the sys bar reset buttons). + * @param options Optional behavior overrides. + * - preserve_ls_keys: localStorage keys to save before clearing and restore after. + * Use ['ae_loc'] to keep the user signed in through the reset. + * - skip_ls: if true, skip clearing localStorage and sessionStorage entirely. + * Use this for "Clear & Reload" style resets that only need SW+Cache+IDB + * cleared (non-destructive to auth state — no ae_loc preservation needed). */ -export async function clear_all_storage(log?: BrowserResetLogFn): Promise { +export async function clear_all_storage( + log?: BrowserResetLogFn, + options?: { preserve_ls_keys?: string[]; skip_ls?: boolean } +): Promise { if (!browser) return; log?.('Starting full storage reset...', 'info'); @@ -110,21 +119,36 @@ export async function clear_all_storage(log?: BrowserResetLogFn): Promise // 3. Clear all IndexedDB databases (handles enumeration + fallback internally) await clear_idb(log); - // 4. Clear localStorage - try { - const local_count = localStorage.length; - localStorage.clear(); - log?.(`Cleared localStorage (${local_count} item(s)).`, 'ok'); - } catch (err: any) { - log?.(`ERROR clearing localStorage: ${err.message}`, 'error'); - } + if (options?.skip_ls) { + log?.('Skipping localStorage and sessionStorage (skip_ls=true).', 'info'); + } else { + // 4. Clear localStorage (saving and restoring any keys that should survive the reset) + try { + const local_count = localStorage.length; + const preserved: Record = {}; + for (const key of options?.preserve_ls_keys ?? []) { + const val = localStorage.getItem(key); + if (val !== null) preserved[key] = val; + } + localStorage.clear(); + for (const [key, val] of Object.entries(preserved)) { + localStorage.setItem(key, val); + } + const preserved_note = Object.keys(preserved).length + ? ` (preserved: ${Object.keys(preserved).join(', ')})` + : ''; + log?.(`Cleared localStorage (${local_count} item(s))${preserved_note}.`, 'ok'); + } catch (err) { + log?.(`ERROR clearing localStorage: ${(err as Error).message}`, 'error'); + } - // 5. Clear sessionStorage - try { - const session_count = sessionStorage.length; - sessionStorage.clear(); - log?.(`Cleared sessionStorage (${session_count} item(s)).`, 'ok'); - } catch (err: any) { - log?.(`ERROR clearing sessionStorage: ${err.message}`, 'error'); + // 5. Clear sessionStorage + try { + const session_count = sessionStorage.length; + sessionStorage.clear(); + log?.(`Cleared sessionStorage (${session_count} item(s)).`, 'ok'); + } catch (err) { + log?.(`ERROR clearing sessionStorage: ${(err as Error).message}`, 'error'); + } } } diff --git a/src/lib/app_components/e_app_help_tech.svelte b/src/lib/app_components/e_app_help_tech.svelte index 994b7cbc..4afa9016 100644 --- a/src/lib/app_components/e_app_help_tech.svelte +++ b/src/lib/app_components/e_app_help_tech.svelte @@ -465,28 +465,12 @@ class:to-90%={$ae_sess.show_help_tech} --> if (!confirm(confirm_msg)) 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); - - // Enumerate and delete every IDB database on this origin. - const db_list = await indexedDB.databases(); - console.log('[clear_reload] IDB databases found:', db_list.map((d) => d.name)); - for (const db of db_list) { - if (db.name) indexedDB.deleteDatabase(db.name); - } - - if (edit_mode) { - // Preserve ae_loc (sign-in credentials + permissions) across the wipe. - const ae_loc_saved = localStorage.getItem('ae_loc'); - localStorage.clear(); - sessionStorage.clear(); - if (ae_loc_saved) localStorage.setItem('ae_loc', ae_loc_saved); - } - + // Non-edit: skip_ls=true — SW+Cache+IDB only, localStorage untouched (sign-in preserved naturally). + // Edit mode: preserve_ls_keys=['ae_loc'] — full clear but sign-in survives the wipe. + await core_func.clear_all_storage( + undefined, + edit_mode ? { preserve_ls_keys: ['ae_loc'] } : { skip_ls: true } + ); window.location.reload(); }} class=" diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index d3710629..5a5eee53 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -97,25 +97,12 @@ onMount(() => { if (!confirm(confirm_msg)) 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(); - for (const db of db_list) { - if (db.name) indexedDB.deleteDatabase(db.name); - } - - if (edit_mode) { - const ae_loc_saved = localStorage.getItem('ae_loc'); - localStorage.clear(); - sessionStorage.clear(); - if (ae_loc_saved) localStorage.setItem('ae_loc', ae_loc_saved); - } - + // Non-edit: skip_ls=true — SW+Cache+IDB only, localStorage untouched (sign-in preserved naturally). + // Edit mode: preserve_ls_keys=['ae_loc'] — full clear but sign-in survives the wipe. + await core_func.clear_all_storage( + undefined, + edit_mode ? { preserve_ls_keys: ['ae_loc'] } : { skip_ls: true } + ); window.location.reload(); }} class="btn btn-sm diff --git a/src/routes/journals/+layout.svelte b/src/routes/journals/+layout.svelte index ecee7b53..162af126 100644 --- a/src/routes/journals/+layout.svelte +++ b/src/routes/journals/+layout.svelte @@ -18,6 +18,7 @@ import { // *** Import Aether specific variables and functions import { ae_loc, ae_sess, ae_api, slct } from '$lib/stores/ae_stores'; +import { core_func } from '$lib/ae_core/ae_core_functions'; import { journals_loc, journals_slct, @@ -155,68 +156,26 @@ function scroll_container() {