import React, { useState } from 'react'; import { User, Sparkles, ChevronDown, ChevronRight, Copy, Check } from 'lucide-react'; import MarkdownRenderer from './MarkdownRenderer'; import ProcessFlow from './ProcessFlow'; import { ChatMessage } from '../types'; interface ChatMessageProps { message: ChatMessage; isLast?: boolean; } const ChatMessageItem = ({ message, isLast }: ChatMessageProps) => { const isUser = message.role === 'user'; const [showThinking, setShowThinking] = useState(false); const [copied, setCopied] = useState(false); // Check if there is any thinking data to show const hasThinkingData = message.analysis || (message.experts && message.experts.length > 0); const handleCopy = () => { if (!message.content) return; navigator.clipboard.writeText(message.content); setCopied(true); setTimeout(() => setCopied(false), 2000); }; return (
{/* Avatar */}
{isUser ? ( ) : ( )}
{/* Content */}
{isUser ? 'You' : 'Prisma'}
{message.content && ( )}
{/* Thinking Process Accordion (Only for AI) */} {!isUser && hasThinkingData && (
{showThinking && (
)}
)} {/* Text Content */}
{message.content ? ( ) : ( message.isThinking && )}
{/* Internal Monologue (Synthesis Thoughts) - Optional Footer */} {!isUser && message.synthesisThoughts && (
Show Internal Monologue
{message.synthesisThoughts}
)}
); }; export default ChatMessageItem;