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,12 @@ // @flow +import uuid from 'uuid'; + import { opsProcessingFinishedActionType } from '../actions/db-ops-actions.js'; -import type { DBOpsStore } from '../types/db-ops-types.js'; +import type { ActionID, 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) { @@ -13,7 +17,34 @@ noOpsActions: store.noOpsActions.filter(id => !ids.has(id)), }; } + + return store; +} + +function queueDBOps( + store: DBOpsStore, + actionID: ?ActionID, + ops: StoreOperations, +): DBOpsStore { + const areNewOpsPresent = values(ops).some(opsArray => opsArray.length > 0); + if (areNewOpsPresent) { + store = { + ...store, + queuedOps: [ + ...store.queuedOps, + { + actionID: actionID ?? uuid.v4(), + ops, + }, + ], + }; + } else if (actionID) { + store = { + ...store, + noOpsActions: [...store.noOpsActions, actionID], + }; + } return store; } -export { reduceDBOpsStore }; +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 { @@ -299,7 +300,7 @@ ...fixUnreadActiveThreadResult.threadStoreOperations, ]; - void processDBStoreOperations({ + const ops = { draftStoreOperations, messageStoreOperations, threadStoreOperations: threadStoreOperationsWithUnreadFix, @@ -307,7 +308,13 @@ userStoreOperations, keyserverStoreOperations, communityStoreOperations, - }); + }; + state = { + ...state, + dbOpsStore: queueDBOps(state.dbOpsStore, action.actionID, 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'; @@ -487,6 +488,14 @@ // one in tab-synchronization.js) can be removed. // $FlowFixMe if (action.dispatchSource !== 'tab-sync') { + state = { + ...state, + dbOpsStore: queueDBOps( + state.dbOpsStore, + action.actionID, + storeOperations, + ), + }; void processDBStoreOperations( storeOperations, state.currentUserInfo?.id ?? null,