'use client' import { useState, useEffect } from 'react' import { getAllPendingUploads, deleteUploadState } from '@/lib/chunk-upload' // 格式化字节数 const formatBytes = (bytes: number) => { if (bytes === 0) return '0 B' const k = 1024 const sizes = ['B', 'KB', 'MB', 'GB'] const i = Math.floor(Math.log(bytes) / Math.log(k)) return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i] } interface ChunkUploadState { fileId: string fileName: string fileSize: number chunkSize: number totalChunks: number uploadedChunks: Set uploadId?: string metadata?: any } interface ResumeUploadModalProps { onClose: () => void onResume: (fileId: string, fileName: string, fileSize: number, metadata?: any) => void onPendingChange?: (count: number) => void } export default function ResumeUploadModal({ onClose, onResume, onPendingChange }: ResumeUploadModalProps) { const [pendingUploads, setPendingUploads] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => { loadPendingUploads() }, []) const loadPendingUploads = async () => { try { const uploads = await getAllPendingUploads() // 将Set转换为数组以便序列化 const serializedUploads = uploads.map(upload => ({ ...upload, uploadedChunks: Array.from(upload.uploadedChunks), })) setPendingUploads(serializedUploads as any) onPendingChange?.(serializedUploads.length) if (serializedUploads.length === 0) { onClose() } } catch (error) { console.error('[ResumeUploadModal] Failed to load pending uploads:', error) } finally { setLoading(false) } } const handleResume = (fileId: string, fileName: string, fileSize: number, metadata?: any) => { onResume(fileId, fileName, fileSize, metadata) onClose() } const handleCancel = async (fileId: string) => { try { await deleteUploadState(fileId) await loadPendingUploads() } catch (error) { console.error('[ResumeUploadModal] Failed to cancel upload:', error) } } const handleCancelAll = async () => { try { for (const upload of pendingUploads) { await deleteUploadState(upload.fileId) } await loadPendingUploads() if (pendingUploads.length === 0) { onClose() } } catch (error) { console.error('[ResumeUploadModal] Failed to cancel all uploads:', error) } } const getProgress = (upload: ChunkUploadState) => { const uploadedCount = Array.isArray(upload.uploadedChunks) ? upload.uploadedChunks.length : upload.uploadedChunks.size || 0 return Math.round((uploadedCount / upload.totalChunks) * 100) } if (loading) { return (

检查未完成的上传...

) } if (pendingUploads.length === 0) { return null } return (

发现未完成的上传

检测到 {pendingUploads.length} 个未完成的上传任务,可随时恢复继续。
提示:您仍可在其他页面继续新增上传。

{pendingUploads.map((upload) => { const progress = getProgress(upload) const uploadedCount = Array.isArray(upload.uploadedChunks) ? upload.uploadedChunks.length : upload.uploadedChunks.size || 0 return (

{upload.fileName}

{formatBytes(upload.fileSize)} • {uploadedCount}/{upload.totalChunks} 块已上传

{progress}%

) })}
) }