diff --git a/web/src/lib/components/asset-viewer/photo-viewer.svelte b/web/src/lib/components/asset-viewer/photo-viewer.svelte index 63a50716d..8d10dc935 100644 --- a/web/src/lib/components/asset-viewer/photo-viewer.svelte +++ b/web/src/lib/components/asset-viewer/photo-viewer.svelte @@ -6,12 +6,14 @@ import { notificationController, NotificationType } from '../shared-components/notification/notification'; import { useZoomImageWheel } from '@zoom-image/svelte'; import { photoZoomState } from '$lib/stores/zoom-image.store'; + import { isWebCompatibleImage } from '$lib/utils/asset-utils'; export let asset: AssetResponseDto; export let element: HTMLDivElement | undefined = undefined; let imgElement: HTMLDivElement; let assetData: string; + let hasZoomed = false; let copyImageToClipboard: (src: string) => Promise; let canCopyImagesToClipboard: () => boolean; @@ -23,10 +25,10 @@ canCopyImagesToClipboard = module.canCopyImagesToClipboard; }); - const loadAssetData = async () => { + const loadAssetData = async ({ loadOriginal }: { loadOriginal: boolean }) => { try { const { data } = await api.assetApi.serveFile( - { id: asset.id, isThumb: false, isWeb: true, key: api.getKey() }, + { id: asset.id, isThumb: false, isWeb: !loadOriginal, key: api.getKey() }, { responseType: 'blob', }, @@ -37,7 +39,6 @@ } assetData = URL.createObjectURL(data); - return assetData; } catch { // Do nothing } @@ -87,10 +88,16 @@ zoomImageWheelState.subscribe((state) => { photoZoomState.set(state); + + if (state.currentZoom > 1 && isWebCompatibleImage(asset) && !hasZoomed) { + hasZoomed = true; + loadAssetData({ loadOriginal: true }); + } }); $: if (imgElement) { createZoomImageWheel(imgElement, { + maxZoom: 10, wheelZoomRatio: 0.2, }); } @@ -103,9 +110,9 @@ transition:fade={{ duration: 150 }} class="flex h-full select-none place-content-center place-items-center" > - {#await loadAssetData()} + {#await loadAssetData({ loadOriginal: false })} - {:then assetData} + {:then}