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; } function clampImageIndex(index: number, imageCount: number): number { if (imageCount <= 0) return 0; return Math.min(Math.max(index, 0), imageCount - 1); } function useExpandedImageDialogKeyboardNavigation({ imageCount, navigateImage, onClose, }: { imageCount: number; navigateImage: (direction: -1 | 1) => void; onClose: () => void; }) { useEffect(() => { const onKeyDown = (event: globalThis.KeyboardEvent) => { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); onClose(); return; } if (imageCount <= 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); }, [imageCount, navigateImage, onClose]); } export const ExpandedImageDialog = memo(function ExpandedImageDialog({ preview, onClose, }: ExpandedImageDialogProps) { const imageCount = preview.images.length; const [imageIndex, setImageIndex] = useState(() => clampImageIndex(preview.index, imageCount)); const activeImageIndex = clampImageIndex(imageIndex, imageCount); const navigateImage = useCallback( (direction: -1 | 1) => { setImageIndex((existing) => { if (imageCount <= 1) return existing; return (existing + direction + imageCount) % imageCount; }); }, [imageCount], ); const navigateToPreviousImage = useCallback(() => { navigateImage(-1); }, [navigateImage]); const navigateToNextImage = useCallback(() => { navigateImage(1); }, [navigateImage]); useExpandedImageDialogKeyboardNavigation({ imageCount, navigateImage, onClose, }); const item = preview.images[activeImageIndex]; if (!item) return null; return (
)}
{item.name}

{item.name} {imageCount > 1 ? ` (${activeImageIndex + 1}/${imageCount})` : ""}

{imageCount > 1 && ( )}
); });