import React, { useState, useRef, useEffect } from 'react'; import ReactMarkdown from 'react-markdown'; const ChatInterface = ({ selectedDocument, ws }) => { const [messages, setMessages] = useState([]); const [currentMessage, setCurrentMessage] = useState(''); const [isLoading, setIsLoading] = useState(false); const messagesEndRef = useRef(null); useEffect(() => { if (selectedDocument) { setMessages([{ type: 'assistant', content: `Je suis prêt à répondre à vos questions sur le document: **${selectedDocument.filename}**. N'hésitez pas à être précis dans vos questions.`, timestamp: new Date() }]); } else { setMessages([{ type: 'assistant', content: `Bienvenue dans l'assistant médical RAG CHU. **Pour commencer :** 1. Uploadez un document médical (PDF, DOCX, Image) 2. Attendez l'analyse automatique 3. Sélectionnez le document dans la liste 4. Posez vos questions ! **Conseils :** - Utilisez des documents médicaux authentiques - Posez des questions précises sur les traitements, posologies, critères... - Consultez la console debug à droite pour suivre l'analyse`, timestamp: new Date() }]); } }, [selectedDocument]); useEffect(() => { scrollToBottom(); }, [messages]); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }; const sendMessage = async () => { if (!currentMessage.trim() || isLoading || !selectedDocument) return; const userMessage = { type: 'user', content: currentMessage, timestamp: new Date() }; setMessages(prev => [...prev, userMessage]); const questionToSend = currentMessage; setCurrentMessage(''); setIsLoading(true); // ID pour le message assistant const assistantMessageId = Date.now(); // Timeout de sécurité pour éviter les blocages const timeoutId = setTimeout(() => { console.warn('Timeout: Réinitialisation forcée de isLoading'); setIsLoading(false); }, 30000); // 30 secondes de timeout try { // Utiliser directement l'endpoint normal pour simplicité et fiabilité console.log('💬 Utilisation endpoint normal /api/chat'); const response = await fetch('/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ question: questionToSend, document_id: selectedDocument.document_id }), }); if (!response.ok) { clearTimeout(timeoutId); let errorMessage = `Erreur HTTP ${response.status}`; try { const errorData = await response.json(); errorMessage = errorData.detail || errorMessage; } catch (jsonError) { const errorText = await response.text(); errorMessage = errorText || errorMessage; } throw new Error(errorMessage); } // Récupérer la réponse complète const result = await response.json(); // Afficher la réponse directement const assistantMessage = { id: assistantMessageId, type: 'assistant', content: result.response, timestamp: new Date(), isStreaming: false }; setMessages(prev => [...prev, assistantMessage]); clearTimeout(timeoutId); setIsLoading(false); } catch (error) { console.error('Erreur chat:', error); // Créer un message d'erreur const errorMessage = { id: assistantMessageId, type: 'assistant', content: `Erreur : ${error.message}`, timestamp: new Date(), isStreaming: false }; setMessages(prev => [...prev, errorMessage]); } finally { clearTimeout(timeoutId); setIsLoading(false); } }; const handleKeyPress = (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); sendMessage(); } }; const formatTimestamp = (timestamp) => { return timestamp.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' }); }; return (
{message.content}
) : (