diff --git a/src/components/ChatPanel.tsx b/src/components/ChatPanel.tsx index c1ebbb1..3d2d35e 100644 --- a/src/components/ChatPanel.tsx +++ b/src/components/ChatPanel.tsx @@ -31,7 +31,11 @@ export default function ChatPanel({ chatId, fullscreen = false }: Props) { useEffect(() => { const unsub = wsClient.on("message.new", (data: any) => { if (data.chat_id === chatId) { - setMessages((prev) => [...prev, data as Message]); + setMessages((prev) => { + // Dedup by message id + if (prev.some((m) => m.id === data.id)) return prev; + return [...prev, data as Message]; + }); } }); return () => { unsub?.(); }; diff --git a/src/main.tsx b/src/main.tsx index 3d4bdea..c1ba65c 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,10 +1,9 @@ -import { StrictMode } from 'react' +// StrictMode removed — causes double WS subscriptions (double useEffect) +// import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './index.css' import App from './App.tsx' createRoot(document.getElementById('root')!).render( - - - , + , ) \ No newline at end of file