import React from 'react'; import { motion } from 'motion/react'; import { format } from 'date-fns'; import { AlertCircle, CheckCheck, FileText, Music, ShieldCheck } from 'lucide-react'; import { Message, Attachment } from '../types'; import { cn } from '../lib/utils'; import ReactMarkdown from 'react-markdown'; interface MessageBubbleProps { message: Message; } const AttachmentPreview = ({ attachment }: { attachment: Attachment }) => { if (attachment.type === 'image') { return (
{attachment.file.name}
{attachment.file.name}
); } const Icon = attachment.type === 'audio' ? Music : FileText; return (

{attachment.file.name}

{(attachment.file.size / 1024).toFixed(1)} KB

); }; export const MessageBubble: React.FC = ({ message }) => { const isUser = message.sender === 'user'; const [isPlaying, setIsPlaying] = React.useState(false); const audioRef = React.useRef(null); const togglePlay = () => { if (audioRef.current) { if (isPlaying) { audioRef.current.pause(); } else { audioRef.current.play(); } setIsPlaying(!isPlaying); } }; React.useEffect(() => { if (message.audio) { audioRef.current = new Audio(message.audio.url); audioRef.current.onended = () => setIsPlaying(false); } return () => { if (audioRef.current) { audioRef.current.pause(); audioRef.current = null; } }; }, [message.audio]); return (
{!isUser && (
Respuesta del portal
)}
{!isUser && (
)}
{message.attachments && message.attachments.length > 0 && (
{message.attachments.map((att) => ( ))}
)} {message.audio && (
0:{message.audio.duration.toString().padStart(2, '0')}
)} {message.text && (
{isUser ? ( message.text ) : (
{message.text}
)}
)}
{format(message.timestamp, 'HH:mm')} {isUser && ( {message.status === 'sending' && ( )} {message.status === 'sent' && ( )} {message.status === 'error' && ( )} )}
); };