import React, { useCallback, useState } from 'react'; import { useDropzone } from 'react-dropzone'; import { Box, Paper, Typography, CircularProgress, Alert, Button } from '@mui/material'; import CloudUploadIcon from '@mui/icons-material/CloudUpload'; import axios from 'axios'; const FileUpload = ({ onUploadSuccess, onProcessingStart, onProcessingEnd }) => { const [uploading, setUploading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); const onDrop = useCallback(async (acceptedFiles) => { if (acceptedFiles.length === 0) return; const file = acceptedFiles[0]; // Check file type if (!file.name.toLowerCase().endsWith('.txt') && !file.name.toLowerCase().endsWith('.pdf')) { setError('Only .txt and .pdf files are allowed'); return; } // Check file size (2MB limit) if (file.size > 2 * 1024 * 1024) { setError('File size exceeds 2MB limit'); return; } setUploading(true); setError(null); setSuccess(false); onProcessingStart(); const formData = new FormData(); formData.append('file', file); try { const response = await axios.post('http://localhost:8000/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', }, }); setSuccess(true); onUploadSuccess(file.name); } catch (err) { console.error('Upload error:', err); setError(err.response?.data?.detail || 'Error uploading file. Please try again.'); } finally { setUploading(false); onProcessingEnd(); } }, [onUploadSuccess, onProcessingStart, onProcessingEnd]); const { getRootProps, getInputProps, isDragActive } = useDropzone({ onDrop, accept: { 'text/plain': ['.txt'], 'application/pdf': ['.pdf'], }, maxSize: 2 * 1024 * 1024, // 2MB multiple: false, }); return ( {uploading ? ( Processing your file... ) : ( <> {isDragActive ? 'Drop the file here' : 'Drag & drop a file here, or click to select'} Supported formats: .txt, .pdf (max 2MB) )} {error && ( {error} )} {success && ( File uploaded successfully! You can now ask questions about the document. )} ); }; export default FileUpload;