import React, { useState } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import Avatar, { AvatarConfig } from 'react-nice-avatar'; import ReactMarkdown from 'react-markdown'; import { Bot, Copy, Check } from 'lucide-react'; interface Message { id: string; role: 'user' | 'assistant' | 'system'; content: string; timestamp: string; } interface MessageBubbleProps { message: Message; isLast: boolean; userName?: string; avatarConfig?: AvatarConfig; } const MessageBubble = ({ message, userName, avatarConfig }: MessageBubbleProps) => { const isUser = message.role === 'user'; const [isCopied, setIsCopied] = useState(false); const [isHovered, setIsHovered] = useState(false); const [copiedCodeBlock, setCopiedCodeBlock] = useState(null); const handleCopy = async () => { try { await navigator.clipboard.writeText(message.content); setIsCopied(true); setTimeout(() => setIsCopied(false), 2000); } catch (err) { console.error('Failed to copy text:', err); } }; const handleCodeCopy = async (code: string) => { try { await navigator.clipboard.writeText(code); setCopiedCodeBlock(code); setTimeout(() => setCopiedCodeBlock(null), 2000); } catch (err) { console.error('Failed to copy code:', err); } }; const bubbleVariants = { hidden: { opacity: 0, y: 20, scale: 0.95 }, visible: { opacity: 1, y: 0, scale: 1, transition: { type: "spring", stiffness: 300, damping: 24 } } }; const iconVariants = { hover: { scale: 1.2, rotate: 360, transition: { duration: 0.5 } } }; const copyButtonVariants = { hidden: { opacity: 0, scale: 0.8 }, visible: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.8 } }; return ( {!isUser && ( )}
!isUser && setIsHovered(true)} onMouseLeave={() => !isUser && setIsHovered(false)} > {isUser ? userName : 'SOVIRO'} {new Date(message.timestamp).toLocaleTimeString()} {!isUser && ( {isHovered && ( {isCopied ? ( ) : ( )} )} )}
{children} ); } return (
{match && ( {match[1]} )}
                            {code}
                          
); }, p: ({ children }) => (

{children}

), }} > {message.content}
{isUser && ( )}
); }; export default MessageBubble;