'use client' import type { BatchUploadStatus, BatchFileItem } from './upload-types' import { formatSpeed, calculateRemainingTime } from './upload-utils' interface UploadProgressProps { uploading: boolean isBatchMode: boolean batchUploadStatus: BatchUploadStatus | null batchFiles?: BatchFileItem[] // 用于计算实际文件大小 uploadProgress: number uploadSpeed: number isProcessing: boolean onCancel: () => void } export default function UploadProgress({ uploading, isBatchMode, batchUploadStatus, batchFiles, uploadProgress, uploadSpeed, 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 visibleFileStatuses = fileStatuses.filter(s => s.status !== 'done') // 计算剩余字节数(使用实际文件大小) const remainingBytes = fileStatuses .slice(currentFileIndex) .reduce((sum, status, idx) => { const fileStatus = batchUploadStatus.fileStatuses[currentFileIndex + idx] if (!fileStatus) return sum // 从batchFiles中查找对应的文件大小 const batchFile = batchFiles?.find(bf => bf.file.name === fileStatus.fileName) const fileSize = batchFile?.file.size || 0 return sum + (fileSize * (100 - status.progress) / 100) }, 0) return (