import React, { useState, useRef } from 'react';
import { Upload, FileText, File, X, CheckCircle, AlertCircle } from 'lucide-react';
import { useTheme } from '../contexts/ThemeContext';
import '../styles/FileUpload.css'
const FileUpload = ({ onFileUploaded, isUploading, onUploadStart, currentChatSessionId = null, authToken = null }) => {
const [dragActive, setDragActive] = useState(false);
const [uploadStatus, setUploadStatus] = useState(null); // 'success', 'error', null
const [uploadMessage, setUploadMessage] = useState('');
const [selectedFile, setSelectedFile] = useState(null);
const fileInputRef = useRef(null);
const { isDark } = useTheme();
const supportedTypes = {
'application/pdf': { ext: 'PDF', icon: FileText, color: '#EF4444' },
'application/vnd.openxmlformats-officedocument.wordprocessingml.document': { ext: 'DOCX', icon: File, color: '#3B82F6' },
'text/plain': { ext: 'TXT', icon: FileText, color: '#10B981' }
};
const validateFile = (file) => {
if (!supportedTypes[file.type]) {
return { valid: false, error: 'Only PDF, DOCX, and TXT files are supported.' };
}
if (file.size > 10 * 1024 * 1024) { // 10MB limit
return { valid: false, error: 'File size must be less than 10MB.' };
}
return { valid: true };
};
const uploadFile = async (file) => {
const validation = validateFile(file);
if (!validation.valid) {
setUploadStatus('error');
setUploadMessage(validation.error);
return;
}
setSelectedFile(file);
onUploadStart && onUploadStart();
const formData = new FormData();
formData.append('file', file);
try {
let uploadUrl = `${process.env.REACT_APP_API_URL}/upload-document`;
console.log('=== DOCUMENT UPLOAD DEBUG ===');
console.log('currentChatSessionId:', currentChatSessionId);
console.log('authToken available:', !!authToken);
if (currentChatSessionId) {
uploadUrl += `?chat_session_id=${currentChatSessionId}`;
console.log('Uploading to specific chat session:', currentChatSessionId);
console.log('Final upload URL:', uploadUrl);
} else {
console.log('WARNING: No currentChatSessionId - uploading to new session');
console.log('This will cause session mismatch!');
}
// Include auth token in headers if available
const headers = {};
if (authToken) {
headers['Authorization'] = `Bearer ${authToken}`;
console.log('Auth token included in request');
} else {
console.log('WARNING: No auth token available');
}
const response = await fetch(uploadUrl, {
method: 'POST',
headers: headers,
body: formData,
});
if (response.ok) {
const data = await response.json();
setUploadStatus('success');
setUploadMessage(`${file.name} uploaded successfully and added to context.`);
onFileUploaded && onFileUploaded(file, data);
// ENHANCED: Better debug logging
console.log('=== UPLOAD RESULT ===');
console.log('Document upload result:', {
filename: data.filename,
session_id: data.session_id,
chat_session_id: data.chat_session_id,
user_id: data.user_id,
chunks_created: data.chunks_created,
currentSessionId: currentChatSessionId
});
// Check for session mismatch
if (data.chat_session_id !== currentChatSessionId) {
console.error('SESSION MISMATCH DETECTED!');
console.error('Expected:', currentChatSessionId);
console.error('Got:', data.chat_session_id);
} else {
console.log('✅ Session IDs match correctly');
}
// Auto-clear success message after 5 seconds
setTimeout(() => {
setUploadStatus(null);
setSelectedFile(null);
setUploadMessage('');
}, 5000);
} else {
const errorData = await response.json();
throw new Error(errorData.detail || 'Upload failed');
}
} catch (error) {
setUploadStatus('error');
setUploadMessage(`Upload failed: ${error.message}`);
console.error('Upload error:', error);
}
};
const handleDrag = (e) => {
e.preventDefault();
e.stopPropagation();
if (e.type === 'dragenter' || e.type === 'dragover') {
setDragActive(true);
} else if (e.type === 'dragleave') {
setDragActive(false);
}
};
const handleDrop = (e) => {
e.preventDefault();
e.stopPropagation();
setDragActive(false);
if (isUploading) return;
const files = Array.from(e.dataTransfer.files);
if (files.length > 0) {
uploadFile(files[0]);
}
};
const handleFileSelect = (e) => {
const files = Array.from(e.target.files);
if (files.length > 0) {
uploadFile(files[0]);
}
};
const openFileDialog = () => {
if (!isUploading) {
fileInputRef.current?.click();
}
};
const clearStatus = () => {
setUploadStatus(null);
setSelectedFile(null);
setUploadMessage('');
};
const getFileIcon = (file) => {
const fileInfo = supportedTypes[file.type];
if (fileInfo) {
const Icon = fileInfo.icon;
return
Uploading {selectedFile?.name}...
> ) : ( <>Click to upload or drag and drop
PDF, DOCX, or TXT files only
> )}