mirror of
https://github.com/immich-app/immich.git
synced 2025-05-31 04:05:39 -04:00
47 lines
1.5 KiB
Svelte
47 lines
1.5 KiB
Svelte
<script lang="ts">
|
|
import Thumbnail from '$lib/components/assets/thumbnail/thumbnail.svelte';
|
|
import { getThumbnailSize } from '$lib/utils/thumbnail-util';
|
|
import { ThumbnailFormat, type AssetResponseDto } from '@immich/sdk';
|
|
import { createEventDispatcher } from 'svelte';
|
|
import { flip } from 'svelte/animate';
|
|
|
|
export let assets: AssetResponseDto[];
|
|
export let selectedAssets: Set<AssetResponseDto> = new Set();
|
|
|
|
let viewWidth: number;
|
|
$: thumbnailSize = getThumbnailSize(assets.length, viewWidth);
|
|
|
|
let dispatch = createEventDispatcher<{
|
|
select: { asset: AssetResponseDto; selectedAssets: Set<AssetResponseDto> };
|
|
}>();
|
|
|
|
const selectAssetHandler = (event: CustomEvent) => {
|
|
const { asset }: { asset: AssetResponseDto } = event.detail;
|
|
let temporary = new Set(selectedAssets);
|
|
if (selectedAssets.has(asset)) {
|
|
temporary.delete(asset);
|
|
} else {
|
|
temporary.add(asset);
|
|
}
|
|
|
|
selectedAssets = temporary;
|
|
dispatch('select', { asset, selectedAssets });
|
|
};
|
|
</script>
|
|
|
|
{#if assets.length > 0}
|
|
<div class="flex w-full flex-wrap gap-1 pb-20" bind:clientWidth={viewWidth}>
|
|
{#each assets as asset (asset.id)}
|
|
<div animate:flip={{ duration: 500 }}>
|
|
<Thumbnail
|
|
{asset}
|
|
{thumbnailSize}
|
|
format={assets.length < 7 ? ThumbnailFormat.Jpeg : ThumbnailFormat.Webp}
|
|
on:click={selectAssetHandler}
|
|
selected={selectedAssets.has(asset)}
|
|
/>
|
|
</div>
|
|
{/each}
|
|
</div>
|
|
{/if}
|