1
- import _ , { compact , isArray , isNumber , isObject , pick } from 'lodash' ;
1
+ import _ , { compact , isArray , isEmpty , isNumber , isObject , pick } from 'lodash' ;
2
2
import { OpenGroupData } from '../../../../data/opengroups' ;
3
3
import { handleOpenGroupV4Message } from '../../../../receiver/opengroup' ;
4
4
import { OpenGroupRequestCommonType } from '../opengroupV2/ApiUtil' ;
@@ -35,6 +35,8 @@ import { ConversationTypeEnum } from '../../../../models/conversationAttributes'
35
35
import { createSwarmMessageSentFromUs } from '../../../../models/messageFactory' ;
36
36
import { Data } from '../../../../data/data' ;
37
37
import { processMessagesUsingCache } from './sogsV3MutationCache' ;
38
+ import { destroyMessagesAndUpdateRedux } from '../../../../util/expiringMessages' ;
39
+ import { sogsRollingDeletions } from './sogsRollingDeletions' ;
38
40
39
41
/**
40
42
* Get the convo matching those criteria and make sure it is an opengroup convo, or return null.
@@ -159,34 +161,38 @@ const handleSogsV3DeletedMessages = async (
159
161
serverUrl : string ,
160
162
roomId : string
161
163
) => {
162
- const deletions = messages . filter ( m => Boolean ( m . deleted ) ) ;
163
- const exceptDeletion = messages . filter ( m => ! m . deleted ) ;
164
- if ( ! deletions . length ) {
165
- return messages ;
164
+ const messagesDeleted = messages . filter ( m => Boolean ( m . deleted ) ) ;
165
+ const messagesWithoutDeleted = messages . filter ( m => ! m . deleted ) ;
166
+ if ( ! messagesDeleted . length ) {
167
+ return messagesWithoutDeleted ;
166
168
}
167
- const allIdsRemoved = deletions . map ( m => m . id ) ;
169
+
170
+ const allIdsRemoved = messagesDeleted . map ( m => m . id ) ;
171
+
168
172
try {
169
173
const convoId = getOpenGroupV2ConversationId ( serverUrl , roomId ) ;
170
174
const convo = getConversationController ( ) . get ( convoId ) ;
171
175
const messageIds = await Data . getMessageIdsFromServerIds ( allIdsRemoved , convo . id ) ;
172
176
173
- // we shouldn't get too many messages to delete at a time, so no need to add a function to remove multiple messages for now
177
+ allIdsRemoved . forEach ( removedId => {
178
+ sogsRollingDeletions . addMessageDeletedId ( convoId , removedId ) ;
179
+ } ) ;
174
180
175
- await Promise . all (
176
- ( messageIds || [ ] ) . map ( async id => {
177
- if ( convo ) {
178
- await convo . removeMessage ( id ) ;
179
- }
180
- await Data . removeMessage ( id ) ;
181
- } )
182
- ) ;
181
+ if ( messageIds && messageIds . length ) {
182
+ await destroyMessagesAndUpdateRedux (
183
+ messageIds . map ( messageId => ( {
184
+ conversationKey : convoId ,
185
+ messageId ,
186
+ } ) )
187
+ ) ;
188
+ }
183
189
} catch ( e ) {
184
190
window ?. log ?. warn ( 'handleDeletions failed:' , e ) ;
185
191
}
186
- return exceptDeletion ;
192
+ return messagesWithoutDeleted ;
187
193
} ;
188
194
189
- // tslint:disable-next-line: cyclomatic-complexity
195
+ // tslint:disable-next-line: max-func-body-length cyclomatic-complexity
190
196
const handleMessagesResponseV4 = async (
191
197
messages : Array < OpenGroupMessageV4 > ,
192
198
serverUrl : string ,
@@ -284,6 +290,7 @@ const handleMessagesResponseV4 = async (
284
290
285
291
const incomingMessageSeqNo = compact ( messages . map ( n => n . seqno ) ) ;
286
292
const maxNewMessageSeqNo = Math . max ( ...incomingMessageSeqNo ) ;
293
+
287
294
for ( let index = 0 ; index < messagesWithResolvedBlindedIdsIfFound . length ; index ++ ) {
288
295
const msgToHandle = messagesWithResolvedBlindedIdsIfFound [ index ] ;
289
296
try {
@@ -309,13 +316,24 @@ const handleMessagesResponseV4 = async (
309
316
await OpenGroupData . saveV2OpenGroupRoom ( roomInfosRefreshed ) ;
310
317
311
318
const messagesWithReactions = messages . filter ( m => m . reactions !== undefined ) ;
319
+
312
320
if ( messagesWithReactions . length > 0 ) {
313
321
const conversationId = getOpenGroupV2ConversationId ( serverUrl , roomId ) ;
314
322
const groupConvo = getConversationController ( ) . get ( conversationId ) ;
315
323
if ( groupConvo && groupConvo . isOpenGroupV2 ( ) ) {
316
- for ( const message of messagesWithReactions ) {
324
+ for ( const messageWithReaction of messagesWithReactions ) {
325
+ if ( isEmpty ( messageWithReaction . reactions ) ) {
326
+ /*
327
+ * When a message is deleted from the server, we get the deleted event as a data: null on the message itself
328
+ * and an update on its reactions.
329
+ * But, because we just deleted that message, we can skip trying to update its reactions: it's not in the DB anymore.
330
+ */
331
+ if ( sogsRollingDeletions . hasMessageDeletedId ( conversationId , messageWithReaction . id ) ) {
332
+ continue ;
333
+ }
334
+ }
317
335
void groupConvo . queueJob ( async ( ) => {
318
- await processMessagesUsingCache ( serverUrl , roomId , message ) ;
336
+ await processMessagesUsingCache ( serverUrl , roomId , messageWithReaction ) ;
319
337
} ) ;
320
338
}
321
339
}
@@ -526,6 +544,7 @@ export const handleBatchPollResults = async (
526
544
break ;
527
545
case 'pollInfo' :
528
546
await handlePollInfoResponse ( subResponse . code , subResponse . body , serverUrl ) ;
547
+
529
548
break ;
530
549
case 'inbox' :
531
550
await handleInboxOutboxMessages ( subResponse . body , serverUrl , false ) ;
0 commit comments