import { useCallback, useState } from "react"; import { useDropzone } from "react-dropzone"; import { motion, HTMLMotionProps } from "framer-motion"; interface FileUploadProps { onFileSelect: (file: File) => void; selectedFile: File | null; } export default function FileUpload({ onFileSelect, selectedFile, }: FileUploadProps) { const [error, setError] = useState(null); const onDrop = useCallback( (acceptedFiles: File[]) => { if (acceptedFiles.length > 0) { const file = acceptedFiles[0]; if (file.type.startsWith("image/")) { onFileSelect(file); setError(null); } else { setError("请上传有效的图片文件。"); } } }, [onFileSelect] ); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { "image/*": [".jpeg", ".jpg", ".png", ".gif", ".webp"], }, multiple: false, }); return ( <> , "onDragStart">} className={`border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors ${ isDragActive ? "border-blue-500 bg-blue-50 dark:bg-blue-900" : "border-gray-300 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-500" }`} whileHover={{ scale: 1.02 }} whileTap={{ scale: 0.98 }} > {isDragActive ? (

拖放图片到这里 ...

) : (

拖放图片到这里,或点击选择图片

)}
{error &&

{error}

} {selectedFile && (

已成功上传:{" "} {selectedFile.name}

文件大小: {(selectedFile.size / 1024 / 1024).toFixed(2)} MB

{selectedFile.type.startsWith("image/") && (
{selectedFile.name}
)}
)} ); }