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 (
);
}
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' && (
)}
)}
);
};