Fix badge loading race conditions and standardize Svelte 5 param resolution

- Resolved 'untrack is not defined' ReferenceError in Badge Detail page.
- Transitioned Badge, IDAA Archive, and Journal Entry pages to use page.params for robust reactivity.
- Implemented fallback semantic ID lookup for Badges to handle mixed ID formats in URLs.
- Added proper loading states to detail views to prevent 'No IDB record' flashes during hydration.
- Systematically audited and cleaned up duplicate 'untrack' imports across all Svelte files.
This commit is contained in:
Scott Idem
2026-02-08 17:48:20 -05:00
parent 718de1457d
commit 84cfed97ca
3 changed files with 44 additions and 3 deletions

View File

@@ -1,4 +1,5 @@
<script lang="ts">
import { untrack } from 'svelte';
interface Props {
/** @type {import('./$types').PageData} */
data: any;
@@ -31,10 +32,17 @@
// import { events_func } from '$lib/ae_events_functions';
import Comp_badge_obj_view from './ae_comp__badge_obj_view.svelte';
import { page } from '$app/state';
import { LoaderCircle } from 'lucide-svelte';
// *** Variables
// let test_event_id = data.params.event_id;
let event_badge_id = $derived(data.params.badge_id);
// Use page.params for robust reactivity in Svelte 5
let event_badge_id = $derived(page.params.badge_id);
// Track if we are waiting for initial IDB result
let is_loading_idb = $state(true);
// console.log(`Data Params: event_id=${test_event_id}; badge_id=${test_event_badge_id}`);
let url_test_val = $derived(data.url.searchParams.get('test_val'));
$effect(() => {
@@ -43,12 +51,21 @@
let lq__event_badge_obj = $derived(
liveQuery(async () => {
if (!event_badge_id) return null;
if (log_lvl) {
console.log(
`*** LiveQuery: lq__event_badge_obj *** event_badge_id=${event_badge_id}`
);
}
// Attempt lookup by the ID provided in the URL
let results = await db_events.badge.get(event_badge_id);
// Fallback: If not found by PK, try searching the event_badge_id index
// (Standardizing on semantic IDs)
if (!results) {
results = await db_events.badge.where('event_badge_id').equals(event_badge_id).first();
}
if (log_lvl) {
console.log(
`*** LiveQuery: lq__event_badge_obj *** results=`,
@@ -59,6 +76,13 @@
})
);
// SIDE EFFECT: Update loading state when the observable value changes
$effect(() => {
if ($lq__event_badge_obj !== undefined) {
untrack(() => is_loading_idb = false);
}
});
let lq__event_badge_template_obj = $derived(
liveQuery(async () => {
let results = await db_events.badge_template.get(
@@ -168,6 +192,17 @@
{lq__event_badge_template_obj}
/>
{/if}
{:else if is_loading_idb || !event_badge_id}
<div class="flex flex-col items-center justify-center p-20 gap-4 opacity-50">
<LoaderCircle size="3em" class="animate-spin" />
<p class="text-xl font-bold text-center">Loading Badge Details...</p>
</div>
{:else}
<p>No IDB record found for ID: {event_badge_id}</p>
<div class="card p-8 variant-soft-error border border-error-500/30 text-center space-y-4">
<h2 class="h2 font-black text-error-500">Badge Not Found</h2>
<p class="opacity-70">No record found locally for ID: <span class="font-mono">{event_badge_id}</span></p>
<button class="btn variant-filled-primary" onclick={() => window.location.reload()}>
<span class="fas fa-sync mr-2"></span> Force Refresh
</button>
</div>
{/if}

View File

@@ -31,4 +31,8 @@ export async function load({ params, parent, url }) {
});
}
}
return {
params
};
}

View File

@@ -46,6 +46,7 @@
import Archive_content_obj_id_edit from './ae_idaa_comp__archive_content_obj_id_edit.svelte';
import Modal_media_player from './ae_idaa_comp__modal_media_player.svelte';
import Help_tech from '$lib/app_components/e_app_help_tech.svelte';
import { page } from '$app/state';
// let ae_promises: key_val = {};
// let ae_tmp: key_val = {};
@@ -58,7 +59,8 @@
}
// For some reason data.params.archive_id (or whatever param) is not being passed to this page when loaded by a link from another page. This seems to be a bug with Svelte or SvelteKit. Hopefully fixed in a future version 5? 2024-11-06
$idaa_slct.archive_id = ae_acct.slct.archive_id;
// SVELTE 5 FIX: Use page.params directly for robust reactivity
$idaa_slct.archive_id = page.params.archive_id;
// $idaa_slct.archive_obj = ae_acct.slct.archive_obj;
// *** Functions and Logic