import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; import { CitationsPanel } from '@/components/CitationsPanel'; import { ConfidenceBadge } from '@/components/ConfidenceBadge'; import type { ChatMessage } from '@/lib/types'; import { isCivicSetuResponse } from '@/lib/types'; interface Props { message: ChatMessage; } export function MessageBubble({ message }: Props) { if (message.role === 'user') { return (

{message.text}

); } if (message.role === 'error') { return (
{message.text}
); } const data = message.data; const isRichResponse = data !== undefined && isCivicSetuResponse(data); return (

{children}

, h1: ({ children }) =>

{children}

, h2: ({ children }) =>

{children}

, h3: ({ children }) =>

{children}

, ul: ({ children }) =>
    {children}
, ol: ({ children }) =>
    {children}
, li: ({ children }) =>
  • {children}
  • , strong: ({ children }) => {children}, blockquote: ({ children }) => (
    {children}
    ), hr: () =>
    , table: ({ children }) => (
    {children}
    ), thead: ({ children }) => {children}, tbody: ({ children }) => {children}, th: ({ children }) => {children}, td: ({ children }) => {children}, code: ({ children, className }) => ( {children} ), pre: ({ children }) => (
                    {children}
                  
    ), a: ({ children, href }) => ( {children} ), }} > {message.text}
    {isRichResponse && data.citations.length > 0 ? : null} {isRichResponse ? (
    Confidence:
    {data.conflict_warnings.length > 0 ? (

    Conflict warning: {data.conflict_warnings.join(', ')}

    ) : null} {data.amendment_notice ? (

    Amendment notice: {data.amendment_notice}

    ) : null}
    ) : null}
    ); }