"use client" import { FC, useEffect, useRef, useState } from "react" import { Socket } from "socket.io-client" import { ClientToServerEvents, ServerToClientEvents } from "../../lib/socket" type ChatMessage = { id: string userId: string name: string text: string ts: number } interface Props { socket: Socket className?: string } const ChatPanel: FC = ({ socket, className }) => { const [messages, _setMessages] = useState([]) const [text, setText] = useState("") const messagesRef = useRef(messages) const setMessages = (m: ChatMessage[]) => { messagesRef.current = m _setMessages(m) } useEffect(() => { const onHistory = (history: ChatMessage[]) => { setMessages(history) } const onNew = (msg: ChatMessage) => { setMessages([...messagesRef.current, msg].slice(-200)) } socket.on("chatHistory", onHistory) socket.on("chatNew", onNew) return () => { socket.off("chatHistory", onHistory) socket.off("chatNew", onNew) } }, [socket]) const send = () => { const trimmed = text.trim() if (!trimmed) return socket.emit("chatMessage", trimmed) setText("") } return (
{messages.map((m) => (
{m.name} • {new Date(m.ts).toLocaleTimeString()}
{m.text}
))} {messages.length === 0 &&
No messages yet
}
setText(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") send() }} />
) } export default ChatPanel