diff --git a/ts/interactions/conversations/unsendingInteractions.ts b/ts/interactions/conversations/unsendingInteractions.ts index 3e8df466c..e92d6a6c7 100644 --- a/ts/interactions/conversations/unsendingInteractions.ts +++ b/ts/interactions/conversations/unsendingInteractions.ts @@ -242,11 +242,7 @@ export async function deleteMessagesFromSwarmAndCompletelyLocally( // LEGACY GROUPS -- we cannot delete on the swarm (just unsend which is done separately) if (conversation.isClosedGroup() && PubKey.is05Pubkey(pubkey)) { window.log.info('Cannot delete message from a closed group swarm, so we just complete delete.'); - await Promise.all( - messages.map(async message => { - return deleteMessageLocallyOnly({ conversation, message, deletionType: 'complete' }); - }) - ); + await deleteMessageLocallyOnly({ conversation, messages, deletionType: 'complete' }); return; } window.log.info( @@ -261,11 +257,7 @@ export async function deleteMessagesFromSwarmAndCompletelyLocally( 'deleteMessagesFromSwarmAndCompletelyLocally: some messages failed to be deleted. Maybe they were already deleted?' ); } - await Promise.all( - messages.map(async message => { - return deleteMessageLocallyOnly({ conversation, message, deletionType: 'complete' }); - }) - ); + await deleteMessageLocallyOnly({ conversation, messages, deletionType: 'complete' }); } /** @@ -281,11 +273,8 @@ export async function deleteMessagesFromSwarmAndMarkAsDeletedLocally( window.log.info( 'Cannot delete messages from a legacy closed group swarm, so we just markDeleted.' ); - await Promise.all( - messages.map(async message => { - return deleteMessageLocallyOnly({ conversation, message, deletionType: 'markDeleted' }); - }) - ); + await deleteMessageLocallyOnly({ conversation, messages, deletionType: 'markDeleted' }); + return; } @@ -301,11 +290,7 @@ export async function deleteMessagesFromSwarmAndMarkAsDeletedLocally( 'deleteMessagesFromSwarmAndMarkAsDeletedLocally: some messages failed to be deleted but still removing the messages content... ' ); } - await Promise.all( - messages.map(async message => { - return deleteMessageLocallyOnly({ conversation, message, deletionType: 'markDeleted' }); - }) - ); + await deleteMessageLocallyOnly({ conversation, messages, deletionType: 'markDeleted' }); } /** @@ -315,19 +300,25 @@ export async function deleteMessagesFromSwarmAndMarkAsDeletedLocally( */ export async function deleteMessageLocallyOnly({ conversation, - message, + messages, deletionType, }: WithLocalMessageDeletionType & { conversation: ConversationModel; - message: MessageModel; + messages: Array; }) { - if (deletionType === 'complete') { - // remove the message from the database - await conversation.removeMessage(message.get('id')); - } else { - // just mark the message as deleted but still show in conversation - await message.markAsDeleted(); + for (let index = 0; index < messages.length; index++) { + const message = messages[index]; + if (deletionType === 'complete') { + // remove the message from the database + // eslint-disable-next-line no-await-in-loop + await conversation.removeMessage(message.get('id')); + } else { + // just mark the message as deleted but still show in conversation + // eslint-disable-next-line no-await-in-loop + await message.markAsDeleted(); + } } + conversation.updateLastMessage(); } @@ -391,7 +382,7 @@ const doDeleteSelectedMessagesInSOGS = async ( if (msgToDeleteLocally) { return deleteMessageLocallyOnly({ conversation, - message: msgToDeleteLocally, + messages: [msgToDeleteLocally], deletionType: 'complete', }); } @@ -430,11 +421,9 @@ const doDeleteSelectedMessages = async ({ return; } - /** - * Note: groupv2 support deleteForEveryone only. - * For groupv2, a user can delete only his messages, but an admin can delete the messages of anyone. - * */ - if (deleteForEveryone || conversation.isClosedGroupV2()) { + // Note: a groupv2 member can delete messages for everyone if they are the admin, or if that message is theirs. + + if (deleteForEveryone) { if (conversation.isClosedGroupV2()) { const convoId = conversation.id; if (!PubKey.is03Pubkey(convoId)) { @@ -466,6 +455,16 @@ const doDeleteSelectedMessages = async ({ return; } + // delete just for me in a groupv2 only means delete locally (not even synced to our other devices) + if (conversation.isClosedGroupV2()) { + await deleteMessageLocallyOnly({ + conversation, + messages: selectedMessages, + deletionType: 'markDeleted', + }); + return; + } + // delete just for me in a legacy closed group only means delete locally if (conversation.isClosedGroup()) { await deleteMessagesFromSwarmAndMarkAsDeletedLocally(conversation, selectedMessages);