import { useEffect, useState } from "react"; import { App, Button, Modal, Upload, type UploadFile } from "antd"; import { FileImage, Film, Music2, UploadCloud, X } from "lucide-react"; import { isAudioFile } from "@/lib/canvas/canvas-project-generation"; const CANVAS_UPLOAD_ACCEPT = "image/*,video/*,audio/mpeg,audio/wav,audio/x-wav,.mp3,.wav"; type CanvasUploadModalProps = { open: boolean; onClose: () => void; onUpload: (files: File[]) => Promise; }; export function CanvasUploadModal({ open, onClose, onUpload }: CanvasUploadModalProps) { const { message } = App.useApp(); const [fileList, setFileList] = useState([]); const [uploading, setUploading] = useState(false); useEffect(() => { if (!open) { setFileList([]); setUploading(false); } }, [open]); const submit = async () => { const files = fileList.flatMap((item) => item.originFileObj ? [item.originFileObj] : []); if (!files.length) return; setUploading(true); try { if (await onUpload(files)) onClose(); } catch (error) { message.error(error instanceof Error ? error.message : "文件上传失败,请稍后重试"); } finally { setUploading(false); } }; return (
上传文件
批量导入图片、视频和音频到当前画布
已选 {fileList.length} 项
{ if (isCanvasUploadFile(file)) return false; message.warning(`“${file.name}”不是支持的图片、视频或音频文件`); return Upload.LIST_IGNORE; }} onChange={({ fileList: nextFileList }) => setFileList(nextFileList)} showUploadList={false} styles={{ root: { display: "block", width: "100%" }, trigger: { borderColor: "var(--border)", borderRadius: "var(--r-lg)", background: "var(--workspace-surface)" }, }} >

拖动文件到这里,或点击选择

支持同时选择多个文件

{fileList.length ? (
{fileList.map((file) => (
{file.name}
))}
) : null}
文件将在确认后按顺序添加到画布
); } function CanvasUploadFilePreview({ file }: { file: UploadFile }) { const source = file.originFileObj; const [previewUrl, setPreviewUrl] = useState(""); useEffect(() => { if (!source || (!source.type.startsWith("image/") && !source.type.startsWith("video/"))) return; const objectUrl = URL.createObjectURL(source); setPreviewUrl(objectUrl); return () => URL.revokeObjectURL(objectUrl); }, [source]); if (source?.type.startsWith("image/") && previewUrl) { return {`预览:${file.name}`}; } if (source?.type.startsWith("video/") && previewUrl) { return