import { memo, useCallback, useEffect, useState } from "react"; import { ChevronLeftIcon, ChevronRightIcon, XIcon } from "lucide-react"; import { Button } from "../ui/button"; import type { ExpandedImagePreview } from "./ExpandedImagePreview"; interface ExpandedImageDialogProps { preview: ExpandedImagePreview; onClose: () => void; } export const ExpandedImageDialog = memo(function ExpandedImageDialog({ preview: initialPreview, onClose, }: ExpandedImageDialogProps) { const [preview, setPreview] = useState(initialPreview); // Sync when the parent hands us a new preview reference. useEffect(() => { setPreview(initialPreview); }, [initialPreview]); const navigateImage = useCallback((direction: -1 | 1) => { setPreview((existing) => { if (existing.images.length <= 1) return existing; const nextIndex = (existing.index + direction + existing.images.length) % existing.images.length; if (nextIndex === existing.index) return existing; return { ...existing, index: nextIndex }; }); }, []); 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[preview.index]; if (!item) return null; return (
)}
{item.name}

{item.name} {preview.images.length > 1 ? ` (${preview.index + 1}/${preview.images.length})` : ""}

{preview.images.length > 1 && ( )}
); });