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 (
{canNavigate && (
)}
{item.name}
{canNavigate ? ` (${currentIndex + 1}/${images.length})` : ""}
{canNavigate && (
)}
);
}