import { useEffect, useEffectEvent, 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 function ExpandedImageDialog({ preview, onClose }: ExpandedImageDialogProps) { return ( ); } function getPreviewResetKey(preview: ExpandedImagePreview): string { return [ preview.index, preview.images.length, ...preview.images.map((image) => `${image.src}\u0000${image.name}`), ].join("\u0001"); } function useExpandedImageKeyboardShortcuts(input: { readonly canNavigate: boolean; readonly onClose: () => void; readonly onNext: () => void; readonly onPrevious: () => void; }) { const handleKeyDown = useEffectEvent((event: globalThis.KeyboardEvent) => { if (event.key === "Escape") { event.preventDefault(); event.stopPropagation(); input.onClose(); return; } if (!input.canNavigate) return; if (event.key === "ArrowLeft") { event.preventDefault(); event.stopPropagation(); input.onPrevious(); return; } if (event.key !== "ArrowRight") return; event.preventDefault(); event.stopPropagation(); input.onNext(); }); useEffect(() => { const onKeyDown = (event: globalThis.KeyboardEvent) => handleKeyDown(event); window.addEventListener("keydown", onKeyDown); return () => window.removeEventListener("keydown", onKeyDown); }, []); } function ExpandedImageDialogContent({ preview, onClose }: ExpandedImageDialogProps) { const [indexOffset, setIndexOffset] = useState(0); const images = preview.images; const canNavigate = images.length > 1; const currentIndex = canNavigate ? (preview.index + indexOffset + images.length) % images.length : preview.index; const navigateImage = (direction: -1 | 1) => { if (!canNavigate) return; setIndexOffset((existingOffset) => existingOffset + direction); }; useExpandedImageKeyboardShortcuts({ canNavigate, onClose, onNext: () => navigateImage(1), onPrevious: () => navigateImage(-1), }); const item = images[currentIndex]; if (!item) return null; return (
)}
{item.name}

{item.name} {canNavigate ? ` (${currentIndex + 1}/${images.length})` : ""}

{canNavigate && ( )}
); }