'use client'; import { useEffect, useState } from 'react'; import { io } from 'socket.io-client'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { ScrollArea } from '@/components/ui/scroll-area'; type Message = { text: string; senderId: string; timestamp: string; } export default function SocketDemo() { const [messages, setMessages] = useState([]); const [inputMessage, setInputMessage] = useState(''); const [socket, setSocket] = useState(null); const [isConnected, setIsConnected] = useState(false); useEffect(() => { const socketInstance = io({ path: '/api/socketio', }); setSocket(socketInstance); socketInstance.on('connect', () => { setIsConnected(true); }); socketInstance.on('disconnect', () => { setIsConnected(false); }); socketInstance.on('message', (msg: Message) => { setMessages(prev => [...prev, msg]); }); return () => { socketInstance.disconnect(); }; }, []); const sendMessage = () => { if (socket && inputMessage.trim()) { setMessages(prev => [...prev, { text: inputMessage.trim(), senderId: socket.id || 'user', timestamp: new Date().toISOString() }]); socket.emit('message', { text: inputMessage.trim(), senderId: socket.id || 'user', timestamp: new Date().toISOString() }); setInputMessage(''); } }; const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { sendMessage(); } }; return (
WebSocket Demo {isConnected ? 'Connected' : 'Disconnected'}
{messages.length === 0 ? (

No messages yet

) : ( messages.map((msg, index) => (

{msg.senderId}

{msg.text}

{new Date(msg.timestamp).toLocaleTimeString()}
)) )}
setInputMessage(e.target.value)} onKeyPress={handleKeyPress} placeholder="Type a message..." disabled={!isConnected} className="flex-1" />
); }