import { useState, useRef, useEffect } from 'react'; import { useParams, useOutletContext, useNavigate } from 'react-router-dom'; import { useChat } from '../hooks/useChat'; function Chat() { const { name } = useParams(); const { showToast } = useOutletContext(); const navigate = useNavigate(); const [message, setMessage] = useState(''); const messagesEndRef = useRef(null); // Use our custom chat hook const { messages, sending, error, isConnected, sendMessage, clearChat, clearError } = useChat(name); // Update document title useEffect(() => { if (name) { document.title = `Chat with ${name} - LocalAGI`; } return () => { document.title = 'LocalAGI'; // Reset title when component unmounts }; }, [name]); // Scroll to bottom when messages change useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); // Show error toast if there's an error useEffect(() => { if (error) { showToast(error, 'error'); clearError(); } }, [error, showToast, clearError]); // Handle form submission const handleSubmit = async (e) => { e.preventDefault(); if (!message.trim()) return; const success = await sendMessage(message.trim()); if (success) { setMessage(''); } }; // Handle pressing Enter to send (Shift+Enter for new line) const handleKeyDown = (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSubmit(e); } }; return (

Chat with {name}

{isConnected ? 'Connected' : 'Disconnected'}
{messages.length === 0 ? (

No messages yet

Start a conversation with {name}!

) : ( messages.map((msg) => (
{msg.content}
{new Date(msg.timestamp).toLocaleTimeString()}
)) )}