El siguiente código funciona para addNewConvo (conversaciones nuevas), pero no para addMessagetoConversation (conversaciones existentes). Pensé que hice el mismo proceso para ambos, pero me falta algo en la segunda parte.
const addNewConvo = useCallback( (recipientId, message) => { const newConversations = conversations.map((convo) => { if (convo.otherUser.id === recipientId) { // convo.messages.push(message); // convo.latestMessageText = message.text; // convo.id = message.conversationId; return { ...convo, messages: [...convo.messages, message], latestMessageText: message.text, id: message.conversationId } } return convo }); setConversations(newConversations); }, [setConversations, conversations] ); const addMessageToConversation = useCallback( (data) => { // if sender isn't null, that means the message needs to be put in a brand new convo const { message, sender = null } = data; if (sender !== null) { const newConvo = { id: message.conversationId, otherUser: sender, messages: [message], }; newConvo.latestMessageText = message.text; setConversations((prev) => [newConvo, ...prev]); } conversations.forEach((convo) => { if (convo.id === message.conversationId) { // convo.messages.push(message); // convo.latestMessageText = message.text; return { ...convo, messages: [...convo.messages, message], latestMessageText: message.text, } } return convo }); setConversations(conversations); }, [setConversations, conversations] );forEach ejecuta una devolución de llamada para cada elemento de una matriz, pero no muta la matriz ni devuelve nada. En su caso, desea mutarlo, por lo que lo que haría es mapear las conversaciones y actualizar la conversación si la identificación coincide. También deberá asignar los resultados del mapa a una nueva variable, ya que no muta la matriz original.
const newConversations = conversations.map((convo) => { if (convo.id === message.conversationId) { // convo.messages.push(message); // convo.latestMessageText = message.text; return { ...convo, messages: [...convo.messages, message], latestMessageText: message.text, } } return convo }); setConversations(newConversations);