'use client'; import { X, ZoomIn, ZoomOut, Download, Film, Image as ImageIcon } from 'lucide-react'; import { useState, useRef, useEffect } from 'react'; interface AssetPreviewModalProps { isOpen: boolean; onClose: () => void; assetUrl: string; assetType: 'image' | 'video'; assetName?: string; } export default function AssetPreviewModal({ isOpen, onClose, assetUrl, assetType, assetName = 'Preview' }: AssetPreviewModalProps) { const [scale, setScale] = useState(1); const [isDragging, setIsDragging] = useState(false); const [position, setPosition] = useState({ x: 0, y: 0 }); const [dragStart, setDragStart] = useState({ x: 0, y: 0 }); const containerRef = useRef(null); // Reset state when modal opens/closes or asset changes useEffect(() => { if (isOpen) { setScale(1); setPosition({ x: 0, y: 0 }); } }, [isOpen, assetUrl]); if (!isOpen) return null; const handleZoomIn = () => setScale(s => Math.min(s + 0.5, 4)); const handleZoomOut = () => setScale(s => Math.max(s - 0.5, 1)); const handleWheel = (e: React.WheelEvent) => { if (e.ctrlKey || e.metaKey) { e.preventDefault(); const delta = e.deltaY > 0 ? -0.1 : 0.1; setScale(s => Math.min(Math.max(s + delta, 0.5), 5)); } }; const handleMouseDown = (e: React.MouseEvent) => { if (scale > 1) { setIsDragging(true); setDragStart({ x: e.clientX - position.x, y: e.clientY - position.y }); } }; const handleMouseMove = (e: React.MouseEvent) => { if (isDragging && scale > 1) { setPosition({ x: e.clientX - dragStart.x, y: e.clientY - dragStart.y }); } }; const handleMouseUp = () => setIsDragging(false); return (
{ // Close if clicking the background if (e.target === e.currentTarget) onClose(); }} > {/* Toolbar */}
{assetType === 'video' ? : } {assetName}
{/* Zoom Controls (only for images) */} {assetType === 'image' && (
{(scale * 100).toFixed(0)}%
)}
{/* Content Area */}
{assetType === 'video' ? (
{/* Hint overlay */} {assetType === 'image' && scale === 1 && (
Scroll to zoom • Drag to pan
)}
); }