Spaces:
Runtime error
Runtime error
| 'use client'; | |
| interface ProgressProps { | |
| text?: string; | |
| percentage?: number; | |
| loaded?: number; | |
| total?: number; | |
| done?: boolean; | |
| } | |
| // Helper to format bytes to KB/MB/GB | |
| function formatBytes(bytes?: number): string { | |
| if (bytes === undefined || bytes === null) return ''; | |
| if (bytes < 1024) return `${bytes} B`; | |
| if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; | |
| if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(2)} MB`; | |
| return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`; | |
| } | |
| export default function Progress({ text, percentage, loaded, total, done }: ProgressProps) { | |
| // Ensure percentage is always a number between 0 and 100 | |
| // percentage = Math.min(100, Math.max(0, | |
| // percentage ?? (loaded && total ? (loaded / total) * 100 : 0) | |
| // )); | |
| return ( | |
| <div className="w-full max-w-4xl mx-auto"> | |
| {text && ( | |
| <div className="flex justify-between text-sm text-gray-600 mb-1 items-center"> | |
| <span className="truncate max-w-[70%]">{text}</span> | |
| {done ? ( | |
| <span className="flex items-center text-green-600 font-semibold whitespace-nowrap"> | |
| <svg className="w-5 h-5 mr-1 text-green-500" fill="none" stroke="currentColor" strokeWidth="3" viewBox="0 0 24 24"> | |
| <path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7" /> | |
| </svg> | |
| Download completed | |
| </span> | |
| ) : ( | |
| <span className="whitespace-nowrap"> | |
| {loaded !== undefined && total !== undefined && percentage !== undefined && total > 0 | |
| ? `${formatBytes(loaded)} / ${formatBytes(total)} (${percentage.toFixed(1)}%)` | |
| : `${percentage}%`} | |
| </span> | |
| )} | |
| </div> | |
| )} | |
| <div className="w-full bg-gray-200 rounded-full h-3"> | |
| <div | |
| className={`${done | |
| ? 'bg-green-500' | |
| : 'bg-gradient-to-r from-blue-400 to-blue-600'} h-3 rounded-full transition-all duration-300`} | |
| style={{ width: `${percentage}%` }} | |
| ></div> | |
| </div> | |
| </div> | |
| ); | |
| } |