'use client' import { useState, useCallback } from 'react' import { api } from '@/lib/api' import { USE_MOCK } from '@/contexts/AuthContext' interface UploadResult { url: string file_key: string file_name: string file_size: number } interface UseOSSUploadReturn { upload: (file: File) => Promise isUploading: boolean progress: number error: string | null reset: () => void } export function useOSSUpload(fileType: string = 'general'): UseOSSUploadReturn { const [isUploading, setIsUploading] = useState(false) const [progress, setProgress] = useState(0) const [error, setError] = useState(null) const reset = useCallback(() => { setIsUploading(false) setProgress(0) setError(null) }, []) const upload = useCallback(async (file: File): Promise => { setIsUploading(true) setProgress(0) setError(null) try { if (USE_MOCK) { // Mock 模式:模拟 2 秒上传 for (let i = 0; i <= 100; i += 20) { await new Promise(r => setTimeout(r, 400)) setProgress(i) } const result: UploadResult = { url: `https://mock-oss.example.com/${fileType}/${Date.now()}_${file.name}`, file_key: `${fileType}/${Date.now()}_${file.name}`, file_name: file.name, file_size: file.size, } setProgress(100) setIsUploading(false) return result } // 后端代理上传:文件 → 后端 → TOS,避免浏览器 CORS/代理问题 setProgress(5) const result = await api.proxyUpload(file, fileType, (pct) => { setProgress(5 + Math.round(pct * 0.9)) }) setProgress(100) setIsUploading(false) return { url: result.url, file_key: result.file_key, file_name: result.file_name, file_size: result.file_size, } } catch (err) { const message = err instanceof Error ? err.message : '上传失败' setError(message) setIsUploading(false) throw err } }, [fileType]) return { upload, isUploading, progress, error, reset } }