import React, { useCallback, useState } from 'react'; import { useDropzone } from 'react-dropzone'; import { motion, AnimatePresence } from 'framer-motion'; import { CloudArrowUpIcon, DocumentIcon, CheckCircleIcon, XCircleIcon, XMarkIcon } from '@heroicons/react/24/outline'; import { uploadDocument } from '../services/api'; import toast from 'react-hot-toast'; const FileUploader = ({ darkMode, onClose }) => { const [uploading, setUploading] = useState(false); const [uploadedFiles, setUploadedFiles] = useState([]); const onDrop = useCallback(async (acceptedFiles) => { setUploading(true); for (const file of acceptedFiles) { try { const formData = new FormData(); formData.append('file', file); await uploadDocument(formData); setUploadedFiles(prev => [...prev, { name: file.name, size: file.size, status: 'success' }]); toast.success(`${file.name} uploaded successfully!`); } catch (error) { setUploadedFiles(prev => [...prev, { name: file.name, size: file.size, status: 'error' }]); toast.error(`Failed to upload ${file.name}`); } } setUploading(false); }, []); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { 'application/pdf': ['.pdf'], 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': ['.docx'], 'text/plain': ['.txt'] }, multiple: true }); const formatFileSize = (bytes) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; }; const removeFile = (index) => { setUploadedFiles(prev => prev.filter((_, i) => i !== index)); }; return (
{/* Dropzone */}

{isDragActive ? 'Drop files here' : 'Upload study materials'}

Drag & drop files here, or click to browse

PDF DOCX TXT
{/* Upload Progress */} {uploading && (
Uploading files...
)} {/* Uploaded Files List */} {uploadedFiles.length > 0 && (

Uploaded Files

{uploadedFiles.map((file, index) => (

{file.name}

{formatFileSize(file.size)}

{file.status === 'success' ? ( ) : ( )}
))}
)}
{/* Close Button */} {onClose && (
)}
); }; export default FileUploader;