'use client'; import { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { XMarkIcon, CloudArrowUpIcon } from '@heroicons/react/24/outline'; import { messageManager } from '@/components/MessageNotification'; interface UploadSkinModalProps { isOpen: boolean; onClose: () => void; onUpload: (file: File, data: { name: string; description: string; type: 'SKIN' | 'CAPE'; is_public: boolean; is_slim: boolean; }) => Promise; isUploading?: boolean; uploadProgress?: number; } export default function UploadSkinModal({ isOpen, onClose, onUpload, isUploading = false, uploadProgress = 0 }: UploadSkinModalProps) { const [selectedFile, setSelectedFile] = useState(null); const [skinData, setSkinData] = useState({ name: '', description: '', type: 'SKIN' as 'SKIN' | 'CAPE', is_public: false, is_slim: false }); const handleFileSelect = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setSelectedFile(file); } }; const handleSubmit = async () => { if (!selectedFile || !skinData.name.trim()) { messageManager.warning('请选择皮肤文件并输入皮肤名称', { duration: 3000 }); return; } await onUpload(selectedFile, skinData); // 重置表单 setSelectedFile(null); setSkinData({ name: '', description: '', type: 'SKIN', is_public: false, is_slim: false }); }; return ( {isOpen && (

上传皮肤

点击选择文件或拖拽到此处

{selectedFile && (

已选择: {selectedFile.name}

)}
setSkinData(prev => ({ ...prev, name: e.target.value }))} className="w-full px-4 py-3 bg-gray-50 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-xl focus:ring-2 focus:ring-orange-500 focus:border-transparent" placeholder="请输入皮肤名称" />