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
{conv.latest_message || 'No messages yet'}
{msg.content}
{new Date(msg.created_at).toLocaleTimeString()}