import { useState, useEffect, useRef } from "react"; import { Send, User, ArrowLeft, Loader2 } from "lucide-react"; import toast from "react-hot-toast"; import { format } from "date-fns"; import { ptBR } from "date-fns/locale"; import { messageService, type Message, type Conversation } from "../services/messages/messageService"; interface ChatMessagesProps { currentUserId: string; currentUserName?: string; availableUsers?: Array<{ id: string; nome: string; role: string }>; onBack?: () => void; } export default function ChatMessages({ currentUserId, availableUsers = [], }: ChatMessagesProps) { const [conversations, setConversations] = useState([]); const [selectedUserId, setSelectedUserId] = useState(null); const [messages, setMessages] = useState([]); const [newMessage, setNewMessage] = useState(""); const [loading, setLoading] = useState(true); const [sending, setSending] = useState(false); const messagesEndRef = useRef(null); // Carrega conversas ao montar useEffect(() => { loadConversations(); // Inscreve-se para receber mensagens em tempo real const unsubscribe = messageService.subscribeToMessages( currentUserId, (newMsg) => { // Atualiza mensagens se a conversa está aberta if ( selectedUserId && (newMsg.sender_id === selectedUserId || newMsg.receiver_id === selectedUserId) ) { setMessages((prev) => [...prev, newMsg]); scrollToBottom(); } // Atualiza lista de conversas loadConversations(); } ); return () => { unsubscribe(); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [currentUserId, availableUsers]); // Carrega mensagens quando seleciona um usuário useEffect(() => { if (selectedUserId) { loadMessages(selectedUserId); } }, [selectedUserId]); // Auto-scroll para última mensagem useEffect(() => { scrollToBottom(); }, [messages]); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }; const loadConversations = async () => { try { setLoading(true); // Por enquanto não carrega conversas - apenas mostra lista de usuários disponíveis setConversations([]); } catch (error) { console.error("Erro ao carregar conversas:", error); } finally { setLoading(false); } }; const loadMessages = async (otherUserId: string) => { try { const msgs = await messageService.getMessagesBetweenUsers( currentUserId, otherUserId ); setMessages(msgs); // Marca mensagens como lidas await messageService.markMessagesAsRead(currentUserId, otherUserId); // Atualiza contador de não lidas na lista setConversations((prev) => prev.map((conv) => conv.user_id === otherUserId ? { ...conv, unread_count: 0 } : conv ) ); } catch (error) { console.error("Erro ao carregar mensagens:", error); toast.error("Erro ao carregar mensagens"); } }; const handleSendMessage = async (e: React.FormEvent) => { e.preventDefault(); if (!selectedUserId || !newMessage.trim()) { console.log('[ChatMessages] Validação falhou:', { selectedUserId, newMessage }); return; } console.log('[ChatMessages] Tentando enviar mensagem:', { currentUserId, selectedUserId, message: newMessage.trim() }); try { setSending(true); const sentMessage = await messageService.sendMessage( currentUserId, selectedUserId, newMessage.trim() ); console.log('[ChatMessages] Mensagem enviada com sucesso!', sentMessage); setMessages((prev) => [...prev, sentMessage]); setNewMessage(""); toast.success("Mensagem enviada!"); // Atualiza lista de conversas loadConversations(); } catch (error: any) { console.error("[ChatMessages] Erro detalhado ao enviar mensagem:", { error, message: error?.message, details: error?.details, hint: error?.hint, code: error?.code }); toast.error(`Erro ao enviar: ${error?.message || 'Erro desconhecido'}`); } finally { setSending(false); } }; const startNewConversation = (userId: string) => { setSelectedUserId(userId); setMessages([]); }; const formatMessageTime = (dateString: string) => { try { const date = new Date(dateString); const now = new Date(); const diffInHours = (now.getTime() - date.getTime()) / (1000 * 60 * 60); if (diffInHours < 24) { return format(date, "HH:mm", { locale: ptBR }); } else if (diffInHours < 48) { return "Ontem"; } else { return format(date, "dd/MM/yyyy", { locale: ptBR }); } } catch { return ""; } }; const getRoleLabel = (role: string) => { const labels: Record = { medico: "Médico", paciente: "Paciente", secretaria: "Secretária", admin: "Admin", }; return labels[role] || role; }; // Lista de conversas ou seleção de novo contato if (!selectedUserId) { return (

Mensagens

Converse com médicos e pacientes

{/* Botão para nova conversa se houver usuários disponíveis */} {availableUsers.length > 0 && (

Iniciar nova conversa

{availableUsers.map((user) => ( ))}
)} {/* Lista de conversas existentes */}

Conversas recentes

{loading ? (
) : conversations.length === 0 ? (

Nenhuma conversa ainda

{availableUsers.length > 0 ? "Inicie uma nova conversa acima" : "Suas conversas aparecerão aqui"}

) : (
{conversations.map((conv) => ( ))}
)}
); } // Visualização da conversa const selectedConversation = conversations.find( (c) => c.user_id === selectedUserId ); const selectedUser = availableUsers.find((u) => u.id === selectedUserId); const otherUserName = selectedConversation?.user_name || selectedUser?.nome || "Usuário"; return (

{otherUserName}

{(selectedConversation || selectedUser) && (

{getRoleLabel( selectedConversation?.user_role || selectedUser?.role || "" )}

)}
{/* Área de mensagens */}
{/* Mensagens */}
{messages.length === 0 ? (

Nenhuma mensagem ainda. Envie a primeira!

) : ( messages.map((msg) => { const isOwn = msg.sender_id === currentUserId; return (

{msg.content}

{format(new Date(msg.created_at), "HH:mm", { locale: ptBR, })}

); }) )}
{/* Campo de envio */}
setNewMessage(e.target.value)} placeholder="Digite sua mensagem..." className="flex-1 px-4 py-2 border border-gray-300 dark:border-slate-600 rounded-lg bg-white dark:bg-slate-800 text-gray-900 dark:text-white focus:outline-none focus:ring-2 focus:ring-blue-500" disabled={sending} />
); }