import React, { useState, useRef, useEffect } from 'react'; import { Send, Paperclip } from 'lucide-react'; import FileUpload from './FileUpload'; import { uploadFile } from '@/app/actions/messagerieAction'; import logger from '@/utils/logger'; const MessageInput = ({ onSendMessage, onTypingStart, onTypingStop, disabled = false, placeholder = 'Tapez votre message...', conversationId = null, senderId = null, }) => { const [message, setMessage] = useState(''); const [isTyping, setIsTyping] = useState(false); const [selectedFile, setSelectedFile] = useState(null); const [showFileUpload, setShowFileUpload] = useState(false); const textareaRef = useRef(null); const typingTimeoutRef = useRef(null); // Ajuster la hauteur du textarea automatiquement useEffect(() => { if (textareaRef.current) { textareaRef.current.style.height = 'auto'; textareaRef.current.style.height = `${Math.min(textareaRef.current.scrollHeight, 120)}px`; } }, [message]); const handleInputChange = (e) => { const value = e.target.value; setMessage(value); // Gestion du statut de frappe if (value.trim() && !isTyping) { setIsTyping(true); onTypingStart?.(); } // Réinitialiser le timeout de frappe if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); } typingTimeoutRef.current = setTimeout(() => { if (isTyping) { setIsTyping(false); onTypingStop?.(); } }, 1000); }; const handleKeyDown = (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); } }; const handleSend = () => { const trimmedMessage = message.trim(); logger.debug(' MessageInput: handleSend appelé:', { message, trimmedMessage, disabled, }); if (!trimmedMessage || disabled) { logger.debug(' MessageInput: Message vide ou désactivé'); return; } logger.debug( ' MessageInput: Appel de onSendMessage avec:', trimmedMessage ); onSendMessage(trimmedMessage); setMessage(''); // Arrêter le statut de frappe if (isTyping) { setIsTyping(false); onTypingStop?.(); } // Effacer le timeout if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); } }; const handleFileSelect = (e) => { const file = e.target.files[0]; if (file) { setSelectedFile(file); setShowFileUpload(true); } // Réinitialiser l'input file e.target.value = ''; }; const handleFileUpload = async ( file, conversationId, senderId, onProgress ) => { try { const result = await uploadFile( file, conversationId, senderId, onProgress ); // Envoyer un message avec le fichier onSendMessage('', { type: 'file', fileName: file.name, fileSize: file.size, fileType: file.type, fileUrl: result.fileUrl, }); // Réinitialiser l'état setSelectedFile(null); setShowFileUpload(false); return result; } catch (error) { throw error; } }; const handleCancelFileUpload = () => { setSelectedFile(null); setShowFileUpload(false); }; // Nettoyage du timeout lors du démontage du composant useEffect(() => { return () => { if (typingTimeoutRef.current) { clearTimeout(typingTimeoutRef.current); } }; }, []); return (
{/* Aperçu d'upload de fichier */} {showFileUpload && selectedFile && (
)} {/* Zone de saisie */}
{/* Zone de saisie */}