import { Check, Download, FileOutput, Loader2 } from "lucide-react"; import { usePdfToImageStore } from "@/stores/pdf-to-image-store"; const PREVIEWABLE_FORMATS = new Set(["png", "jpg", "webp", "gif", "avif"]); function formatSize(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(0)} KB`; return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; } export function PdfToImagePreview() { const store = usePdfToImageStore(); // No file uploaded if (!store.file) { return (

Upload a PDF to get started

); } // Loading preview thumbnails if (store.loadingPreview) { return (

Generating page previews...

); } // Converting - show thumbnails with progress overlay if (store.processing) { return (

Converting {store.selectedPages.size} page {store.selectedPages.size !== 1 ? "s" : ""}...

{store.thumbnails.map((thumb) => { const isSelected = store.selectedPages.has(thumb.page); return (
{`Page {isSelected && (
)}
{thumb.page}
); })}
); } // Results ready - show converted images if (store.results && store.results.length > 0) { const isPreviewable = PREVIEWABLE_FORMATS.has(store.format); const totalSize = store.results.reduce((sum, r) => sum + (r.size ?? 0), 0); return (

{store.results.length} page {store.results.length !== 1 ? "s" : ""} converted {totalSize > 0 && ( ({formatSize(totalSize)}) )}

{store.format}
{store.results.map((result) => { const thumb = store.thumbnails.find((t) => t.page === result.page); return (
{isPreviewable ? ( {`Page ) : thumb?.dataUrl ? ( {`Page ) : (
)} {/* Page number badge */}
{result.page}
{/* Format badge */}
{store.format}
{/* File size badge */} {result.size > 0 && (
{formatSize(result.size)}
)} {/* Download overlay */}
); })}
); } // Thumbnails loaded - show selectable page previews if (store.thumbnails.length > 0) { const allSelected = store.pageCount !== null && store.selectedPages.size === store.pageCount; const noneSelected = store.selectedPages.size === 0; return (

{store.selectedPages.size} of {store.pageCount} page {store.pageCount !== 1 ? "s" : ""} selected

{!allSelected && ( )} {!noneSelected && ( )}
{store.thumbnails.map((thumb) => { const isSelected = store.selectedPages.has(thumb.page); return ( ); })}
); } // Fallback return (

Upload a PDF to get started

); }