diff --git a/lib/hooks/latest-message-edit.js b/lib/hooks/latest-message-edit.js index ac1617e13..0aa61a005 100644 --- a/lib/hooks/latest-message-edit.js +++ b/lib/hooks/latest-message-edit.js @@ -1,57 +1,83 @@ // @flow import * as React from 'react'; import { messageTypes } from '../types/message-types-enum.js'; import type { RawMessageInfo } from '../types/message-types.js'; import { getConfig } from '../utils/config.js'; import { translateClientDBMessageInfoToRawMessageInfo } from '../utils/message-ops-utils.js'; +import { useSelector } from '../utils/redux-utils.js'; function useGetLatestMessageEdit(): ( messageID: string, ) => Promise { const { getRelatedMessages } = getConfig().sqliteAPI; + const messageStore = useSelector(state => state.messageStore); return React.useCallback( async (messageID: string) => { const relatedDBMessages = await getRelatedMessages(messageID); const relatedMessages = relatedDBMessages.map( translateClientDBMessageInfoToRawMessageInfo, ); // First, get the original message, which should be the last // since the results are sorted on time const originalMessage = relatedMessages.pop(); if (!originalMessage) { - return undefined; + // It is possible that this message isn't yet present in the DB but is + // already present in Redux store + const messageFromRedux = messageStore.messages[messageID]; + if (!messageFromRedux) { + return undefined; + } + // Edits are only supported for text messages + if (messageFromRedux.type !== messageTypes.TEXT) { + return messageFromRedux; + } + for (const threadMessageID of messageStore.threads[ + messageFromRedux.threadID + ].messageIDs) { + const message = messageStore.messages[threadMessageID]; + if ( + message.type === messageTypes.EDIT_MESSAGE && + message.targetMessageID === messageID + ) { + return { + ...messageFromRedux, + text: message.text, + }; + } + } + return messageFromRedux; } if (originalMessage.id !== messageID) { console.log('last related message is not original message'); return undefined; } // Edits are only supported for text messages if (originalMessage.type !== messageTypes.TEXT) { return originalMessage; } // Next, get the latest edit, if there is one let editedOriginalMessage = originalMessage; for (const relatedMessage of relatedMessages) { if (relatedMessage.type !== messageTypes.EDIT_MESSAGE) { continue; } editedOriginalMessage = { ...originalMessage, text: relatedMessage.text, }; break; } return editedOriginalMessage; }, - [getRelatedMessages], + [getRelatedMessages, messageStore.messages, messageStore.threads], ); } export { useGetLatestMessageEdit };