// Tela: Conversas — caixa de entrada do WhatsApp (dados reais) const { useState: useConvState, useEffect: useConvEffect, useRef: useConvRef } = React; const convHeaders = () => { const t = localStorage.getItem('ezza_token'); return { 'Content-Type':'application/json', ...(t?{'Authorization':`Bearer ${t}`}:{}) }; }; function Conversas({ goto }) { const [conversas, setConversas] = useConvState([]); const [sel, setSel] = useConvState(null); // conversa selecionada const [mensagens, setMensagens] = useConvState([]); const [texto, setTexto] = useConvState(''); const [loading, setLoading] = useConvState(true); const [enviando, setEnviando] = useConvState(false); const toast = useToast(); const fimRef = useConvRef(null); const carregarConversas = () => { fetch('/api/conversas', { headers: convHeaders() }) .then(r => r.json()) .then(d => { if (d.ok) setConversas(d.conversas); }) .catch(() => {}) .finally(() => setLoading(false)); }; useConvEffect(() => { carregarConversas(); }, []); const abrir = (c) => { setSel(c); fetch(`/api/conversas/${c.id}/mensagens`, { headers: convHeaders() }) .then(r => r.json()) .then(d => { if (d.ok) setMensagens(d.mensagens); }) .catch(() => {}); }; useConvEffect(() => { if (fimRef.current) fimRef.current.scrollIntoView({ behavior: 'smooth' }); }, [mensagens]); const enviar = async () => { if (!texto.trim() || !sel) return; const msg = texto.trim(); setTexto(''); setEnviando(true); // adiciona localmente (otimista) setMensagens(prev => [...prev, { id: 'tmp'+Date.now(), direcao: 'out', texto: msg, criado_em: new Date().toISOString() }]); try { const r = await fetch('/api/whatsapp/send', { method: 'POST', headers: convHeaders(), body: JSON.stringify({ to: sel.telefone, message: msg }), }); const d = await r.json(); if (!d.ok) toast('⚠ WhatsApp não enviou: ' + (d.error || 'verifique a conexão')); } catch (e) { toast('Erro de conexão'); } setEnviando(false); }; const horaMsg = (iso) => { try { const d = new Date(String(iso).replace(' ','T')); return `${String(d.getHours()).padStart(2,'0')}:${String(d.getMinutes()).padStart(2,'0')}`; } catch (e) { return ''; } }; return ( <> Conversas WhatsApp} subtitle={`${conversas.length} conversa${conversas.length!==1?'s':''}`} right={} />
{/* Lista de conversas */}
{loading &&
Carregando…
} {!loading && conversas.length === 0 && (
{ICN.whatsapp}
Nenhuma conversa ainda
As mensagens recebidas no WhatsApp aparecem aqui automaticamente quando o número estiver conectado.
)} {conversas.map(c => (
abrir(c)}>
{(c.contato_nome || c.telefone || '?')[0].toUpperCase()}
{c.contato_nome || c.telefone} {c.nao_lidas > 0 && {c.nao_lidas}}
{c.ultima_msg || '—'}
))}
{/* Painel de mensagens */}
{!sel && (
Selecione uma conversa para ver as mensagens.
)} {sel && ( <>
{(sel.contato_nome || sel.telefone || '?')[0].toUpperCase()}
{sel.contato_nome || sel.telefone} {sel.telefone}
{mensagens.length === 0 &&
Sem mensagens nesta conversa.
} {mensagens.map(m => (
{m.texto} {horaMsg(m.criado_em)}
))}
setTexto(e.target.value)} onKeyDown={e => e.key === 'Enter' && enviar()} />
)}
); } window.Conversas = Conversas;