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 (

{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 ? (

) : thumb?.dataUrl ? (

) : (
)}
{/* 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
);
}