import React, { useState, useEffect, useRef } from 'react'; const ChatModal = ({ isOpen, onClose, requestId, currentUser, chatPartnerName, activeChat, setActiveChat }) => { const [messages, setMessages] = useState([]); const [newMessage, setNewMessage] = useState(''); const [loading, setLoading] = useState(false); const messagesEndRef = useRef(null); // Map activeChat properties if passed as an object (as in Passenger/PoolHost dashboards) const actualIsOpen = isOpen ?? activeChat?.isOpen; const actualRequestId = requestId ?? activeChat?.requestId; const actualChatPartnerName = chatPartnerName ?? activeChat?.driverName ?? activeChat?.passengerName ?? 'Partner'; const actualOnClose = onClose ?? (() => setActiveChat?.({ ...activeChat, isOpen: false })); const fetchMessages = async () => { if (!actualRequestId) return; try { const token = localStorage.getItem('token'); const res = await fetch(`/api/messages/${actualRequestId}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (res.ok) { const data = await res.json(); setMessages(data); } } catch (e) { console.error("Failed to fetch messages:", e); } }; useEffect(() => { if (actualIsOpen && actualRequestId) { fetchMessages(); const intervalId = setInterval(fetchMessages, 3000); return () => clearInterval(intervalId); } }, [actualIsOpen, actualRequestId]); useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); const handleSendMessage = async (e) => { e.preventDefault(); if (!newMessage.trim() || !actualRequestId) return; setLoading(true); try { const token = localStorage.getItem('token'); const res = await fetch(`/api/messages/${actualRequestId}`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` }, body: JSON.stringify({ sender_id: currentUser.id, content: newMessage.trim() }) }); if (res.ok) { setNewMessage(''); fetchMessages(); } } catch (err) { console.error("Failed to send message:", err); } finally { setLoading(false); } }; if (!actualIsOpen) return null; return (