'use client'; import * as React from 'react'; import { Download, CheckCircle, XCircle, Loader2 } from 'lucide-react'; import { cn } from '@/lib/utils/cn'; import { Button } from '@/components/ui/Button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/Card'; import { Progress } from '@/components/ui/Progress'; import { downloadBlob, formatFileSize, generateOutputFilename } from '@/lib/utils/fileUtils'; import type { ConversionJob } from '@/types/conversion'; export interface ConversionPreviewProps { job: ConversionJob; onDownload?: () => void; } export function ConversionPreview({ job, onDownload }: ConversionPreviewProps) { const [previewUrl, setPreviewUrl] = React.useState(null); // Create preview URL for result React.useEffect(() => { if (job.result && job.status === 'completed') { const url = URL.createObjectURL(job.result); setPreviewUrl(url); return () => { URL.revokeObjectURL(url); }; } }, [job.result, job.status]); const handleDownload = () => { if (job.result) { const filename = generateOutputFilename(job.inputFile.name, job.outputFormat.extension); downloadBlob(job.result, filename); onDownload?.(); } }; const renderPreview = () => { if (!previewUrl || !job.result) return null; const category = job.outputFormat.category; switch (category) { case 'image': return (
Converted image preview
); case 'video': return (
); case 'audio': return (
); default: return null; } }; const renderStatus = () => { switch (job.status) { case 'loading': return (
Loading converter...
); case 'processing': return (
Converting...
); case 'completed': return (
Conversion complete! {job.result && ( {formatFileSize(job.result.size)} )}
); case 'error': return (
Conversion failed
); default: return null; } }; if (job.status === 'pending') { return null; } return ( Conversion Status
{/* Status */} {renderStatus()} {/* Error message */} {job.error && (

{job.error}

)} {/* Preview */} {job.status === 'completed' && renderPreview()} {/* Download button */} {job.status === 'completed' && job.result && ( )} {/* Duration */} {job.status === 'completed' && job.startTime && job.endTime && (

Completed in {((job.endTime - job.startTime) / 1000).toFixed(2)}s

)}
); }