import { FormEvent, useEffect, useRef, useState } from 'react'; import { sendChat } from '../api'; import type { ChatMessage } from '../types'; const SYSTEM_PROMPT: ChatMessage = { role: 'system', content: 'You are a helpful assistant. Answer concisely.', }; export function ChatTab() { const [messages, setMessages] = useState([]); const [draft, setDraft] = useState(''); const [sending, setSending] = useState(false); const [error, setError] = useState(null); const listRef = useRef(null); useEffect(() => { if (listRef.current) listRef.current.scrollTop = listRef.current.scrollHeight; }, [messages, sending]); async function onSubmit(event: FormEvent) { event.preventDefault(); const content = draft.trim(); if (!content || sending) return; const next: ChatMessage[] = [...messages, { role: 'user', content }]; setMessages(next); setDraft(''); setSending(true); setError(null); try { const assistant = await sendChat([SYSTEM_PROMPT, ...next]); setMessages([...next, assistant]); } catch (err) { setError(err instanceof Error ? err.message : String(err)); } finally { setSending(false); } } return (
{messages.length === 0 ?

Ask the assistant anything to get started.

: null} {messages.map((m, idx) => (
{m.role === 'user' ? 'You' : 'Assistant'}

{m.content}

))} {sending ? (
Assistant

) : null}
{error ?

{error}

: null}
setDraft(e.target.value)} placeholder="Ask anything…" disabled={sending} data-testid="composer-input" />
); }