diff --git a/lib/hooks/latest-message-edit.js b/lib/hooks/latest-message-edit.js new file mode 100644 --- /dev/null +++ b/lib/hooks/latest-message-edit.js @@ -0,0 +1,57 @@ +// @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'; + +function useGetLatestMessageEdit(): ( + messageID: string, +) => Promise { + const { getRelatedMessages } = getConfig().sqliteAPI; + 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; + } + + 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], + ); +} + +export { useGetLatestMessageEdit };