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,19 +1,50 @@ // @flow 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) { const ids = new Set(action.payload.actionIDs); return { ...store, - queuedOps: store.queuedOps.filter(ops => !ids.has(ops.actionID)), + queuedOps: store.queuedOps.filter( + ops => !ops.actionID || !ids.has(ops.actionID), + ), 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, + ops, + }, + ], + }; + } else if (actionID) { + store = { + ...store, + noOpsActions: [...store.noOpsActions, actionID], + }; + } return store; } -export { reduceDbOpsStore }; +export { reduceDbOpsStore, queueDbOps }; diff --git a/lib/types/db-ops-types.js b/lib/types/db-ops-types.js --- a/lib/types/db-ops-types.js +++ b/lib/types/db-ops-types.js @@ -5,7 +5,7 @@ export type ActionID = number; type DBOpsEntry = { - +actionID: ActionID, + +actionID: ?ActionID, +ops: $Partial, }; 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'; @@ -482,6 +483,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,