import { useState } from 'react' import ReactMarkdown from 'react-markdown' import './MessageBubble.css' function MessageBubble({ message, isLast }) { const [showSources, setShowSources] = useState(false) const [selectedImage, setSelectedImage] = useState(null) const isUser = message.role === 'user' const isError = message.role === 'error' const isAssistant = message.role === 'assistant' return (
{/* Role icon */}
{isAssistant && (
)} {isUser && (
)} {isError && (
)}
{/* Message body */}
{/* Message Text — markdown for assistant, plain for user */}
{isAssistant ? ( {message.content} ) : ( message.content )}
{/* Images */} {isAssistant && message.images && message.images.length > 0 && (
{message.images.map((img, i) => ( ))}
)} {/* Sources */} {isAssistant && message.sources && message.sources.length > 0 && (
{showSources && (
{message.sources.map((source, i) => (
{i + 1} {source.source || 'Document'} {source.score && ( {(source.score * 100).toFixed(0)}% match )}

{source.content}

))}
)}
)}
{/* Image Modal */} {selectedImage && (
setSelectedImage(null)}>
e.stopPropagation()}> Full size reference

Page {selectedImage.page}

)}
) } export default MessageBubble