import { Fragment, useEffect, useMemo, useRef } from 'react'; function getMediaUrl(media) { if (!media?.data || !media?.mimetype) return ''; return `data:${media.mimetype};base64,${media.data}`; } function parseMessageText(text) { const rawText = String(text || ''); const match = rawText.match(/^\*(Atendente(?: virtual)?:\s*[^*]+)\*\s*\n+/i); if (!match) { return { senderLabel: null, body: rawText, }; } return { senderLabel: match[1], body: rawText.slice(match[0].length), }; } function formatMessageTime(timestamp) { if (!timestamp) return ''; const numericTimestamp = Number(timestamp); const date = new Date(numericTimestamp > 1000000000000 ? numericTimestamp : numericTimestamp * 1000); return date.toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' }); } function getMessageDate(timestamp) { if (!timestamp) return null; const numericTimestamp = Number(timestamp); const date = new Date(numericTimestamp > 1000000000000 ? numericTimestamp : numericTimestamp * 1000); if (Number.isNaN(date.getTime())) return null; return date; } function getDateKey(timestamp) { const date = getMessageDate(timestamp); if (!date) return ''; return date.toISOString().slice(0, 10); } function formatDateSeparator(timestamp) { const date = getMessageDate(timestamp); if (!date) return ''; const today = new Date(); const isToday = date.getFullYear() === today.getFullYear() && date.getMonth() === today.getMonth() && date.getDate() === today.getDate(); if (isToday) return 'Hoje'; return date.toLocaleDateString('pt-BR'); } function DateSeparator({ label }) { if (!label) return null; return (
{label}
); } function MediaRenderer({ message, contactId, onLoadMedia, isAgent }) { const mediaUrl = useMemo(() => getMediaUrl(message.media), [message.media]); const mimetype = message.media?.mimetype || ''; const filename = message.media?.filename || 'arquivo'; useEffect(() => { if (!message.hasMedia || message.media?.data || message.mediaLoading || message.mediaError) { return; } onLoadMedia?.(contactId, message.id); }, [contactId, message, onLoadMedia]); if (!message.hasMedia && !message.media) return null; if (message.mediaLoading || (!message.media?.data && !message.mediaError)) { return (
Carregando mídia...
); } if (message.mediaError) { return ( Não foi possível carregar a mídia. ); } if (mimetype.startsWith('image/')) { return ( {filename} { event.currentTarget.style.transform = 'scale(1.015)'; }} onMouseLeave={(event) => { event.currentTarget.style.transform = 'scale(1)'; }} /> ); } if (mimetype.startsWith('video/')) { return (