{#if viewerKind === 'StackPhotoViewer'}
navigateAsset('previous')}
onNextAsset={() => navigateAsset('next')}
@@ -515,13 +508,11 @@
{playOriginalVideo}
/>
{:else if viewerKind === 'ImagePanaramaViewer'}
-
+
{:else if viewerKind === 'CropArea'}
{:else if viewerKind === 'PhotoViewer'}
navigateAsset('previous')}
onNextAsset={() => navigateAsset('next')}
diff --git a/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte b/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte
index 196f5ec6c5..5b18dbb4e3 100644
--- a/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte
+++ b/web/src/lib/components/asset-viewer/image-panorama-viewer.svelte
@@ -8,10 +8,9 @@
type Props = {
asset: AssetResponseDto;
- zoomToggle?: (() => void) | null;
};
- let { asset, zoomToggle = $bindable() }: Props = $props();
+ let { asset }: Props = $props();
const loadAssetData = async (id: string) => {
const data = await viewAsset({ ...authManager.params, id, size: AssetMediaSize.Preview });
@@ -23,7 +22,7 @@
{#await Promise.all([loadAssetData(asset.id), import('./photo-sphere-viewer-adapter.svelte')])}
{:then [data, { default: PhotoSphereViewer }]}
-
+
{:catch}
{$t('errors.failed_to_load_asset')}
{/await}
diff --git a/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte b/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte
index 2e5d0d85c5..f671aa1b1c 100644
--- a/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte
+++ b/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte
@@ -1,8 +1,9 @@
-
+
+
+
diff --git a/web/src/lib/components/asset-viewer/photo-viewer.svelte b/web/src/lib/components/asset-viewer/photo-viewer.svelte
index afb353c7c6..0a44505f40 100644
--- a/web/src/lib/components/asset-viewer/photo-viewer.svelte
+++ b/web/src/lib/components/asset-viewer/photo-viewer.svelte
@@ -4,15 +4,15 @@
import FaceEditor from '$lib/components/asset-viewer/face-editor/face-editor.svelte';
import OcrBoundingBox from '$lib/components/asset-viewer/ocr-bounding-box.svelte';
import BrokenAsset from '$lib/components/assets/broken-asset.svelte';
+ import AssetViewerEvents from '$lib/components/AssetViewerEvents.svelte';
import { assetViewerFadeDuration } from '$lib/constants';
+ import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte';
import { castManager } from '$lib/managers/cast-manager.svelte';
import { imageManager } from '$lib/managers/ImageManager.svelte';
- import { photoViewerImgElement } from '$lib/stores/assets-store.svelte';
import { isFaceEditMode } from '$lib/stores/face-edit.svelte';
import { ocrManager } from '$lib/stores/ocr.svelte';
import { boundingBoxesArray } from '$lib/stores/people.store';
import { SlideshowLook, SlideshowState, slideshowLookCssMapping, slideshowStore } from '$lib/stores/slideshow.store';
- import { photoZoomState } from '$lib/stores/zoom-image.store';
import { getAssetUrl, targetImageSize as getTargetImageSize, handlePromiseError } from '$lib/utils';
import { canCopyImageToClipboard, copyImageToClipboard } from '$lib/utils/asset-utils';
import { handleError } from '$lib/utils/handle-error';
@@ -35,8 +35,6 @@
sharedLink?: SharedLinkResponseDto | undefined;
onPreviousAsset?: (() => void) | null;
onNextAsset?: (() => void) | null;
- copyImage?: () => Promise;
- zoomToggle?: (() => void) | null;
}
let {
@@ -46,8 +44,6 @@
sharedLink = undefined,
onPreviousAsset = null,
onNextAsset = null,
- copyImage = $bindable(),
- zoomToggle = $bindable(),
}: Props = $props();
const { slideshowState, slideshowLook } = slideshowStore;
@@ -59,64 +55,63 @@
let loader = $state();
- photoZoomState.set({
+ assetViewerManager.zoomState = {
currentRotation: 0,
currentZoom: 1,
enable: true,
currentPositionX: 0,
currentPositionY: 0,
- });
+ };
onDestroy(() => {
$boundingBoxesArray = [];
});
let ocrBoxes = $derived(
- ocrManager.showOverlay && $photoViewerImgElement
- ? getOcrBoundingBoxes(ocrManager.data, $photoZoomState, $photoViewerImgElement)
+ ocrManager.showOverlay && assetViewerManager.imgRef
+ ? getOcrBoundingBoxes(ocrManager.data, assetViewerManager.zoomState, assetViewerManager.imgRef)
: [],
);
let isOcrActive = $derived(ocrManager.showOverlay);
- copyImage = async () => {
- if (!canCopyImageToClipboard() || !$photoViewerImgElement) {
+ const onCopy = async () => {
+ if (!canCopyImageToClipboard() || !assetViewerManager.imgRef) {
return;
}
try {
- await copyImageToClipboard($photoViewerImgElement);
+ await copyImageToClipboard(assetViewerManager.imgRef);
toastManager.info($t('copied_image_to_clipboard'));
} catch (error) {
handleError(error, $t('copy_error'));
}
};
- zoomToggle = () => {
- photoZoomState.set({
- ...$photoZoomState,
- currentZoom: $photoZoomState.currentZoom > 1 ? 1 : 2,
- });
+ const onZoom = () => {
+ assetViewerManager.zoom = assetViewerManager.zoom > 1 ? 1 : 2;
};
const onPlaySlideshow = () => ($slideshowState = SlideshowState.PlaySlideshow);
$effect(() => {
- if (isFaceEditMode.value && $photoZoomState.currentZoom > 1) {
- zoomToggle();
+ if (isFaceEditMode.value && assetViewerManager.zoom > 1) {
+ onZoom();
}
});
+ // TODO move to action + command palette
const onCopyShortcut = (event: KeyboardEvent) => {
if (globalThis.getSelection()?.type === 'Range') {
return;
}
event.preventDefault();
- handlePromiseError(copyImage());
+
+ handlePromiseError(onCopy());
};
const onSwipe = (event: SwipeCustomEvent) => {
- if ($photoZoomState.currentZoom > 1) {
+ if (assetViewerManager.zoom > 1) {
return;
}
@@ -133,7 +128,7 @@
}
};
- const targetImageSize = $derived(getTargetImageSize(asset, originalImageLoaded || $photoZoomState.currentZoom > 1));
+ const targetImageSize = $derived(getTargetImageSize(asset, originalImageLoaded || assetViewerManager.zoom > 1));
$effect(() => {
if (imageLoaderUrl) {
@@ -167,7 +162,7 @@
onDestroy(() => imageManager.cancelPreloadUrl(imageLoaderUrl));
let imageLoaderUrl = $derived(
- getAssetUrl({ asset, sharedLink, forceOriginal: originalImageLoaded || $photoZoomState.currentZoom > 1 }),
+ getAssetUrl({ asset, sharedLink, forceOriginal: originalImageLoaded || assetViewerManager.zoom > 1 }),
);
let containerWidth = $state(0);
@@ -187,13 +182,14 @@
});
+
+
{#if imageError}
@@ -228,7 +224,7 @@
/>
{/if}
- {#each getBoundingBox($boundingBoxesArray, $photoZoomState, $photoViewerImgElement) as boundingbox}
+ {#each getBoundingBox($boundingBoxesArray, assetViewerManager.zoomState, assetViewerManager.imgRef) as boundingbox}
{#if isFaceEditMode.value}
-
+
{/if}
{/if}
diff --git a/web/src/lib/components/faces-page/assign-face-side-panel.svelte b/web/src/lib/components/faces-page/assign-face-side-panel.svelte
index ac78623071..772fbe954e 100644
--- a/web/src/lib/components/faces-page/assign-face-side-panel.svelte
+++ b/web/src/lib/components/faces-page/assign-face-side-panel.svelte
@@ -1,7 +1,7 @@