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 (