import React, { useEffect, useCallback, memo } from "react"; import Author from "./Author"; import { useGenerator } from "../../context/GeneratorContext"; import { safeHref } from "../../utils/helpers"; const DownloadIcon = () => ( ); function ImagePreviewModal() { const { previewImage, setPreviewImage, toggleFavorite, isFavorite } = useGenerator(); const close = useCallback(() => { setPreviewImage(null); }, [setPreviewImage]); // Navigation via custom event const navigate = useCallback((direction) => { if (!previewImage) return; const event = new CustomEvent("previewNavigate", { detail: { direction, currentIndex: previewImage.index } }); window.dispatchEvent(event); }, [previewImage]); useEffect(() => { const handleKeyDown = (e) => { if (e.key === "Escape") close(); if (e.key === "ArrowLeft") navigate("prev"); if (e.key === "ArrowRight") navigate("next"); }; if (previewImage) { window.addEventListener("keydown", handleKeyDown); document.body.style.overflow = "hidden"; } return () => { window.removeEventListener("keydown", handleKeyDown); document.body.style.overflow = ""; }; }, [previewImage, close, navigate]); if (!previewImage) return null; const { imageSrc, imageAlt = "Image", previewUrl, author = {}, importUrl, downloadOptions = [], providerId, imageId, providerBadge, gifAnimatedUrl, } = previewImage; // Use the full original image for the modal (imageSrc is already original URL) const displayImageSrc = imageSrc || gifAnimatedUrl; const handleBackdropClick = (e) => { if (e.target === e.currentTarget) close(); }; const handleFavorite = () => { if (providerId && imageId) toggleFavorite(providerId, imageId, { imageSrc, imageAlt, author, importUrl, previewUrl }); }; const fav = providerId && imageId && isFavorite(providerId, imageId); return (
{imageAlt}
{providerBadge && ( {providerBadge} )} {gifAnimatedUrl && ( GIF )}

{imageAlt}

Author

Actions

{importUrl && ( )} {downloadOptions?.map((opt) => ( ))} {providerId && imageId && ( )} {safeHref(previewUrl) && ( View Original )}
); } export default memo(ImagePreviewModal);