import { useState, useRef, useEffect } from 'react' import type { KeyboardEvent } from 'react' import ReactMarkdown from 'react-markdown' import { IconSend } from '@tabler/icons-react' import { ToolCallCard } from './ToolCallCard' import type { ChatMessage } from '../hooks/useChat' interface ChatPanelProps { messages: ChatMessage[] isStreaming: boolean onSend: (content: string) => void sessionId: string | null } export function ChatPanel({ messages, isStreaming, onSend, sessionId }: ChatPanelProps) { const [input, setInput] = useState('') const messagesEndRef = useRef(null) useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }) }, [messages]) function handleSend() { if (input.trim() && !isStreaming) { onSend(input.trim()) setInput('') } } function handleKeyDown(e: KeyboardEvent) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault() handleSend() } } if (sessionId === null) { return (
Select or create a session to start researching
) } return (
{messages.map(message => (
{message.role === 'assistant' ? (
{message.content} {message.toolCalls?.map(tc => ( ))}
) : (
{message.content}
)}
))} {isStreaming && messages.length > 0 &&
Researching...
}
setInput(e.target.value)} onKeyDown={handleKeyDown} disabled={isStreaming} autoFocus />
) }