'use client' import { useState } from 'react' import ReactMarkdown from 'react-markdown' import { cn } from '@/lib/utils' import { ChevronDown, ChevronUp, FileText, User, Bot, Database, Loader2 } from 'lucide-react' import type { ChatMessage as ChatMessageType, SourceReference } from '@/types/chat' import { ArtifactRenderer } from './artifacts/ArtifactRenderer' interface ChatMessageProps { message: ChatMessageType isStreaming?: boolean toolsExecuting?: string[] } function SourcesList({ sources }: { sources: SourceReference[] }) { const [isExpanded, setIsExpanded] = useState(false) if (sources.length === 0) return null return (
{isExpanded && (
{sources.map((source, index) => (
{source.title} {source.section_title && ( {' '} › {source.section_title} )}
{source.source_file} ({(source.similarity * 100).toFixed(0)}% relevans)
))}
)}
) } const TOOL_LABELS: Record = { get_invoices: 'Hämtar fakturor', get_supplier_invoices: 'Hämtar leverantörsfakturor', get_account_balances: 'Hämtar kontosaldon', get_transactions: 'Hämtar transaktioner', get_journal_entries: 'Hämtar verifikationer', get_income_statement: 'Genererar resultaträkning', get_balance_sheet: 'Genererar balansräkning', get_vat_summary: 'Beräknar momssammanställning', get_company_overview: 'Hämtar företagsöversikt', get_aging_report: 'Genererar åldersanalys', } function ToolExecutingIndicator({ tools }: { tools: string[] }) { if (tools.length === 0) return null return (
{tools.map((toolName, i) => (
{TOOL_LABELS[toolName] || toolName}...
))}
) } export function ChatMessage({ message, isStreaming, toolsExecuting }: ChatMessageProps) { const isUser = message.role === 'user' return (
{/* Avatar */}
{isUser ? ( ) : ( )}
{/* Message content */}
{/* Tool execution indicator */} {!isUser && isStreaming && toolsExecuting && toolsExecuting.length > 0 && !message.content && ( )}
{isUser ? (

{message.content}

) : ( {message.content} )} {isStreaming && !isUser && ( )}
{/* Artifact visualization */} {!isUser && message.artifact && ( )} {!isUser && message.sources && message.sources.length > 0 && ( )}
) }