import { useState, useCallback } from "react" import { useQueryClient } from "@tanstack/react-query" import { message } from "antd" import { uploadAssetDirect } from "@/api/assets" import { MAX_FILE_SIZE, LARGE_FILE_THRESHOLD } from "../constants" /** * 素材上传 Hook * 封装上传状态、进度管理和上传逻辑 */ interface UseAssetUploadProps { effectiveLibId: string } export function useAssetUpload({ effectiveLibId }: UseAssetUploadProps) { const queryClient = useQueryClient() const [uploading, setUploading] = useState(false) const [uploadProgress, setUploadProgress] = useState(0) const handleUpload = useCallback( async (file: File) => { if (file.size > MAX_FILE_SIZE) { message.error(`文件 "${file.name}" 超过 2GB 限制`) return } if (!effectiveLibId) { message.warning("请先选择或创建一个视频库") return } setUploading(true) setUploadProgress(0) try { if (file.size > LARGE_FILE_THRESHOLD) { message.info(`大文件 "${file.name}" 将使用直传上传`) } await uploadAssetDirect({ file, library_id: effectiveLibId, onProgress: (pct) => setUploadProgress(pct), }) message.success(`"${file.name}" 上传成功`) queryClient.invalidateQueries({ queryKey: ["assets"] }) queryClient.invalidateQueries({ queryKey: ["asset-libraries"] }) } catch (err: unknown) { const detail = err instanceof Error ? err.message : "" console.error("[handleUpload] 上传失败:", err) message.error(`"${file.name}" 上传失败${detail ? `:${detail}` : ""}`) // 错误时延迟关闭弹窗,让用户能看到错误提示 await new Promise((r) => setTimeout(r, 1500)) } finally { setUploading(false) setUploadProgress(0) } }, [effectiveLibId, queryClient], ) return { uploading, uploadProgress, handleUpload, } }