diff --git a/lib/reducers/message-reducer.js b/lib/reducers/message-reducer.js --- a/lib/reducers/message-reducer.js +++ b/lib/reducers/message-reducer.js @@ -10,6 +10,7 @@ import _mapValues from 'lodash/fp/mapValues.js'; import _omit from 'lodash/fp/omit.js'; import _omitBy from 'lodash/fp/omitBy.js'; +import _pick from 'lodash/fp/pick.js'; import _pickBy from 'lodash/fp/pickBy.js'; import _uniq from 'lodash/fp/uniq.js'; @@ -193,6 +194,9 @@ { type: 'remove_all_threads', }, + { + type: 'remove_all_local_message_infos', + }, { type: 'replace_threads', payload: { threads }, @@ -462,7 +466,6 @@ ); const oldMessageInfosToCombine = []; const threadsThatNeedMessageIDsResorted = []; - const local: { [string]: LocalMessageInfo } = {}; const updatedThreads: { [string]: ThreadMessageInfo } = {}; const threads = _flow( _mapValuesWithKeys((messageIDs: string[], threadID: string) => { @@ -507,7 +510,13 @@ oldMessageInfosToCombine.push(oldMessageInfo); const localInfo = updatedMessageStore.local[id]; if (localInfo) { - local[id] = localInfo; + newMessageOps.push({ + type: 'replace_local_message_info', + payload: { + id, + localMessageInfo: localInfo, + }, + }); } } const startReached = @@ -555,7 +564,13 @@ } const localInfo = updatedMessageStore.local[id]; if (localInfo) { - local[id] = localInfo; + newMessageOps.push({ + type: 'replace_local_message_info', + payload: { + id, + localMessageInfo: localInfo, + }, + }); } } } @@ -613,7 +628,7 @@ const messageStore = { messages: processedMessageStore.messages, threads: processedMessageStore.threads, - local, + local: processedMessageStore.local, currentAsOf: { ...processedMessageStore.currentAsOf, ...currentAsOf, @@ -690,6 +705,14 @@ payload: { threadIDs: threadsToRemoveMessagesFrom }, }); + const localMessagesToRemove = _pick(messageIDsToRemove)( + reassignedMessageStore.local, + ); + messageStoreOperations.push({ + type: 'remove_local_message_infos', + payload: { ids: Object.keys(localMessagesToRemove) }, + }); + return { messageStoreOperations, messageStore: { @@ -897,6 +920,7 @@ ...filteredMessageStore, messages: processedMessageStore.messages, threads: processedMessageStore.threads, + local: processedMessageStore.local, }, }; } else if (action.type === newThreadActionTypes.success) { @@ -1013,15 +1037,11 @@ ]; let updatedThreads; - let local = { ...messageStore.local }; if (messageStore.messages[localID]) { const messages = { ...messageStore.messages, [(localID: string)]: payload, }; - local = _pickBy( - (localInfo: LocalMessageInfo, key: string) => key !== localID, - )(messageStore.local); const thread = messageStore.threads[threadID]; updatedThreads = { [(threadID: string)]: { @@ -1029,6 +1049,13 @@ startReached: thread?.startReached ?? true, }, }; + + messageStoreOperations.push({ + type: 'remove_local_message_infos', + payload: { + ids: [localID], + }, + }); } else { updatedThreads = { [(threadID: string)]: messageStore.threads[threadID] @@ -1058,7 +1085,7 @@ const newMessageStore = { messages: processedMessageStore.messages, threads: processedMessageStore.threads, - local, + local: processedMessageStore.local, currentAsOf: messageStore.currentAsOf, }; @@ -1071,15 +1098,30 @@ action.type === sendMultimediaMessageActionTypes.failed ) { const { localID } = action.payload; + + const messageStoreOperations = [ + { + type: 'replace_local_message_info', + payload: { + id: localID, + localMessageInfo: { + sendFailed: true, + }, + }, + }, + ]; + + const processedMessageStore = processMessageStoreOperations( + messageStore, + messageStoreOperations, + ); + return { - messageStoreOperations: [], + messageStoreOperations, messageStore: { - messages: messageStore.messages, - threads: messageStore.threads, - local: { - ...messageStore.local, - [(localID: string)]: { sendFailed: true }, - }, + messages: processedMessageStore.messages, + threads: processedMessageStore.threads, + local: processedMessageStore.local, currentAsOf: messageStore.currentAsOf, }, }; @@ -1172,9 +1214,13 @@ _uniq, sortMessageIDs(newMessages), )(messageStore.threads[threadID].messageIDs.map(replaceMessageKey)); - const local = _pickBy( - (localInfo: LocalMessageInfo, key: string) => key !== payload.localID, - )(messageStore.local); + + messageStoreOperations.push({ + type: 'remove_local_message_infos', + payload: { + ids: [payload.localID], + }, + }); const updatedThreads = { [threadID]: { @@ -1198,7 +1244,7 @@ ...messageStore, messages: processedMessageStore.messages, threads: processedMessageStore.threads, - local, + local: processedMessageStore.local, }, }; } else if (action.type === saveMessagesActionType) { @@ -1251,6 +1297,10 @@ updatedThreads[threadID] = thread; } + const localMessageIDsToRemove = _pick(messageIDsToPrune)( + messageStore.local, + ); + const messageStoreOperations = [ { type: 'remove', @@ -1262,6 +1312,10 @@ threads: updatedThreads, }, }, + { + type: 'remove_local_message_infos', + payload: { ids: Object.keys(localMessageIDsToRemove) }, + }, ]; const processedMessageStore = processMessageStoreOperations( @@ -1272,7 +1326,7 @@ const newMessageStore = { messages: processedMessageStore.messages, threads: processedMessageStore.threads, - local: _omit(messageIDsToPrune)(messageStore.local), + local: processedMessageStore.local, currentAsOf: messageStore.currentAsOf, }; @@ -1526,6 +1580,10 @@ threads: { [(threadID: string)]: threadState }, }, }, + { + type: 'replace_local_message_info', + payload: { id: localID, localMessageInfo: {} }, + }, ]; const processedMessageStore = processMessageStoreOperations( @@ -1539,6 +1597,7 @@ ...messageStore, threads: processedMessageStore.threads, messages: processedMessageStore.messages, + local: processedMessageStore.local, }, }; } else if (action.type === processServerRequestsActionType) {