import React, { useEffect, useState } from 'react'; import { X, ZoomIn, ZoomOut, Download } from 'lucide-react'; interface ImagePreviewModalProps { isOpen: boolean; onClose: () => void; src: string; alt?: string; } export default function ImagePreviewModal({ isOpen, onClose, src, alt }: ImagePreviewModalProps) { const [scale, setScale] = useState(1); const [isDragging, setIsDragging] = useState(false); const [position, setPosition] = useState({ x: 0, y: 0 }); const [startPos, setStartPos] = useState({ x: 0, y: 0 }); // Reset state when modal opens useEffect(() => { if (isOpen) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = 'unset'; } return () => { document.body.style.overflow = 'unset'; }; }, [isOpen]); const handleZoomIn = (e: React.MouseEvent) => { e.stopPropagation(); setScale(prev => Math.min(prev + 0.5, 4)); }; const handleZoomOut = (e: React.MouseEvent) => { e.stopPropagation(); setScale(prev => Math.max(prev - 0.5, 1)); if (scale <= 1.5) { setPosition({ x: 0, y: 0 }); // Reset position if zoomed out } }; const handleDownload = (e: React.MouseEvent) => { e.stopPropagation(); const link = document.createElement('a'); link.href = src; link.download = alt || 'image-download'; document.body.appendChild(link); link.click(); document.body.removeChild(link); }; // Mouse event handlers for dragging const handleMouseDown = (e: React.MouseEvent) => { if (scale > 1) { setIsDragging(true); setStartPos({ x: e.clientX - position.x, y: e.clientY - position.y }); } }; const handleMouseMove = (e: React.MouseEvent) => { if (isDragging && scale > 1) { setPosition({ x: e.clientX - startPos.x, y: e.clientY - startPos.y }); } }; const handleMouseUp = () => { setIsDragging(false); }; if (!isOpen) return null; return (