import React, { useState, useEffect, useRef } from 'react' import { chatAPI, API_BASE_URL } from '../api' import '../styles/chat.css' export default function Chat({ conversationId, onNotificationsUpdate }) { const [conversations, setConversations] = useState([]) const [selectedConversation, setSelectedConversation] = useState(conversationId || null) const [messages, setMessages] = useState([]) const [newMessage, setNewMessage] = useState('') const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState('') const [isSending, setIsSending] = useState(false) const messageInputRef = useRef(null) const currentUserId = localStorage.getItem('user_id') useEffect(() => { loadConversations() }, []) useEffect(() => { if (selectedConversation) { loadMessages() // Poll for new messages every 2 seconds const interval = setInterval(loadMessages, 2000) return () => clearInterval(interval) } }, [selectedConversation]) const loadConversations = async () => { try { setIsLoading(true) const response = await chatAPI.getConversations() setConversations(response.data || []) // Notify parent about notifications update if (onNotificationsUpdate) { onNotificationsUpdate() } } catch (err) { setError('Failed to load conversations') } finally { setIsLoading(false) } } const loadMessages = async () => { if (!selectedConversation) return try { const response = await chatAPI.getMessages(selectedConversation) setMessages(response.data || []) // Mark messages as read await chatAPI.markAsRead(selectedConversation) // Update unread_count to 0 for this conversation immediately setConversations(prev => prev.map(conv => conv.id === selectedConversation ? { ...conv, unread_count: 0 } : conv ) ) // Update parent notifications if (onNotificationsUpdate) { onNotificationsUpdate() } } catch (err) { setError('Failed to load messages') } } const handleSendMessage = async (e) => { e.preventDefault() if (!newMessage.trim() || !selectedConversation) return setIsSending(true) try { const response = await chatAPI.sendMessage(selectedConversation, newMessage) setMessages((prev) => [...prev, response.data]) setNewMessage('') // Auto-focus back to input field after sending setTimeout(() => messageInputRef.current?.focus(), 0) } catch (err) { setError('Failed to send message') } finally { setIsSending(false) } } if (isLoading) { return
Loading conversations...
} if (conversations.length === 0) { return (

No conversations yet

Match with someone to start chatting!

Discover
) } return (

Conversations

{conversations.map((conv) => (
setSelectedConversation(conv.id)} >
{conv.other_user_photo ? ( {conv.other_user_display_name} ) : (
{conv.other_user_display_name.charAt(0).toUpperCase()}
)}

{conv.other_user_display_name}

{conv.latest_message || 'No messages yet'}

{conv.unread_count > 0 && ( {conv.unread_count} )}
))}
{selectedConversation ? ( <>

{conversations.find((c) => c.id === selectedConversation)?.other_user_display_name}

{messages.map((msg) => (

{msg.content}

{new Date(msg.created_at).toLocaleTimeString()}
))}
setNewMessage(e.target.value)} placeholder="Type a message..." disabled={isSending} autoFocus />
) : (
Select a conversation to start messaging
)}
) }