import React, { useState, useEffect, useRef } from 'react'; import MessageEntry from './MessageEntry'; const MessagesPanel = ({ selectedChannel }) => { const [messages, setMessages] = useState([]); const lastMessageIdRef = useRef(null); // Keep track of the last message ID useEffect(() => { if (!selectedChannel) return; let isMounted = true; // flag to prevent state updates after unmount let intervalId = null; const fetchMessages = async () => { const response = await fetch(`/messages?channelID=${selectedChannel.id}`); const data = await response.json(); if (isMounted) { let messageData = data || []; setMessages(messageData); lastMessageIdRef.current = messageData.length > 0 ? messageData[messageData.length - 1].id : null; } }; fetchMessages(); intervalId = setInterval(() => { if (lastMessageIdRef.current !== null) { fetch(`/messages?channelID=${selectedChannel.id}&lastMessageID=${lastMessageIdRef.current}`) .then(response => response.json()) .then(newMessages => { if (isMounted && Array.isArray(newMessages) && newMessages.length > 0) { setMessages((messages) => { const updatedMessages = [...messages, ...newMessages]; lastMessageIdRef.current = updatedMessages[updatedMessages.length - 1].id; return updatedMessages; }); } }); } }, 5000); // Poll every 5 seconds return () => { isMounted = false; // prevent further state updates clearInterval(intervalId); // clear interval on unmount }; }, [selectedChannel]); return (
{selectedChannel && (
Messages for {selectedChannel.name}
)}
{selectedChannel ? ( messages.length > 0 ? ( messages.map((message) => (
{message.user_name}: {message.text}
)) ) : (
No messages yet! Why not send one?
) ) : (
Please select a channel
)}
{selectedChannel && ( { lastMessageIdRef.current = message.id; setMessages([...messages, message]) } } /> )}
); }; export default MessagesPanel;