import { useEffect, useMemo, useState } from 'react'; import { BrandMark } from '../../../shared/components/BrandMark'; import { HomeSidebar } from '../components/HomeSidebar'; import { HomeTopbar } from '../components/HomeTopbar'; import { MessagesWorkspace } from '../components/MessagesWorkspace'; import { CallsWorkspace } from '../components/CallsWorkspace'; import { AttendantOpsPanel } from '../components/AttendantOpsPanel'; import { recentCalls, sidebarItems } from '../services/homeMocks'; import { useViewport } from '../../../shared/hooks/useViewport'; import { useChat } from '../../chat/hooks/useChat'; import { listContactProfiles } from '../../chat/services/contactProfileService'; function truncatePreview(value, limit = 96) { const text = String(value || '').replace(/\s+/g, ' ').trim(); if (text.length <= limit) return text; return `${text.slice(0, limit).trim()}...`; } function toHomeConversation(contact, messages = []) { const lastMessage = contact.preview || messages[messages.length - 1]?.text || ''; return { id: contact.id, name: contact.name, channel: contact.channel || 'WhatsApp', status: contact.status || 'online', lastMessage: truncatePreview(lastMessage), unread: contact.unread || 0, time: contact.time || 'Agora', lastSeen: contact.lastSeen, messages: messages.map((message) => ({ id: message.id, from: message.sender === 'agent' ? 'agent' : 'customer', text: message.text || (message.hasMedia ? '[Mídia]' : ''), timestamp: message.timestamp, })), }; } export function HomePage() { const { isWideDesktop, isDesktop, isTablet, isMobile } = useViewport(); const { contacts, activeContactId, setActiveContactId, messages, sendMessage, isLoadingChats, isPaused, pauseDurationLabel, isPresenceLoading, pauseAttendance, resumeAttendance, } = useChat(); const [activeTab, setActiveTab] = useState('messages'); const [searchValue, setSearchValue] = useState(''); const [contactCount, setContactCount] = useState(0); useEffect(() => { let isMounted = true; listContactProfiles() .then((items) => { if (isMounted) setContactCount(Array.isArray(items) ? items.length : 0); }) .catch(() => { if (isMounted) setContactCount(0); }); return () => { isMounted = false; }; }, []); const sidebarWithContactCount = useMemo( () => sidebarItems.map((item) => (item.id === 'contacts' ? { ...item, count: contactCount } : item)), [contactCount], ); const conversations = contacts.map((contact) => toHomeConversation(contact, contact.id === activeContactId ? messages : []), ); const search = searchValue.trim().toLowerCase(); const filteredConversations = !search ? conversations : conversations.filter((conversation) => { const haystack = `${conversation.name} ${conversation.channel} ${conversation.lastMessage}`; return haystack.toLowerCase().includes(search); }); const safeConversationId = filteredConversations.find((conversation) => conversation.id === activeContactId)?.id || filteredConversations[0]?.id || conversations[0]?.id; return (
{isLoadingChats ? (
Atualizando conversas do WhatsApp...
) : null} {activeTab === 'messages' ? ( { setActiveContactId(conversationId); await sendMessage(reply, conversationId); }} isWideDesktop={isWideDesktop} isDesktop={isDesktop} isTablet={isTablet} isMobile={isMobile} isPaused={isPaused} pauseDurationLabel={pauseDurationLabel} /> ) : ( )}
); }