diff --git a/src/frontend/apps/drive/src/features/ui/preview/FilesPreview.tsx b/src/frontend/apps/drive/src/features/ui/preview/FilesPreview.tsx index df523815..93258913 100644 --- a/src/frontend/apps/drive/src/features/ui/preview/FilesPreview.tsx +++ b/src/frontend/apps/drive/src/features/ui/preview/FilesPreview.tsx @@ -129,6 +129,16 @@ export const FilePreview = ({ window.open(currentFile.url_preview, "_blank"); }; + const handleBackdropClick = (e: React.MouseEvent) => { + if (!(e.target instanceof HTMLElement)) return; + if ( + e.target === e.currentTarget || + e.target.dataset.previewBackdrop === "true" + ) { + onClose?.(); + } + }; + // Render the appropriate viewer based on file category const renderViewer = () => { if (!currentFile) { @@ -165,7 +175,10 @@ export const FilePreview = ({ ); case MimeCategory.VIDEO: return ( -
+
+
= ({ const containerRef = useRef(null); const imageRef = useRef(null); + const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null); // Calculate distance between two touch points const getTouchDistance = useCallback( @@ -193,6 +194,7 @@ export const ImageViewer: React.FC = ({ // Handle mouse down for dragging const handleMouseDown = useCallback( (e: React.MouseEvent) => { + mouseDownPosRef.current = { x: e.clientX, y: e.clientY }; if (isImageExceedingBounds()) { setIsDragging(true); setDragStart({ @@ -204,6 +206,20 @@ export const ImageViewer: React.FC = ({ [isImageExceedingBounds, position], ); + // Swallow the click that follows a pan-drag so it never bubbles to the + // FilePreview backdrop handler. Without this, releasing a drag on the + // empty area of the container would close the preview. + const handleClickCapture = useCallback((e: React.MouseEvent) => { + const start = mouseDownPosRef.current; + mouseDownPosRef.current = null; + if (!start) return; + const dx = e.clientX - start.x; + const dy = e.clientY - start.y; + if (dx * dx + dy * dy > 16) { + e.stopPropagation(); + } + }, []); + // Handle mouse move for dragging const handleMouseMove = useCallback( (e: React.MouseEvent) => { @@ -359,11 +375,13 @@ export const ImageViewer: React.FC = ({
+
diff --git a/src/frontend/apps/drive/src/features/ui/preview/viewers/pdf-preview/OutdatedBrowserPreview.tsx b/src/frontend/apps/drive/src/features/ui/preview/viewers/pdf-preview/OutdatedBrowserPreview.tsx index e7b4fb6b..f9680c50 100644 --- a/src/frontend/apps/drive/src/features/ui/preview/viewers/pdf-preview/OutdatedBrowserPreview.tsx +++ b/src/frontend/apps/drive/src/features/ui/preview/viewers/pdf-preview/OutdatedBrowserPreview.tsx @@ -5,7 +5,7 @@ export const OutdatedBrowserPreview = () => { const { t } = useTranslation(); return ( -
+
diff --git a/src/frontend/apps/drive/src/features/ui/preview/viewers/pdf-preview/PdfPageViewer.tsx b/src/frontend/apps/drive/src/features/ui/preview/viewers/pdf-preview/PdfPageViewer.tsx index d3d7906d..4d918a91 100644 --- a/src/frontend/apps/drive/src/features/ui/preview/viewers/pdf-preview/PdfPageViewer.tsx +++ b/src/frontend/apps/drive/src/features/ui/preview/viewers/pdf-preview/PdfPageViewer.tsx @@ -137,6 +137,7 @@ export function PdfPageViewer({ const rowRenderer: ListRowRenderer = ({ index, key, style }) => (
+
@@ -140,7 +140,7 @@ export function PdfPreview({ return (
-
+
{file ? ( +
diff --git a/src/frontend/apps/drive/src/features/ui/preview/viewers/wopi/WopiOpenInEditor.tsx b/src/frontend/apps/drive/src/features/ui/preview/viewers/wopi/WopiOpenInEditor.tsx index b47130e9..152e9064 100644 --- a/src/frontend/apps/drive/src/features/ui/preview/viewers/wopi/WopiOpenInEditor.tsx +++ b/src/frontend/apps/drive/src/features/ui/preview/viewers/wopi/WopiOpenInEditor.tsx @@ -13,7 +13,7 @@ export const WopiOpenInEditor = ({ file }: WopiOpenInEditorProps) => { const { t } = useTranslation(); return ( -
+