import React, { useState } from 'react'; import ReactMarkdown from 'react-markdown'; import { Trash2, Heart, Leaf, HelpCircle, Download } from 'lucide-react'; import { Role, Message, Language, AppMode } from '../types'; import { TEXTS } from '../constants'; import { formatConversationalTime } from '../utils'; interface MessageBubbleProps { message: Message; onDelete: (id: string) => void; onReact: (id: string, reaction: string) => void; onExport: (message: Message) => void; language: Language; mode: AppMode; } export const MessageBubble: React.FC = ({ message, onDelete, onReact, onExport, language, mode }) => { const isUser = message.role === Role.USER; const isAdvanced = mode === AppMode.ADVANCED; const [showActions, setShowActions] = useState(false); // Define icons with em sizing to scale with text const iconSize = "1.2em"; const strokeWidth = 1.5; return (
setShowActions(true)} onMouseLeave={() => setShowActions(false)} >
{message.content}
{/* Reactions Display */} {message.reactions && message.reactions.length > 0 && (
{message.reactions.map((r, i) => ( {r === 'heart' ? '❤️' : r === 'reflect' ? '🌿' : '🤔'} ))}
)}
{isAdvanced ? formatConversationalTime(message.timestamp) : message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} {/* Action Bar */}
{/* Export single message */} {isAdvanced && !message.error && ( )} {!message.error && ( )} {isAdvanced && !isUser && !message.error && (
)}
); };