diff --git a/lib/ops/dm-operations-store-ops.js b/lib/ops/dm-operations-store-ops.js --- a/lib/ops/dm-operations-store-ops.js +++ b/lib/ops/dm-operations-store-ops.js @@ -1,6 +1,11 @@ // @flow -import type { DMOperation } from '../types/dm-ops.js'; +import { + type QueuedDMOperations, + queuedDMOperationConditionType, + type QueueDMOpsCondition, + type DMOperation, +} from '../types/dm-ops.js'; type Operation = { +id: string, @@ -87,6 +92,120 @@ }; } +export function addQueuedDMOpsToStore( + store: QueuedDMOperations, + condition: QueueDMOpsCondition, + operation: DMOperation, + timestamp: number, +): QueuedDMOperations { + if (condition.type === queuedDMOperationConditionType.THREAD) { + return { + ...store, + threadQueue: { + ...store.threadQueue, + [condition.threadID]: [ + ...(store.threadQueue[condition.threadID] ?? []), + { operation, timestamp }, + ], + }, + }; + } + + if (condition.type === queuedDMOperationConditionType.ENTRY) { + return { + ...store, + entryQueue: { + ...store.entryQueue, + [condition.entryID]: [ + ...(store.entryQueue[condition.entryID] ?? []), + { operation, timestamp }, + ], + }, + }; + } + + if (condition.type === queuedDMOperationConditionType.MESSAGE) { + return { + ...store, + messageQueue: { + ...store.messageQueue, + [condition.messageID]: [ + ...(store.messageQueue[condition.messageID] ?? []), + { operation, timestamp }, + ], + }, + }; + } + + return { + ...store, + membershipQueue: { + ...store.membershipQueue, + [condition.threadID]: { + ...(store.membershipQueue[condition.threadID] ?? {}), + [condition.userID]: [ + ...(store.membershipQueue[condition.threadID]?.[condition.userID] ?? + []), + { operation, timestamp }, + ], + }, + }, + }; +} + +export function removeQueuedDMOpsToStore( + store: QueuedDMOperations, + condition: QueueDMOpsCondition, +): QueuedDMOperations { + if (condition.type === queuedDMOperationConditionType.THREAD) { + const { [condition.threadID]: removed, ...threadQueue } = store.threadQueue; + return { + ...store, + threadQueue, + }; + } + + if (condition.type === queuedDMOperationConditionType.ENTRY) { + const { [condition.entryID]: removed, ...entryQueue } = store.entryQueue; + return { + ...store, + entryQueue, + }; + } + + if (condition.type === queuedDMOperationConditionType.MESSAGE) { + const { [condition.messageID]: removed, ...messageQueue } = + store.messageQueue; + return { + ...store, + messageQueue, + }; + } + + const threadQueue = store.membershipQueue[condition.threadID]; + if (!threadQueue) { + return store; + } + + const { [condition.userID]: removed, ...queue } = threadQueue; + if (Object.keys(queue).length === 0) { + const { [condition.threadID]: removedThread, ...membershipQueue } = + store.membershipQueue; + return { + ...store, + membershipQueue, + }; + } + + return { + ...store, + membershipQueue: { + ...store.membershipQueue, + [condition.threadID]: queue, + }, + }; +} + export { convertDMOperationIntoClientDBDMOperation, convertDMOperationOpsToClientDBOps, diff --git a/lib/reducers/dm-operations-queue-reducer.js b/lib/reducers/dm-operations-queue-reducer.js --- a/lib/reducers/dm-operations-queue-reducer.js +++ b/lib/reducers/dm-operations-queue-reducer.js @@ -2,12 +2,15 @@ import _mapValues from 'lodash/fp/mapValues.js'; -import type { DMOperationStoreOperation } from '../ops/dm-operations-store-ops.js'; +import { + type DMOperationStoreOperation, + addQueuedDMOpsToStore, + removeQueuedDMOpsToStore, +} from '../ops/dm-operations-store-ops.js'; import { clearQueuedDMOpsActionType, type OperationsQueue, pruneDMOpsQueueActionType, - queuedDMOperationConditionType, type QueuedDMOperations, queueDMOpsActionType, reportUnshimmingOperationCompletedActionType, @@ -25,70 +28,8 @@ if (action.type === queueDMOpsActionType) { const { condition, operation, timestamp } = action.payload; - if (condition.type === queuedDMOperationConditionType.THREAD) { - return { - store: { - ...store, - threadQueue: { - ...store.threadQueue, - [condition.threadID]: [ - ...(store.threadQueue[condition.threadID] ?? []), - { operation, timestamp }, - ], - }, - }, - operations: [], - }; - } - - if (condition.type === queuedDMOperationConditionType.ENTRY) { - return { - store: { - ...store, - entryQueue: { - ...store.entryQueue, - [condition.entryID]: [ - ...(store.entryQueue[condition.entryID] ?? []), - { operation, timestamp }, - ], - }, - }, - operations: [], - }; - } - - if (condition.type === queuedDMOperationConditionType.MESSAGE) { - return { - store: { - ...store, - messageQueue: { - ...store.messageQueue, - [condition.messageID]: [ - ...(store.messageQueue[condition.messageID] ?? []), - { operation, timestamp }, - ], - }, - }, - operations: [], - }; - } - return { - store: { - ...store, - membershipQueue: { - ...store.membershipQueue, - [condition.threadID]: { - ...(store.membershipQueue[condition.threadID] ?? {}), - [condition.userID]: [ - ...(store.membershipQueue[condition.threadID]?.[ - condition.userID - ] ?? []), - { operation, timestamp }, - ], - }, - }, - }, + store: addQueuedDMOpsToStore(store, condition, operation, timestamp), operations: [], }; } else if (action.type === pruneDMOpsQueueActionType) { @@ -117,67 +58,8 @@ } else if (action.type === clearQueuedDMOpsActionType) { const condition = action.payload; - if (condition.type === queuedDMOperationConditionType.THREAD) { - const { [condition.threadID]: removed, ...threadQueue } = - store.threadQueue; - return { - store: { - ...store, - threadQueue, - }, - operations: [], - }; - } - - if (condition.type === queuedDMOperationConditionType.ENTRY) { - const { [condition.entryID]: removed, ...entryQueue } = store.entryQueue; - return { - store: { - ...store, - entryQueue, - }, - operations: [], - }; - } - - if (condition.type === queuedDMOperationConditionType.MESSAGE) { - const { [condition.messageID]: removed, ...messageQueue } = - store.messageQueue; - return { - store: { - ...store, - messageQueue, - }, - operations: [], - }; - } - - const threadQueue = store.membershipQueue[condition.threadID]; - if (!threadQueue) { - return { store, operations: [] }; - } - - const { [condition.userID]: removed, ...queue } = threadQueue; - if (Object.keys(queue).length === 0) { - const { [condition.threadID]: removedThread, ...membershipQueue } = - store.membershipQueue; - return { - store: { - ...store, - membershipQueue, - }, - operations: [], - }; - } - return { - store: { - ...store, - membershipQueue: { - ...store.membershipQueue, - [condition.threadID]: queue, - }, - }, + store: removeQueuedDMOpsToStore(store, condition), operations: [], }; } else if (action.type === saveUnsupportedOperationActionType) {