import { CheckCircle2, ChevronLeft, ChevronRight, Loader2 } from "lucide-react"; import { useCallback } from "react"; import { BeforeAfterSlider } from "@/components/common/before-after-slider"; import { ImageViewer } from "@/components/common/image-viewer"; import { ThumbnailStrip } from "@/components/common/thumbnail-strip"; import { useFileStore } from "@/stores/file-store"; const BROWSER_PREVIEWABLE_EXTS = new Set([ "jpg", "jpeg", "png", "gif", "webp", "svg", "bmp", "ico", "avif", ]); function canBrowserPreview(url: string): boolean { if (url.startsWith("blob:")) return true; const ext = decodeURIComponent(url).split(".").pop()?.toLowerCase() ?? ""; return BROWSER_PREVIEWABLE_EXTS.has(ext); } export function MultiImageViewer() { const { entries, selectedIndex, setSelectedIndex, navigateNext, navigatePrev } = useFileStore(); const handleKeyDown = useCallback( (e: React.KeyboardEvent) => { if (e.key === "ArrowLeft") { e.preventDefault(); navigatePrev(); } else if (e.key === "ArrowRight") { e.preventDefault(); navigateNext(); } }, [navigateNext, navigatePrev], ); const currentEntry = entries[selectedIndex]; if (!currentEntry) return null; const hasMultiple = entries.length > 1; const hasPrev = selectedIndex > 0; const hasNext = selectedIndex < entries.length - 1; const hasProcessed = !!currentEntry.processedUrl; const isPreviewable = hasProcessed && currentEntry.processedUrl ? canBrowserPreview(currentEntry.processedUrl) : false; const displayUrl = currentEntry.processedPreviewUrl ?? currentEntry.processedUrl; const processedFilename = currentEntry.processedUrl ? decodeURIComponent(currentEntry.processedUrl.split("/").pop() ?? "processed") : "processed"; const processedExt = processedFilename.split(".").pop()?.toUpperCase() || "FILE"; return (
{hasMultiple && hasPrev && ( )}
{hasProcessed && !isPreviewable && !currentEntry.processedPreviewUrl ? (

{processedFilename}

{processedExt} files cannot be previewed in the browser.

) : hasProcessed ? ( ) : currentEntry.previewLoading ? (

Generating preview...

) : ( )}
{hasMultiple && hasNext && ( )} {hasMultiple && (
{selectedIndex + 1} / {entries.length}
)}
); }