'use client' import type { BatchUploadStatus, BatchFileItem } from './upload-types' import { formatTransferProgress } from './upload-utils' interface UploadProgressProps { uploading: boolean isBatchMode: boolean batchUploadStatus: BatchUploadStatus | null batchFiles?: BatchFileItem[] // 用于计算实际文件大小 uploadProgress: number uploadSpeed: number uploadTotalBytes?: number isProcessing: boolean onCancel: () => void } export default function UploadProgress({ uploading, isBatchMode, batchUploadStatus, batchFiles, uploadProgress, uploadSpeed, uploadTotalBytes, isProcessing, onCancel, }: UploadProgressProps) { if (!uploading) return null if (isBatchMode && batchUploadStatus) { const { currentFileIndex, totalFiles, currentFileName, currentFileProgress, currentFileSpeed, fileStatuses } = batchUploadStatus const completedFiles = fileStatuses.filter(s => s.status === 'done').length const failedFiles = fileStatuses.filter(s => s.status === 'failed').length const processingFiles = fileStatuses.filter(s => s.status === 'uploading' || s.status === 'processing' || s.status === 'pending') const currentBatchFile = batchFiles?.find(bf => bf.file.name === currentFileName) const currentFileTotalBytes = currentBatchFile?.file.size || 0 const currentFileLoadedBytes = currentFileTotalBytes * (currentFileProgress / 100) // 只显示正在处理/等待中的文件,已完成的文件不显示(避免队列过长) const visibleFileStatuses = fileStatuses.filter(s => s.status !== 'done') return (
{/* 整体进度 */}
整体进度: {completedFiles}/{totalFiles} 完成 {failedFiles > 0 && ({failedFiles} 失败)} {uploadProgress}%
{/* 当前文件进度 */}
当前文件 ({currentFileIndex + 1}/{totalFiles}): {currentFileName} {currentFileProgress}%
{currentFileSpeed > 0 && (
{formatTransferProgress( currentFileSpeed, currentFileLoadedBytes, currentFileTotalBytes || undefined, )}
)}
{/* 文件状态列表 - 只显示正在处理/等待中/失败的文件 */} {visibleFileStatuses.length > 0 && (
队列 ({processingFiles.length} 个{failedFiles > 0 && `,${failedFiles} 个失败`})
{visibleFileStatuses.map((status, idx) => (
{status.status === 'done' && ✓} {status.status === 'failed' && ✗} {status.status === 'uploading' && ⟳} {status.status === 'processing' && ⏳} {status.status === 'pending' && ○} {status.fileName}
{status.progress}% {status.error && ( {status.error.length > 20 ? status.error.substring(0, 20) + '...' : status.error} )}
))}
)} {/* 所有文件都完成后的提示 */} {visibleFileStatuses.length === 0 && completedFiles === totalFiles && (
✓ 所有文件上传完成
)}
) } // 单文件上传进度 return (
{isProcessing ? '处理中...' : '上传中...'} {uploadProgress}%
{uploadSpeed > 0 && !isProcessing && (
{formatTransferProgress( uploadSpeed, uploadTotalBytes ? uploadTotalBytes * (uploadProgress / 100) : undefined, uploadTotalBytes, )}
)}
) }