diff --git a/lib/reducers/db-ops-reducer.js b/lib/reducers/db-ops-reducer.js --- a/lib/reducers/db-ops-reducer.js +++ b/lib/reducers/db-ops-reducer.js @@ -1,8 +1,10 @@ // @flow import { opsProcessingFinishedActionType } from '../actions/db-ops-actions.js'; -import type { DBOpsStore } from '../types/db-ops-types.js'; +import type { MessageID, DBOpsStore } from '../types/db-ops-types.js'; import type { BaseAction } from '../types/redux-types.js'; +import type { StoreOperations } from '../types/store-ops-types.js'; +import { values } from '../utils/objects.js'; function reduceDBOpsStore(store: DBOpsStore, action: BaseAction): DBOpsStore { if (action.type === opsProcessingFinishedActionType) { @@ -12,7 +14,40 @@ queuedOps: rest, }; } + return store; } -export { reduceDBOpsStore }; +function queueDBOps( + store: DBOpsStore, + messageID: ?MessageID, + ops: StoreOperations, +): DBOpsStore { + const areNewOpsPresent = values(ops).some(opsArray => opsArray.length > 0); + let newEntry = null; + if (messageID && areNewOpsPresent) { + newEntry = { + messageID, + ops, + }; + } else if (areNewOpsPresent) { + newEntry = { + ops, + }; + } else if (messageID) { + newEntry = { + messageID, + }; + } + + if (!newEntry) { + return store; + } + + return { + ...store, + queuedOps: [...store.queuedOps, newEntry], + }; +} + +export { reduceDBOpsStore, queueDBOps }; diff --git a/native/redux/redux-setup.js b/native/redux/redux-setup.js --- a/native/redux/redux-setup.js +++ b/native/redux/redux-setup.js @@ -18,6 +18,7 @@ import { setNewSessionActionType } from 'lib/keyserver-conn/keyserver-conn-types.js'; import type { ThreadStoreOperation } from 'lib/ops/thread-store-ops.js'; import { threadStoreOpsHandlers } from 'lib/ops/thread-store-ops.js'; +import { queueDBOps } from 'lib/reducers/db-ops-reducer.js'; import { reduceLoadingStatuses } from 'lib/reducers/loading-reducer.js'; import baseReducer from 'lib/reducers/master-reducer.js'; import { @@ -300,7 +301,7 @@ ...fixUnreadActiveThreadResult.threadStoreOperations, ]; - void processDBStoreOperations({ + const ops = { draftStoreOperations, messageStoreOperations, threadStoreOperations: threadStoreOperationsWithUnreadFix, @@ -309,7 +310,13 @@ keyserverStoreOperations, communityStoreOperations, integrityStoreOperations, - }); + }; + state = { + ...state, + dbOpsStore: queueDBOps(state.dbOpsStore, action.messageID, ops), + }; + + void processDBStoreOperations(ops); return state; } diff --git a/web/redux/redux-setup.js b/web/redux/redux-setup.js --- a/web/redux/redux-setup.js +++ b/web/redux/redux-setup.js @@ -18,6 +18,7 @@ type ThreadStoreOperation, threadStoreOpsHandlers, } from 'lib/ops/thread-store-ops.js'; +import { queueDBOps } from 'lib/reducers/db-ops-reducer.js'; import { reduceLoadingStatuses } from 'lib/reducers/loading-reducer.js'; import baseReducer from 'lib/reducers/master-reducer.js'; import { mostRecentlyReadThreadSelector } from 'lib/selectors/thread-selectors.js'; @@ -480,6 +481,14 @@ // one in tab-synchronization.js) can be removed. // $FlowFixMe if (action.dispatchSource !== 'tab-sync') { + state = { + ...state, + dbOpsStore: queueDBOps( + state.dbOpsStore, + action.messageID, + storeOperations, + ), + }; void processDBStoreOperations( storeOperations, state.currentUserInfo?.id ?? null,