perf(BackgroundSelector): load settings image selector images on hover

This commit is contained in:
sethburkart123
2024-09-17 17:58:40 +10:00
parent 31e833f791
commit fea486aa52
@@ -54,7 +54,7 @@
} }
} }
async function loadBackgrounds(): Promise<void> { async function loadBackgroundMetadata(): Promise<void> {
try { try {
isLoading = true; isLoading = true;
error = null; error = null;
@@ -67,10 +67,29 @@
const data = await readAllData(); const data = await readAllData();
selectedBackground = await getTheme(); selectedBackground = await getTheme();
if (!isVisible) { // Only load metadata (id and type) for placeholders
backgrounds = data; backgrounds = data.map(({ id, type }) => ({ id, type, blob: null }));
return; } catch (e) {
}; if (e instanceof Error) {
error = e.message;
} else {
error = 'An unknown error occurred';
}
} finally {
isLoading = false;
}
}
async function loadFullBackgrounds(): Promise<void> {
try {
isLoading = true;
error = null;
if (!isIndexedDBSupported()) {
throw new Error("Your browser doesn't support IndexedDB. Unable to load backgrounds.");
}
const data = await readAllData();
backgrounds = await preloadBackgrounds(data); backgrounds = await preloadBackgrounds(data);
} catch (e) { } catch (e) {
if (e instanceof Error) { if (e instanceof Error) {
@@ -134,14 +153,14 @@
}); });
onMount(() => { onMount(() => {
loadBackgrounds(); loadBackgroundMetadata();
observer = new IntersectionObserver((entries) => { observer = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) { if (entries[0].isIntersecting) {
delay(() => { delay(() => {
isVisible = true; isVisible = true;
loadBackgrounds(); loadFullBackgrounds();
}, 100); }, 450);
observer.disconnect(); observer.disconnect();
} }
}); });
@@ -160,20 +179,18 @@
{#if !isEditMode} {#if !isEditMode}
<BackgroundUploader on:fileChange={e => handleFileChange(e.detail)} /> <BackgroundUploader on:fileChange={e => handleFileChange(e.detail)} />
{/if} {/if}
{#if isVisible} {#each imageBackgrounds as bg (bg.id)}
{#each imageBackgrounds as bg (bg.id)} {#if isVisible && bg.blob}
<BackgroundItem <BackgroundItem
bg={bg} bg={bg}
isSelected={selectedBackground === bg.id} isSelected={selectedBackground === bg.id}
isEditMode={isEditMode} isEditMode={isEditMode}
onClick={() => selectBackground(bg.id)} onClick={() => selectBackground(bg.id)}
onDelete={() => deleteBackground(bg.id)}/> onDelete={() => deleteBackground(bg.id)}/>
{/each} {:else}
{:else}
{#each imageBackgrounds as bg (bg.id)}
<div class="w-16 h-16 rounded-xl bg-zinc-100 dark:bg-zinc-900 animate-pulse"></div> <div class="w-16 h-16 rounded-xl bg-zinc-100 dark:bg-zinc-900 animate-pulse"></div>
{/each} {/if}
{/if} {/each}
</div> </div>
<h2 class="py-2 text-lg font-bold">Background Videos</h2> <h2 class="py-2 text-lg font-bold">Background Videos</h2>
@@ -181,8 +198,8 @@
{#if !isEditMode} {#if !isEditMode}
<BackgroundUploader on:fileChange={e => handleFileChange(e.detail)} /> <BackgroundUploader on:fileChange={e => handleFileChange(e.detail)} />
{/if} {/if}
{#if isVisible} {#each videoBackgrounds as bg (bg.id)}
{#each videoBackgrounds as bg (bg.id)} {#if isVisible && bg.blob}
<BackgroundItem <BackgroundItem
bg={bg} bg={bg}
isSelected={selectedBackground === bg.id} isSelected={selectedBackground === bg.id}
@@ -190,11 +207,9 @@
onClick={() => selectBackground(bg.id)} onClick={() => selectBackground(bg.id)}
onDelete={() => deleteBackground(bg.id)} onDelete={() => deleteBackground(bg.id)}
/> />
{/each} {:else}
{:else}
{#each videoBackgrounds as bg (bg.id)}
<div class="w-16 h-16 rounded-xl bg-zinc-100 dark:bg-zinc-900 animate-pulse"></div> <div class="w-16 h-16 rounded-xl bg-zinc-100 dark:bg-zinc-900 animate-pulse"></div>
{/each} {/if}
{/if} {/each}
</div> </div>
</div> </div>