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 @@ -12,6 +12,7 @@ pruneDMOpsQueueActionType, type QueuedDMOperations, queueDMOpsActionType, + saveUnsupportedOperationActionType, } from '../types/dm-ops.js'; import type { BaseAction } from '../types/redux-types.js'; @@ -173,6 +174,20 @@ }, operations: [], }; + } else if (action.type === saveUnsupportedOperationActionType) { + return { + store, + operations: [ + { + type: 'replace_dm_operation', + payload: { + id: action.payload.id, + type: action.payload.operation.type, + operation: action.payload.operation, + }, + }, + ], + }; } return { store, operations: [] }; } diff --git a/lib/shared/dm-ops/process-dm-ops.js b/lib/shared/dm-ops/process-dm-ops.js --- a/lib/shared/dm-ops/process-dm-ops.js +++ b/lib/shared/dm-ops/process-dm-ops.js @@ -2,6 +2,7 @@ import invariant from 'invariant'; import * as React from 'react'; +import uuid from 'uuid'; import type { ProcessDMOperationUtilities } from './dm-op-spec.js'; import { dmOpSpecs } from './dm-op-specs.js'; @@ -19,11 +20,6 @@ import { useGetLatestMessageEdit } from '../../hooks/latest-message-edit.js'; import { useDispatchWithMetadata } from '../../hooks/ops-hooks.js'; import { mergeUpdatesWithMessageInfos } from '../../reducers/message-reducer.js'; -import { - type MessageNotifyType, - messageNotifyTypes, -} from '../../shared/messages/message-spec.js'; -import { messageSpecs } from '../../shared/messages/message-specs.js'; import { usePeerToPeerCommunication, type ProcessOutboundP2PMessagesResult, @@ -34,6 +30,7 @@ queueDMOpsActionType, dmOperationValidator, type ProcessDMOpsPayload, + saveUnsupportedOperationActionType, } from '../../types/dm-ops.js'; import type { RawMessageInfo } from '../../types/message-types.js'; import type { DispatchMetadata } from '../../types/redux-types.js'; @@ -41,6 +38,11 @@ import type { ClientUpdateInfo } from '../../types/update-types.js'; import { extractUserIDsFromPayload } from '../../utils/conversion-utils.js'; import { useSelector, useDispatch } from '../../utils/redux-utils.js'; +import { + type MessageNotifyType, + messageNotifyTypes, +} from '../messages/message-spec.js'; +import { messageSpecs } from '../messages/message-specs.js'; function useProcessDMOperation(): ( dmOperationSpecification: DMOperationSpecification, @@ -102,6 +104,24 @@ dispatchMetadata = dmOperationSpecification.metadata; } + if (!dmOpSpecs[dmOp.type]) { + dispatchWithMetadata( + { + type: saveUnsupportedOperationActionType, + payload: { + operation: dmOp, + id: uuid.v4(), + }, + }, + dispatchMetadata, + ); + addLog( + "This operation type isn't supported by this code version", + JSON.stringify(dmOp), + ); + return; + } + let composableMessageID: ?string = null; if ( dmOperationSpecification.type === @@ -205,7 +225,6 @@ }, dispatchMetadata, ); - await confirmPeerToPeerMessage(dispatchMetadata); return; } diff --git a/lib/types/dm-ops.js b/lib/types/dm-ops.js --- a/lib/types/dm-ops.js +++ b/lib/types/dm-ops.js @@ -585,6 +585,13 @@ +userID: string, }; +export const saveUnsupportedOperationActionType = + 'SAVE_UNSUPPORTED_DM_OPERATION'; +export type SaveUnsupportedOperationPayload = { + +operation: DMOperation, + +id: string, +}; + export type OperationsQueue = $ReadOnlyArray<{ +operation: DMOperation, +timestamp: number, diff --git a/lib/types/redux-types.js b/lib/types/redux-types.js --- a/lib/types/redux-types.js +++ b/lib/types/redux-types.js @@ -53,6 +53,7 @@ ClearQueuedMessageDMOpsPayload, ClearQueuedEntryDMOpsPayload, ClearQueuedMembershipDMOpsPayload, + SaveUnsupportedOperationPayload, } from './dm-ops.js'; import type { DraftStore } from './draft-types.js'; import type { EnabledApps, SupportedApps } from './enabled-apps.js'; @@ -1681,6 +1682,10 @@ +type: 'RESTORE_USER_SUCCESS', +payload: RestoreUserResult, +loadingInfo: LoadingInfo, + } + | { + +type: 'SAVE_UNSUPPORTED_DM_OPERATION', + +payload: SaveUnsupportedOperationPayload, }, }>;