import { useEffect, useRef, useState } from "react"; import { useAgentStore } from "../../stores/useAgentStore"; import { useSocket } from "../../hooks/useSocket"; import { MessageBubble } from "./MessageBubble"; export function ChatPanel() { const { messages, addMessage, appendToken, pushTimeline } = useAgentStore(); const [input, setInput] = useState(""); const { socket, connected } = useSocket("demo-conv"); const endRef = useRef(null); useEffect(() => { endRef.current?.scrollIntoView({ behavior: "smooth" }); }, [messages]); const send = () => { if (!input.trim()) return; const id = crypto.randomUUID(); addMessage({ id, role: "user", mode: "vibe-code", content: input }); pushTimeline(`User: ${input.slice(0, 30)}`); const respId = crypto.randomUUID(); addMessage({ id: respId, role: "assistant", mode: "vibe-code", content: "", streaming: true, }); const tokens = "I'll build that for you. Creating components…".split(" "); tokens.forEach((t, i) => setTimeout(() => { appendToken(respId, `${t} `); if (i === tokens.length - 1) pushTimeline("Assistant responded"); }, i * 120), ); setInput(""); }; return (
{messages.length === 0 && (

Conversation started. Messages stream here.

)} {messages.map((m) => ( ))}
setInput(e.target.value)} onKeyDown={(e) => e.key === "Enter" && send()} placeholder={connected ? "Message Wren…" : "Connecting…"} className="input" />
); }