import { memo, useCallback, useEffect, useState } from "react"; import { ChevronLeftIcon, ChevronRightIcon, DownloadIcon, XIcon } from "lucide-react"; import { Button } from "../ui/button"; import { downloadVideoPreview, type ExpandedImagePreview } from "./ExpandedImagePreview"; interface ExpandedImageDialogProps { preview: ExpandedImagePreview; onClose: () => void; } export const ExpandedImageDialog = memo(function ExpandedImageDialog({ preview, onClose, }: ExpandedImageDialogProps) { const [imageOffset, setImageOffset] = useState(0); const [failedVideoSrc, setFailedVideoSrc] = useState(null); const [downloadingVideoSrc, setDownloadingVideoSrc] = useState(null); const [downloadFailedVideoSrc, setDownloadFailedVideoSrc] = useState(null); const index = (preview.index + imageOffset + preview.images.length) % preview.images.length; const navigateImage = useCallback((direction: -1 | 1) => { setImageOffset((current) => current + direction); }, []); const downloadVideo = async (src: string, name: string) => { setDownloadFailedVideoSrc(null); setDownloadingVideoSrc(src); try { await downloadVideoPreview(src, name); } catch { setDownloadFailedVideoSrc(src); } finally { setDownloadingVideoSrc((current) => (current === src ? null : current)); } }; useEffect(() => { const onKeyDown = (event: globalThis.KeyboardEvent) => { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); onClose(); return; } if (preview.images.length <= 1) return; if (event.key === "ArrowLeft") { event.preventDefault(); event.stopPropagation(); navigateImage(-1); return; } if (event.key !== "ArrowRight") return; event.preventDefault(); event.stopPropagation(); navigateImage(1); }; window.addEventListener("keydown", onKeyDown); return () => window.removeEventListener("keydown", onKeyDown); }, [navigateImage, onClose, preview.images.length]); const item = preview.images[index]; if (!item) return null; const mediaLabel = item.type === "video" ? "video" : "image"; const isDownloadingVideo = downloadingVideoSrc === item.src; const videoDownloadFailed = downloadFailedVideoSrc === item.src; return (
)}
{item.type === "video" && failedVideoSrc === item.src ? (

{videoDownloadFailed ? "Could not download this video." : "This video format cannot be played here."}

) : item.type === "video" ? (
{preview.images.length > 1 && ( )}
); });