diff --git a/ts/background.ts b/ts/background.ts index aae32ce35a..58daf9ad66 100644 --- a/ts/background.ts +++ b/ts/background.ts @@ -3212,7 +3212,7 @@ export async function startApp(): Promise { return { ...result, [conversationId]: { - status: SendStatus.Pending, + status: SendStatus.Sent, updatedAt: timestamp, }, }; diff --git a/ts/messageModifiers/MessageReceipts.ts b/ts/messageModifiers/MessageReceipts.ts index b7244a1aa0..58f540f4a0 100644 --- a/ts/messageModifiers/MessageReceipts.ts +++ b/ts/messageModifiers/MessageReceipts.ts @@ -13,7 +13,11 @@ import { isOutgoing } from '../state/selectors/message'; import { isDirectConversation } from '../util/whatTypeOfConversation'; import { getOwn } from '../util/getOwn'; import { missingCaseError } from '../util/missingCaseError'; -import { SendActionType, sendStateReducer } from '../messages/MessageSendState'; +import { + SendActionType, + SendStatus, + sendStateReducer, +} from '../messages/MessageSendState'; import dataInterface from '../sql/Client'; const { deleteSentProtoRecipient } = dataInterface; @@ -107,7 +111,7 @@ export class MessageReceipts extends Collection { ids.includes(receipt.get('sourceConversationId')) ); if (receipts.length) { - window.log.info('Found early read receipts for message'); + window.log.info('Found early receipts for message'); this.remove(receipts); } return receipts; @@ -142,57 +146,48 @@ export class MessageReceipts extends Collection { const oldSendState = getOwn( oldSendStateByConversationId, sourceConversationId - ); - if (oldSendState) { - let sendActionType: SendActionType; - switch (type) { - case MessageReceiptType.Delivery: - sendActionType = SendActionType.GotDeliveryReceipt; - break; - case MessageReceiptType.Read: - sendActionType = SendActionType.GotReadReceipt; - break; - case MessageReceiptType.View: - sendActionType = SendActionType.GotViewedReceipt; - break; - default: - throw missingCaseError(type); - } + ) ?? { status: SendStatus.Sent, updatedAt: undefined }; - const newSendState = sendStateReducer(oldSendState, { - type: sendActionType, - updatedAt: messageSentAt, + let sendActionType: SendActionType; + switch (type) { + case MessageReceiptType.Delivery: + sendActionType = SendActionType.GotDeliveryReceipt; + break; + case MessageReceiptType.Read: + sendActionType = SendActionType.GotReadReceipt; + break; + case MessageReceiptType.View: + sendActionType = SendActionType.GotViewedReceipt; + break; + default: + throw missingCaseError(type); + } + + const newSendState = sendStateReducer(oldSendState, { + type: sendActionType, + updatedAt: messageSentAt, + }); + + // The send state may not change. For example, this can happen if we get a read + // receipt before a delivery receipt. + if (!isEqual(oldSendState, newSendState)) { + message.set('sendStateByConversationId', { + ...oldSendStateByConversationId, + [sourceConversationId]: newSendState, }); - // The send state may not change. For example, this can happen if we get a read - // receipt before a delivery receipt. - if (!isEqual(oldSendState, newSendState)) { - message.set('sendStateByConversationId', { - ...oldSendStateByConversationId, - [sourceConversationId]: newSendState, - }); + window.Signal.Util.queueUpdateMessage(message.attributes); - window.Signal.Util.queueUpdateMessage(message.attributes); - - // notify frontend listeners - const conversation = window.ConversationController.get( - message.get('conversationId') - ); - const updateLeftPane = conversation - ? conversation.debouncedUpdateLastMessage - : undefined; - if (updateLeftPane) { - updateLeftPane(); - } - } - } else { - window.log.warn( - `Got a receipt from someone (${sourceConversationId}), but the message (sent at ${message.get( - 'sent_at' - )}) wasn't sent to them. It was sent to ${ - Object.keys(oldSendStateByConversationId).length - } recipients` + // notify frontend listeners + const conversation = window.ConversationController.get( + message.get('conversationId') ); + const updateLeftPane = conversation + ? conversation.debouncedUpdateLastMessage + : undefined; + if (updateLeftPane) { + updateLeftPane(); + } } if ( diff --git a/ts/models/messages.ts b/ts/models/messages.ts index 31e355d6f8..dd1c0c148e 100644 --- a/ts/models/messages.ts +++ b/ts/models/messages.ts @@ -2579,20 +2579,25 @@ export class MessageModel extends window.Backbone.Model { return; } + const updatedAt: number = isNormalNumber(data.timestamp) + ? data.timestamp + : Date.now(); + const previousSendState = getOwn( sendStateByConversationId, destinationConversationId ); - if (previousSendState) { - sendStateByConversationId[ - destinationConversationId - ] = sendStateReducer(previousSendState, { - type: SendActionType.Sent, - updatedAt: isNormalNumber(data.timestamp) - ? data.timestamp - : Date.now(), - }); - } + sendStateByConversationId[ + destinationConversationId + ] = previousSendState + ? sendStateReducer(previousSendState, { + type: SendActionType.Sent, + updatedAt, + }) + : { + status: SendStatus.Sent, + updatedAt, + }; if (unidentified) { unidentifiedDeliveriesSet.add(identifier);