import { useEffect, useMemo, useRef } from 'react';
function getMediaUrl(media) {
if (!media?.data || !media?.mimetype) return '';
return `data:${media.mimetype};base64,${media.data}`;
}
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 midia...
);
}
if (message.mediaError) {
return (
Nao foi possivel carregar a midia.
);
}
if (mimetype.startsWith('image/')) {
return (
{
event.currentTarget.style.transform = 'scale(1.015)';
}}
onMouseLeave={(event) => {
event.currentTarget.style.transform = 'scale(1)';
}}
/>
);
}
if (mimetype.startsWith('video/')) {
return (
);
}
if (mimetype.startsWith('audio/') || mimetype.includes('ogg')) {
return ;
}
return (
📄
{filename}
);
}
function AttachmentPreview({ file, onRemove }) {
if (!file) return null;
const mediaUrl = getMediaUrl({ data: file.data, mimetype: file.type });
return (
{file.type?.startsWith('image/') ? (

) : (
📎
)}
{file.name}
{file.type || 'arquivo'}
);
}
function ContactPresence({ contact }) {
const status = contact.status || 'offline';
const color =
status === 'online'
? '#16a34a'
: status === 'away'
? '#e5a22a'
: '#dc2626';
const label = status === 'online' ? 'Online agora' : contact.lastSeen || 'Offline';
return (
{label}
);
}
export function ChatWindow({
contact,
messages,
selectedArea,
setSelectedArea,
draft,
setDraft,
attachedFile,
onAttachFile,
onRemoveAttachedFile,
onLoadMedia,
onSend,
onToggleTransfer,
isReplying,
isMobile = false,
}) {
const messagesRef = useRef(null);
useEffect(() => {
const container = messagesRef.current;
if (!container) {
return;
}
container.scrollTo({
top: container.scrollHeight,
behavior: 'smooth',
});
}, [messages, isReplying]);
return (
{contact.name}
{messages.map((message) => {
const isAgent = message.sender === 'agent';
const isSystem = message.sender === 'system';
if (isSystem) {
return (
{message.text}
);
}
return (
{message.text ? {message.text} : null}
);
})}
{messages.length === 0 ? (
Nenhuma mensagem carregada.
) : null}
{isReplying ? (
Digitando...
) : null}
);
}