feat(web): Lazy load thumbnails on the people page (#5356)

* feat(web): Lazy load thumbnails on the people page

Instead of loading all people thumbnails at once, only the first few
should be loaded eagerly.
This reduces the load on client and server side.

* chore: change name

---------

Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
This commit is contained in:
Emanuel Bennici 2023-11-28 21:23:27 +01:00 committed by GitHub
parent 4d727708e2
commit 5781ae9d82
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 8 additions and 2 deletions

View file

@ -17,12 +17,14 @@
export let circle = false;
export let hidden = false;
export let border = false;
export let preload = true;
let complete = false;
export let eyeColor: 'black' | 'white' = 'white';
</script>
<img
loading={preload ? 'eager' : 'lazy'}
style:width={widthStyle}
style:height={heightStyle}
style:filter={hidden ? 'grayscale(50%)' : 'none'}

View file

@ -12,6 +12,7 @@
import Icon from '$lib/components/elements/icon.svelte';
export let person: PersonResponseDto;
export let preload = false;
type MenuItemEvent = 'change-name' | 'set-birth-date' | 'merge-faces' | 'hide-face';
let dispatch = createEventDispatcher<{
@ -48,6 +49,7 @@
<div class="h-48 w-48 rounded-xl brightness-95 filter">
<ImageThumbnail
shadow
{preload}
url={api.getPeopleThumbnailUrl(person.id)}
altText={person.name}
title={person.name}

View file

@ -372,10 +372,11 @@
{#if countVisiblePeople > 0}
<div class="pl-4">
<div class="flex flex-row flex-wrap gap-1">
{#each people as person (person.id)}
{#each people as person, idx (person.id)}
{#if !person.isHidden}
<PeopleCard
{person}
preload={idx < 20}
on:change-name={() => handleChangeName(person)}
on:set-birth-date={() => handleSetBirthDate(person)}
on:merge-faces={() => handleMergeFaces(person)}
@ -444,7 +445,7 @@
bind:showLoadingSpinner
bind:toggleVisibility
>
{#each people as person (person.id)}
{#each people as person, idx (person.id)}
<button
class="relative h-36 w-36 md:h-48 md:w-48"
on:click={() => (person.isHidden = !person.isHidden)}
@ -452,6 +453,7 @@
on:mouseleave={() => (eyeColorMap[person.id] = 'white')}
>
<ImageThumbnail
preload={idx < 20}
bind:hidden={person.isHidden}
shadow
url={api.getPeopleThumbnailUrl(person.id)}