You've already forked immich
mirror of
https://github.com/immich-app/immich.git
synced 2025-07-04 05:50:38 +02:00
chore(web): migration svelte 5 syntax (#13883)
This commit is contained in:
@ -42,8 +42,9 @@
|
||||
import { onMount } from 'svelte';
|
||||
import { t } from 'svelte-i18n';
|
||||
import { tweened } from 'svelte/motion';
|
||||
import { derived } from 'svelte/store';
|
||||
import { derived as storeDerived } from 'svelte/store';
|
||||
import { fade } from 'svelte/transition';
|
||||
import { SvelteSet } from 'svelte/reactivity';
|
||||
|
||||
type MemoryIndex = {
|
||||
memoryIndex: number;
|
||||
@ -59,19 +60,21 @@
|
||||
nextMemory?: MemoryLaneResponseDto;
|
||||
};
|
||||
|
||||
let memoryGallery: HTMLElement;
|
||||
let memoryWrapper: HTMLElement;
|
||||
let galleryInView = false;
|
||||
let paused = false;
|
||||
let selectedAssets: Set<AssetResponseDto> = new Set();
|
||||
let current: MemoryAsset | undefined = undefined;
|
||||
let memoryGallery: HTMLElement | undefined = $state();
|
||||
let memoryWrapper: HTMLElement | undefined = $state();
|
||||
let galleryInView = $state(false);
|
||||
let paused = $state(false);
|
||||
let selectedAssets: SvelteSet<AssetResponseDto> = $state(new SvelteSet());
|
||||
let current: MemoryAsset | undefined = $state(undefined);
|
||||
// let memories: MemoryAsset[] = [];
|
||||
let resetPromise = Promise.resolve();
|
||||
let resetPromise = $state(Promise.resolve());
|
||||
|
||||
const { isViewing } = assetViewingStore;
|
||||
const viewport: Viewport = { width: 0, height: 0 };
|
||||
const progress = tweened<number>(0, { duration: (from: number, to: number) => (to ? 5000 * (to - from) : 0) });
|
||||
const memories = derived(memoryStore, (memories) => {
|
||||
const viewport: Viewport = $state({ width: 0, height: 0 });
|
||||
const progressBarController = tweened<number>(0, {
|
||||
duration: (from: number, to: number) => (to ? 5000 * (to - from) : 0),
|
||||
});
|
||||
const memories = storeDerived(memoryStore, (memories) => {
|
||||
memories = memories ?? [];
|
||||
const memoryAssets: MemoryAsset[] = [];
|
||||
let previous: MemoryAsset | undefined;
|
||||
@ -100,13 +103,6 @@
|
||||
return memoryAssets;
|
||||
});
|
||||
|
||||
$: isMultiSelectionMode = selectedAssets.size > 0;
|
||||
$: isAllArchived = [...selectedAssets].every((asset) => asset.isArchived);
|
||||
$: isAllFavorite = [...selectedAssets].every((asset) => asset.isFavorite);
|
||||
$: selectedAssets = galleryInView ? selectedAssets : new Set();
|
||||
$: handlePromiseError(handleProgress($progress));
|
||||
$: handlePromiseError(handleAction(galleryInView ? 'pause' : 'play'));
|
||||
|
||||
const loadFromParams = (memories: MemoryAsset[], page: typeof $page | NavigationTarget | null) => {
|
||||
const assetId = page?.params?.assetId ?? page?.url.searchParams.get(QueryParameter.ID) ?? undefined;
|
||||
handlePromiseError(handleAction($isViewing ? 'pause' : 'reset'));
|
||||
@ -130,24 +126,24 @@
|
||||
const handleNextMemory = () => handleNavigate(current?.nextMemory?.assets[0]);
|
||||
const handlePreviousMemory = () => handleNavigate(current?.previousMemory?.assets[0]);
|
||||
const handleEscape = async () => goto(AppRoute.PHOTOS);
|
||||
const handleSelectAll = () => (selectedAssets = new Set(current?.memory.assets || []));
|
||||
const handleSelectAll = () => (selectedAssets = new SvelteSet(current?.memory.assets || []));
|
||||
const handleAction = async (action: 'reset' | 'pause' | 'play') => {
|
||||
switch (action) {
|
||||
case 'play': {
|
||||
paused = false;
|
||||
await progress.set(1);
|
||||
await progressBarController.set(1);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'pause': {
|
||||
paused = true;
|
||||
await progress.set($progress);
|
||||
await progressBarController.set($progressBarController);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'reset': {
|
||||
paused = false;
|
||||
resetPromise = progress.set(0);
|
||||
resetPromise = progressBarController.set(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -159,6 +155,7 @@
|
||||
}
|
||||
|
||||
if (progress === 1) {
|
||||
await progressBarController.set(0);
|
||||
await (current?.next ? handleNextAsset() : handleAction('pause'));
|
||||
}
|
||||
};
|
||||
@ -210,6 +207,21 @@
|
||||
|
||||
current = loadFromParams($memories, target);
|
||||
});
|
||||
$effect(() => {
|
||||
selectedAssets = galleryInView ? selectedAssets : new SvelteSet();
|
||||
});
|
||||
|
||||
let isMultiSelectionMode = $derived(selectedAssets.size > 0);
|
||||
let isAllArchived = $derived([...selectedAssets].every((asset) => asset.isArchived));
|
||||
let isAllFavorite = $derived([...selectedAssets].every((asset) => asset.isFavorite));
|
||||
|
||||
$effect(() => {
|
||||
handlePromiseError(handleProgress($progressBarController));
|
||||
});
|
||||
|
||||
$effect(() => {
|
||||
handlePromiseError(handleAction(galleryInView ? 'pause' : 'play'));
|
||||
});
|
||||
</script>
|
||||
|
||||
<svelte:window
|
||||
@ -226,9 +238,9 @@
|
||||
|
||||
{#if isMultiSelectionMode}
|
||||
<div class="sticky top-0 z-[90]">
|
||||
<AssetSelectControlBar assets={selectedAssets} clearSelect={() => (selectedAssets = new Set())}>
|
||||
<AssetSelectControlBar assets={selectedAssets} clearSelect={() => (selectedAssets = new SvelteSet())}>
|
||||
<CreateSharedLink />
|
||||
<CircleIconButton title={$t('select_all')} icon={mdiSelectAll} on:click={handleSelectAll} />
|
||||
<CircleIconButton title={$t('select_all')} icon={mdiSelectAll} onclick={handleSelectAll} />
|
||||
|
||||
<ButtonContextMenu icon={mdiPlus} title={$t('add_to')}>
|
||||
<AddToAlbum />
|
||||
@ -251,17 +263,19 @@
|
||||
<section id="memory-viewer" class="w-full bg-immich-dark-gray" bind:this={memoryWrapper}>
|
||||
{#if current && current.memory.assets.length > 0}
|
||||
<ControlAppBar onClose={() => goto(AppRoute.PHOTOS)} forceDark>
|
||||
<svelte:fragment slot="leading">
|
||||
<p class="text-lg">
|
||||
{$memoryLaneTitle(current.memory.yearsAgo)}
|
||||
</p>
|
||||
</svelte:fragment>
|
||||
{#snippet leading()}
|
||||
{#if current}
|
||||
<p class="text-lg">
|
||||
{$memoryLaneTitle(current.memory.yearsAgo)}
|
||||
</p>
|
||||
{/if}
|
||||
{/snippet}
|
||||
|
||||
<div class="flex place-content-center place-items-center gap-2 overflow-hidden">
|
||||
<CircleIconButton
|
||||
title={paused ? $t('play_memories') : $t('pause_memories')}
|
||||
icon={paused ? mdiPlay : mdiPause}
|
||||
on:click={() => handleAction(paused ? 'play' : 'pause')}
|
||||
onclick={() => handleAction(paused ? 'play' : 'pause')}
|
||||
class="hover:text-black"
|
||||
/>
|
||||
|
||||
@ -274,7 +288,7 @@
|
||||
{:then}
|
||||
<span
|
||||
class="absolute left-0 h-[2px] bg-white"
|
||||
style:width={`${index < current.assetIndex ? 100 : index > current.assetIndex ? 0 : $progress * 100}%`}
|
||||
style:width={`${index < current.assetIndex ? 100 : index > current.assetIndex ? 0 : $progressBarController * 100}%`}
|
||||
></span>
|
||||
{/await}
|
||||
</a>
|
||||
@ -296,10 +310,10 @@
|
||||
>
|
||||
<button
|
||||
type="button"
|
||||
on:click={() => memoryWrapper.scrollIntoView({ behavior: 'smooth' })}
|
||||
onclick={() => memoryWrapper?.scrollIntoView({ behavior: 'smooth' })}
|
||||
disabled={!galleryInView}
|
||||
>
|
||||
<CircleIconButton title={$t('hide_gallery')} icon={mdiChevronUp} color="light" />
|
||||
<CircleIconButton title={$t('hide_gallery')} icon={mdiChevronUp} color="light" onclick={() => {}} />
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
@ -314,7 +328,7 @@
|
||||
type="button"
|
||||
class="relative h-full w-full rounded-2xl"
|
||||
disabled={!current.previousMemory}
|
||||
on:click={handlePreviousMemory}
|
||||
onclick={handlePreviousMemory}
|
||||
>
|
||||
{#if current.previousMemory && current.previousMemory.assets.length > 0}
|
||||
<img
|
||||
@ -367,6 +381,7 @@
|
||||
icon={mdiImageSearch}
|
||||
title={$t('view_in_timeline')}
|
||||
color="light"
|
||||
onclick={() => {}}
|
||||
/>
|
||||
</div>
|
||||
<!-- CONTROL BUTTONS -->
|
||||
@ -376,7 +391,7 @@
|
||||
title={$t('previous_memory')}
|
||||
icon={mdiChevronLeft}
|
||||
color="dark"
|
||||
on:click={handlePreviousAsset}
|
||||
onclick={handlePreviousAsset}
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
@ -387,7 +402,7 @@
|
||||
title={$t('next_memory')}
|
||||
icon={mdiChevronRight}
|
||||
color="dark"
|
||||
on:click={handleNextAsset}
|
||||
onclick={handleNextAsset}
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
@ -409,7 +424,7 @@
|
||||
<button
|
||||
type="button"
|
||||
class="relative h-full w-full rounded-2xl"
|
||||
on:click={handleNextMemory}
|
||||
onclick={handleNextMemory}
|
||||
disabled={!current.nextMemory}
|
||||
>
|
||||
{#if current.nextMemory && current.nextMemory.assets.length > 0}
|
||||
@ -451,7 +466,7 @@
|
||||
title={$t('show_gallery')}
|
||||
icon={mdiChevronDown}
|
||||
color="light"
|
||||
on:click={() => memoryGallery.scrollIntoView({ behavior: 'smooth' })}
|
||||
onclick={() => memoryGallery?.scrollIntoView({ behavior: 'smooth' })}
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
Reference in New Issue
Block a user