'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 && (
)}
)
}