import { useState } from 'react'
import type { SessionEvent } from '../../../api/types/session'
function truncate(s: string, n: number): string {
return s.length > n ? s.slice(0, n) + '…' : s
}
interface Props {
event: SessionEvent
defaultCollapsed: boolean
}
export function EventBlock({ event, defaultCollapsed }: Props) {
const [collapsed, setCollapsed] = useState(defaultCollapsed)
const base = 'rounded border px-3 py-2 my-1 text-sm'
switch (event.type) {
case 'user':
if (event.tool_result !== null && event.tool_result !== undefined) {
return (
{!collapsed && (
{typeof event.tool_result === 'string' ? event.tool_result : JSON.stringify(event.tool_result, null, 2)}
)}
)
}
return (
)
case 'assistant':
if (event.tool_name) {
return (
{!collapsed && event.tool_input && (
{JSON.stringify(event.tool_input, null, 2)}
)}
)
}
return (
assistant
{truncate(event.text ?? '—', collapsed ? 300 : Number.MAX_SAFE_INTEGER)}
{(event.text?.length ?? 0) > 300 && (
)}
)
case 'system':
return (
{!collapsed &&
{event.text ?? JSON.stringify(event.raw)}
}
)
case 'attachment':
return (
📎 attachment
)
default:
return (
{event.type}
)
}
}