Skip to content

Commit 1127dca

Browse files
Merge pull request #1295 from VanshajPoonia/fix/1293-production-zoom-scroll
Fix production zoom scroll behavior
2 parents 07a2e78 + efa51e6 commit 1127dca

10 files changed

Lines changed: 2295 additions & 491 deletions

File tree

frontend/src/components/Media/ImageViewer.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ export const ImageViewer = forwardRef<ImageViewerRef, ImageViewerProps>(
1818
({ imagePath, alt, rotation, resetSignal }, ref) => {
1919
const zoomableImageRef = useRef<ZoomableImageRef>(null);
2020

21-
useImperativeHandle(ref, () => ({
22-
zoomIn: () => zoomableImageRef.current?.zoomIn(),
23-
zoomOut: () => zoomableImageRef.current?.zoomOut(),
24-
reset: () => zoomableImageRef.current?.reset(),
25-
}));
21+
useImperativeHandle(
22+
ref,
23+
() => ({
24+
zoomIn: () => zoomableImageRef.current?.zoomIn(),
25+
zoomOut: () => zoomableImageRef.current?.zoomOut(),
26+
reset: () => zoomableImageRef.current?.reset(),
27+
}),
28+
[],
29+
);
2630

2731
return (
2832
<ZoomableImage
@@ -35,3 +39,5 @@ export const ImageViewer = forwardRef<ImageViewerRef, ImageViewerProps>(
3539
);
3640
},
3741
);
42+
43+
ImageViewer.displayName = 'ImageViewer';

frontend/src/components/Media/MediaThumbnails.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import React, { useRef, useEffect } from 'react';
22
import { convertFileSrc } from '@tauri-apps/api/core';
3+
import {
4+
PLACEHOLDER_IMAGE_SRC,
5+
handlePlaceholderImageError,
6+
} from '@/utils/imageFallback';
37

48
interface MediaThumbnailsProps {
59
images: Array<{
@@ -117,14 +121,10 @@ export const MediaThumbnails: React.FC<MediaThumbnailsProps> = ({
117121
} cursor-pointer transition-all duration-200 hover:scale-105`}
118122
>
119123
<img
120-
src={convertFileSrc(image.thumbnailPath) || '/placeholder.svg'}
124+
src={convertFileSrc(image.thumbnailPath) || PLACEHOLDER_IMAGE_SRC}
121125
alt={`thumbnail-${index}`}
122126
className="h-full w-full object-cover"
123-
onError={(e) => {
124-
const img = e.target as HTMLImageElement;
125-
img.onerror = null;
126-
img.src = '/placeholder.svg';
127-
}}
127+
onError={handlePlaceholderImageError}
128128
/>
129129
</div>
130130
))}

frontend/src/components/Media/MediaView.tsx

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,20 +51,25 @@ export function MediaView({
5151

5252
// Custom hooks
5353
const { viewState, handlers } = useImageViewControls();
54+
const resetViewerState = useCallback(() => {
55+
handlers.resetZoom();
56+
setResetSignal((s) => s + 1);
57+
}, [handlers]);
58+
5459
// Navigation handlers
5560
const handleNextImage = useCallback(() => {
5661
if (currentViewIndex < images.length - 1) {
5762
dispatch(setCurrentViewIndex(currentViewIndex + 1));
58-
handlers.resetZoom();
63+
resetViewerState();
5964
}
60-
}, [dispatch, handlers, currentViewIndex, images.length]);
65+
}, [dispatch, resetViewerState, currentViewIndex, images.length]);
6166

6267
const handlePreviousImage = useCallback(() => {
6368
if (currentViewIndex > 0) {
6469
dispatch(setCurrentViewIndex(currentViewIndex - 1));
65-
handlers.resetZoom();
70+
resetViewerState();
6671
}
67-
}, [dispatch, handlers, currentViewIndex]);
72+
}, [dispatch, resetViewerState, currentViewIndex]);
6873

6974
const handleClose = useCallback(() => {
7075
dispatch(closeImageView());
@@ -74,9 +79,9 @@ export function MediaView({
7479
const handleThumbnailClick = useCallback(
7580
(index: number) => {
7681
dispatch(setCurrentViewIndex(index));
77-
handlers.resetZoom();
82+
resetViewerState();
7883
},
79-
[dispatch, handlers],
84+
[dispatch, resetViewerState],
8085
);
8186

8287
const location = useLocation();
@@ -85,8 +90,8 @@ export function MediaView({
8590
// Loop to first image handler for slideshow
8691
const handleLoopToStart = useCallback(() => {
8792
dispatch(setCurrentViewIndex(0));
88-
handlers.resetZoom();
89-
}, [dispatch, handlers]);
93+
resetViewerState();
94+
}, [dispatch, resetViewerState]);
9095

9196
// Slideshow functionality
9297
const { isSlideshowActive, toggleSlideshow } = useSlideshow(
@@ -142,9 +147,8 @@ export function MediaView({
142147

143148
const handleResetZoom = useCallback(() => {
144149
imageViewerRef.current?.reset();
145-
handlers.resetZoom();
146-
setResetSignal((s) => s + 1);
147-
}, [handlers]);
150+
resetViewerState();
151+
}, [resetViewerState]);
148152

149153
// Keyboard navigation
150154
useKeyboardNavigation({
@@ -164,6 +168,7 @@ export function MediaView({
164168

165169
// Safe variables
166170
const currentImagePath = currentImage.path;
171+
const currentImageKey = currentImage.id || currentImage.path;
167172
// console.log(currentImage);
168173
const currentImageAlt = `image-${currentViewIndex}`;
169174
return (
@@ -190,6 +195,7 @@ export function MediaView({
190195
>
191196
{type === 'image' && (
192197
<ImageViewer
198+
key={currentImageKey}
193199
ref={imageViewerRef}
194200
imagePath={currentImagePath}
195201
alt={currentImageAlt}

0 commit comments

Comments
 (0)