import React, { useState, useEffect, useCallback } from 'react'; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { establishPeerConnection } from '../webrtc'; import { clearMessages } from '../api' interface ChatProps { token: string; onLogout: () => void; } type ObjectMessage = { id?: number; content: string; }; type Message = string | ObjectMessage; const Chat: React.FC = ({ token, onLogout }) => { const [message, setMessage] = useState(''); const [messages, setMessages] = useState([]); const [peerConnection, setPeerConnection] = useState(null); const [dataChannel, setDataChannel] = useState(null); const setupPeerConnection = useCallback(async () => { try { const { pc, dc } = await establishPeerConnection(token); setPeerConnection(pc); setDataChannel(dc); peerConnection; dc.onmessage = (event) => { setMessages((prevMessages) => { let lastMessage = prevMessages[prevMessages.length - 1]; if (!lastMessage || typeof lastMessage == 'string') { let aiMessage: Message = { content: event.data } return [...prevMessages, aiMessage]; } else { const updatedMessage = {...lastMessage} updatedMessage.content += event.data; return [...prevMessages.slice(0, -1), updatedMessage]; } }); }; } catch (error) { console.error('Failed to establish peer connection:', error); onLogout(); // Logout if connection fails } }, [token, onLogout]); useEffect(() => { setupPeerConnection(); }, [setupPeerConnection]); const sendMessage = () => { if (dataChannel && dataChannel.readyState === 'open') { dataChannel.send(message); setMessages((prevMessages) => [...prevMessages, `You: ${message}`]); setMessage(''); } else { console.error('Data channel is not open'); } }; const renderMessage = (message: any, index: number) => { const dateOptions: Intl.DateTimeFormatOptions = { hour: "2-digit", minute: "2-digit", }; const date = new Date().toLocaleTimeString( undefined, dateOptions ); if (typeof message === 'string') { return (
') }} />
{date}
); } else { return (
') }} />
{date}
); } }; return (
{messages.map((message, index) => renderMessage(message, index))}
setMessage(e.target.value)} onKeyUp={(e) => { if (e.key === "Enter") { sendMessage(); } }} />
); }; export default Chat;