import React, { useCallback, useState } from "react"; import { Button, Dialog, DialogClose, DialogContent, Spinner, } from "@sparkle/components/"; import { ArrowDownOnSquareIcon, ChevronLeftIcon, ChevronRightIcon, XMarkIcon, } from "@sparkle/icons/app"; import { cn } from "@sparkle/lib/utils"; function downloadFile(url: string, filename: string) { const link = document.createElement("a"); link.href = url; link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); } interface ImageZoomDialogProps { open: boolean; onOpenChange: (open: boolean) => void; image: { src: string; alt?: string; title?: string; downloadUrl?: string; isLoading?: boolean; }; navigation?: { onPrevious: () => void; onNext: () => void; hasPrevious: boolean; hasNext: boolean; }; } function ImageZoomDialog({ open, onOpenChange, image, navigation, }: ImageZoomDialogProps) { const [imageLoaded, setImageLoaded] = useState(false); const handleDownload = useCallback( (e: React.MouseEvent) => { e.stopPropagation(); if (image.downloadUrl && image.title) { downloadFile(image.downloadUrl, image.title); } }, [image.downloadUrl, image.title] ); // Reset image loaded state when dialog closes or image changes React.useEffect(() => { setImageLoaded(false); }, [open, image.src]); return (
{/* Previous button */} {navigation?.hasPrevious && (
{/* Next button */} {navigation?.hasNext && (
); } ImageZoomDialog.displayName = "ImageZoomDialog"; export { downloadFile, ImageZoomDialog }; export type { ImageZoomDialogProps };