diff --git a/lib/shared/dm-ops/add-members-spec.js b/lib/shared/dm-ops/add-members-spec.js --- a/lib/shared/dm-ops/add-members-spec.js +++ b/lib/shared/dm-ops/add-members-spec.js @@ -40,22 +40,24 @@ }, processDMOperation: async ( dmOperation: DMAddMembersOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { editorID, time, messageID, addedUserIDs, threadID } = dmOperation; + const { viewerID, threadInfos } = utilities; + const messageData = createAddNewMembersMessageDataFromDMOperation(dmOperation); const rawMessageInfos = [ rawMessageInfoFromMessageData(messageData, messageID), ]; - const currentThreadInfo = utilities.threadInfos[threadID]; + const currentThreadInfo = threadInfos[threadID]; if (!currentThreadInfo.thick) { return { rawMessageInfos: [], updateInfos: [], }; } + const defaultRoleID = values(currentThreadInfo.roles).find(role => roleIsDefaultRole(role), )?.id; @@ -124,7 +126,6 @@ }, canBeProcessed: async ( dmOperation: DMAddMembersOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { if (utilities.threadInfos[dmOperation.threadID]) { diff --git a/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js b/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js --- a/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js +++ b/lib/shared/dm-ops/add-viewer-to-thread-members-spec.js @@ -40,20 +40,20 @@ }, processDMOperation: async ( dmOperation: DMAddViewerToThreadMembersOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { time, messageID, addedUserIDs, existingThreadDetails } = dmOperation; + const { viewerID, threadInfos } = utilities; + const messageData = createAddViewerToThreadMembersMessageDataFromDMOp(dmOperation); - const rawMessageInfos = messageID ? [rawMessageInfoFromMessageData(messageData, messageID)] : []; const threadID = existingThreadDetails.threadID; - const currentThreadInfo = utilities.threadInfos[threadID]; + const currentThreadInfo = threadInfos[threadID]; if (currentThreadInfo && !currentThreadInfo.thick) { return { rawMessageInfos: [], @@ -122,8 +122,9 @@ }, canBeProcessed: async ( dmOperation: DMAddViewerToThreadMembersOperation, - viewerID: string, + utilities: ProcessDMOperationUtilities, ) => { + const { viewerID } = utilities; // We expect the viewer to be in the added users when the DM op // is processed. An exception is for ops generated // by InitialStateSharingHandler, which won't contain a messageID diff --git a/lib/shared/dm-ops/change-thread-read-status-spec.js b/lib/shared/dm-ops/change-thread-read-status-spec.js --- a/lib/shared/dm-ops/change-thread-read-status-spec.js +++ b/lib/shared/dm-ops/change-thread-read-status-spec.js @@ -23,7 +23,6 @@ }, processDMOperation: async ( dmOperation: DMChangeThreadReadStatusOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { threadID, unread, time } = dmOperation; @@ -65,15 +64,15 @@ }, canBeProcessed: async ( dmOperation: DMChangeThreadReadStatusOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { creatorID, threadID } = dmOperation; + const { threadInfos, viewerID } = utilities; if (viewerID !== creatorID) { return { isProcessingPossible: false, reason: { type: 'invalid' } }; } - if (!utilities.threadInfos[threadID]) { + if (!threadInfos[threadID]) { return { isProcessingPossible: false, reason: { type: 'missing_thread', threadID }, diff --git a/lib/shared/dm-ops/change-thread-settings-spec.js b/lib/shared/dm-ops/change-thread-settings-spec.js --- a/lib/shared/dm-ops/change-thread-settings-spec.js +++ b/lib/shared/dm-ops/change-thread-settings-spec.js @@ -106,7 +106,6 @@ }, processDMOperation: async ( dmOperation: DMChangeThreadSettingsOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { time, messageIDsPrefix } = dmOperation; @@ -163,7 +162,6 @@ }, canBeProcessed: async ( dmOperation: DMChangeThreadSettingsOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { if (utilities.threadInfos[dmOperation.threadID]) { diff --git a/lib/shared/dm-ops/change-thread-subscription.js b/lib/shared/dm-ops/change-thread-subscription.js --- a/lib/shared/dm-ops/change-thread-subscription.js +++ b/lib/shared/dm-ops/change-thread-subscription.js @@ -15,12 +15,12 @@ Object.freeze({ processDMOperation: async ( dmOperation: DMChangeThreadSubscriptionOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { creatorID, threadID, subscription, time } = dmOperation; + const { viewerID, threadInfos } = utilities; - const threadInfo = utilities.threadInfos[threadID]; + const threadInfo = threadInfos[threadID]; invariant(threadInfo.thick, 'Thread should be thick'); if (threadInfo.timestamps.members[creatorID].subscription > time) { @@ -79,7 +79,6 @@ }, canBeProcessed: async ( dmOperation: DMChangeThreadSubscriptionOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { threadID, creatorID } = dmOperation; diff --git a/lib/shared/dm-ops/create-entry-spec.js b/lib/shared/dm-ops/create-entry-spec.js --- a/lib/shared/dm-ops/create-entry-spec.js +++ b/lib/shared/dm-ops/create-entry-spec.js @@ -70,7 +70,6 @@ }, canBeProcessed: async ( dmOperation: DMCreateEntryOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { if (utilities.threadInfos[dmOperation.threadID]) { diff --git a/lib/shared/dm-ops/create-sidebar-spec.js b/lib/shared/dm-ops/create-sidebar-spec.js --- a/lib/shared/dm-ops/create-sidebar-spec.js +++ b/lib/shared/dm-ops/create-sidebar-spec.js @@ -84,7 +84,6 @@ Object.freeze({ notificationsCreationData: async ( dmOperation: DMCreateSidebarOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { sidebarSourceMessageData, createSidebarMessageData } = @@ -95,7 +94,6 @@ }, processDMOperation: async ( dmOperation: DMCreateSidebarOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { @@ -109,6 +107,7 @@ newSidebarSourceMessageID, newCreateSidebarMessageID, } = dmOperation; + const { viewerID } = utilities; const allMemberIDs = [creatorID, ...memberIDs]; const allMemberIDsWithSubscriptions = allMemberIDs.map(id => ({ id, @@ -169,7 +168,6 @@ }, canBeProcessed: async ( dmOperation: DMCreateSidebarOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const sourceMessage = await utilities.fetchMessage( diff --git a/lib/shared/dm-ops/create-thread-spec.js b/lib/shared/dm-ops/create-thread-spec.js --- a/lib/shared/dm-ops/create-thread-spec.js +++ b/lib/shared/dm-ops/create-thread-spec.js @@ -2,7 +2,10 @@ import uuid from 'uuid'; -import type { DMOperationSpec } from './dm-op-spec.js'; +import type { + DMOperationSpec, + ProcessDMOperationUtilities, +} from './dm-op-spec.js'; import { specialRoles } from '../../permissions/special-roles.js'; import { getAllThreadPermissions, @@ -156,7 +159,7 @@ }, processDMOperation: async ( dmOperation: DMCreateThreadOperation, - viewerID: string, + utilities: ProcessDMOperationUtilities, ) => { const { threadID, @@ -167,6 +170,7 @@ roleID, newMessageID, } = dmOperation; + const { viewerID } = utilities; const allMemberIDs = [creatorID, ...memberIDs]; const allMemberIDsWithSubscriptions = allMemberIDs.map(id => ({ id, diff --git a/lib/shared/dm-ops/delete-entry-spec.js b/lib/shared/dm-ops/delete-entry-spec.js --- a/lib/shared/dm-ops/delete-entry-spec.js +++ b/lib/shared/dm-ops/delete-entry-spec.js @@ -35,7 +35,6 @@ }, processDMOperation: async ( dmOperation: DMDeleteEntryOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { @@ -94,7 +93,6 @@ }, canBeProcessed: async ( dmOperation: DMDeleteEntryOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { if (!utilities.entryInfos[dmOperation.entryID]) { diff --git a/lib/shared/dm-ops/dm-op-spec.js b/lib/shared/dm-ops/dm-op-spec.js --- a/lib/shared/dm-ops/dm-op-spec.js +++ b/lib/shared/dm-ops/dm-op-spec.js @@ -8,6 +8,7 @@ import type { RawThreadInfos } from '../../types/thread-types.js'; export type ProcessDMOperationUtilities = { + +viewerID: string, // Needed to fetch sidebar source messages +fetchMessage: (messageID: string) => Promise, +threadInfos: RawThreadInfos, @@ -32,17 +33,14 @@ export type DMOperationSpec = { +notificationsCreationData?: ( dmOp: DMOp, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => Promise, +processDMOperation: ( dmOp: DMOp, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => Promise, +canBeProcessed: ( dmOp: DMOp, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => Promise, +supportsAutoRetry: boolean, diff --git a/lib/shared/dm-ops/edit-entry-spec.js b/lib/shared/dm-ops/edit-entry-spec.js --- a/lib/shared/dm-ops/edit-entry-spec.js +++ b/lib/shared/dm-ops/edit-entry-spec.js @@ -34,7 +34,6 @@ }, processDMOperation: async ( dmOperation: DMEditEntryOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { @@ -94,7 +93,6 @@ }, canBeProcessed: async ( dmOperation: DMEditEntryOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { if (!utilities.entryInfos[dmOperation.entryID]) { diff --git a/lib/shared/dm-ops/join-thread-spec.js b/lib/shared/dm-ops/join-thread-spec.js --- a/lib/shared/dm-ops/join-thread-spec.js +++ b/lib/shared/dm-ops/join-thread-spec.js @@ -43,13 +43,12 @@ }, processDMOperation: async ( dmOperation: DMJoinThreadOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { joinerID, time, messageID, existingThreadDetails } = dmOperation; + const { viewerID, threadInfos } = utilities; - const currentThreadInfo = - utilities.threadInfos[existingThreadDetails.threadID]; + const currentThreadInfo = threadInfos[existingThreadDetails.threadID]; if (currentThreadInfo && !currentThreadInfo.thick) { return { rawMessageInfos: [], @@ -164,11 +163,11 @@ }, canBeProcessed: async ( dmOperation: DMJoinThreadOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { + const { viewerID, threadInfos } = utilities; if ( - utilities.threadInfos[dmOperation.existingThreadDetails.threadID] || + threadInfos[dmOperation.existingThreadDetails.threadID] || dmOperation.joinerID === viewerID ) { return { isProcessingPossible: true }; diff --git a/lib/shared/dm-ops/leave-thread-spec.js b/lib/shared/dm-ops/leave-thread-spec.js --- a/lib/shared/dm-ops/leave-thread-spec.js +++ b/lib/shared/dm-ops/leave-thread-spec.js @@ -58,12 +58,12 @@ }, processDMOperation: async ( dmOperation: DMLeaveThreadOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { editorID, time, messageID, threadID } = dmOperation; + const { viewerID, threadInfos } = utilities; - const threadInfo = utilities.threadInfos[threadID]; + const threadInfo = threadInfos[threadID]; invariant(threadInfo.thick, 'Thread should be thick'); const messageData = createMessageDataFromDMOperation(dmOperation); @@ -75,8 +75,7 @@ viewerID === editorID && userIsMember(threadInfo, editorID) && (threadInfo.type !== threadTypes.THICK_SIDEBAR || - (threadInfo.parentThreadID && - !utilities.threadInfos[threadInfo.parentThreadID])) + (threadInfo.parentThreadID && !threadInfos[threadInfo.parentThreadID])) ) { return { rawMessageInfos, @@ -91,7 +90,7 @@ dmOperation, threadInfo, viewerID, - utilities.threadInfos, + threadInfos, ), ], }; @@ -137,7 +136,6 @@ }, canBeProcessed: async ( dmOperation: DMLeaveThreadOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { if (utilities.threadInfos[dmOperation.threadID]) { 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 @@ -43,19 +43,22 @@ import { messageSpecs } from '../messages/message-specs.js'; import { updateSpecs } from '../updates/update-specs.js'; -function useSendDMOperationUtils(): ProcessDMOperationUtilities { +function useSendDMOperationUtils() { const fetchMessage = useGetLatestMessageEdit(); const threadInfos = useSelector(state => state.threadStore.threadInfos); const entryInfos = useSelector(state => state.entryStore.entryInfos); const findUserIdentities = useFindUserIdentities(); + const loggedInUserInfo = useLoggedInUserInfo(); + const viewerID = loggedInUserInfo?.id; return React.useMemo( () => ({ + viewerID, fetchMessage, threadInfos, entryInfos, findUserIdentities, }), - [fetchMessage, threadInfos, entryInfos, findUserIdentities], + [viewerID, fetchMessage, threadInfos, entryInfos, findUserIdentities], ); } @@ -64,10 +67,8 @@ dmOpID: ?string, ) => Promise { const threadInfos = useSelector(state => state.threadStore.threadInfos); - const utilities = useSendDMOperationUtils(); + const baseUtilities = useSendDMOperationUtils(); const dispatchWithMetadata = useDispatchWithMetadata(); - const loggedInUserInfo = useLoggedInUserInfo(); - const viewerID = loggedInUserInfo?.id; const allPeerUserIDAndDeviceIDs = useSelector(getAllPeerUserIDAndDeviceIDs); const currentUserInfo = useSelector(state => state.currentUserInfo); @@ -78,10 +79,15 @@ dmOperationSpecification: DMOperationSpecification, dmOpID: ?string, ) => { + const { viewerID, ...restUtilities } = baseUtilities; if (!viewerID) { console.log('ignored DMOperation because logged out'); return; } + const utilities: ProcessDMOperationUtilities = { + ...restUtilities, + viewerID, + }; const { op: dmOp } = dmOperationSpecification; @@ -129,7 +135,7 @@ ) { const notificationsCreationData = await dmOpSpecs[ dmOp.type - ].notificationsCreationData?.(dmOp, viewerID, utilities); + ].notificationsCreationData?.(dmOp, utilities); dispatchWithMetadata( { @@ -150,7 +156,6 @@ const processingCheckResult = await dmOpSpecs[dmOp.type].canBeProcessed( dmOp, - viewerID, utilities, ); if (!processingCheckResult.isProcessingPossible) { @@ -212,16 +217,12 @@ ) { return null; } - return await dmOpSpec.notificationsCreationData( - dmOp, - viewerID, - utilities, - ); + return await dmOpSpec.notificationsCreationData(dmOp, utilities); })(); const [{ rawMessageInfos, updateInfos }, notificationsCreationData] = await Promise.all([ - dmOpSpec.processDMOperation(dmOp, viewerID, utilities), + dmOpSpec.processDMOperation(dmOp, utilities), notificationsCreationDataPromise, ]); @@ -340,8 +341,7 @@ ); }, [ - viewerID, - utilities, + baseUtilities, dispatchWithMetadata, allPeerUserIDAndDeviceIDs, currentUserInfo, @@ -373,11 +373,9 @@ const threadInfos = useSelector(state => state.threadStore.threadInfos); const { getDMOpsSendingPromise } = usePeerToPeerCommunication(); const dispatchWithMetadata = useDispatchWithMetadata(); - const loggedInUserInfo = useLoggedInUserInfo(); - const viewerID = loggedInUserInfo?.id; const allPeerUserIDAndDeviceIDs = useSelector(getAllPeerUserIDAndDeviceIDs); const currentUserInfo = useSelector(state => state.currentUserInfo); - const utilities = useSendDMOperationUtils(); + const baseUtilities = useSendDMOperationUtils(); const { processOutboundMessages } = usePeerToPeerCommunication(); const localMessageInfos = useSelector(state => state.messageStore.local); @@ -385,6 +383,7 @@ async ( dmOperationSpecification: OutboundComposableDMOperationSpecification, ): Promise => { + const { viewerID, ...restUtilities } = baseUtilities; if (!viewerID) { console.log('ignored DMOperation because logged out'); return { @@ -392,6 +391,10 @@ failedMessageIDs: [], }; } + const utilities: ProcessDMOperationUtilities = { + ...restUtilities, + viewerID, + }; const { promise, dmOpID } = getDMOpsSendingPromise(); @@ -428,7 +431,7 @@ const notificationsCreationData = await dmOpSpecs[ op.type - ].notificationsCreationData?.(op, viewerID, utilities); + ].notificationsCreationData?.(op, utilities); dispatchWithMetadata( { @@ -459,7 +462,6 @@ } }, [ - viewerID, allPeerUserIDAndDeviceIDs, currentUserInfo, dispatchWithMetadata, @@ -467,7 +469,7 @@ localMessageInfos, processOutboundMessages, threadInfos, - utilities, + baseUtilities, ], ); } diff --git a/lib/shared/dm-ops/remove-members-spec.js b/lib/shared/dm-ops/remove-members-spec.js --- a/lib/shared/dm-ops/remove-members-spec.js +++ b/lib/shared/dm-ops/remove-members-spec.js @@ -37,12 +37,12 @@ }, processDMOperation: async ( dmOperation: DMRemoveMembersOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { time, messageID, threadID, removedUserIDs } = dmOperation; + const { viewerID, threadInfos } = utilities; - const threadInfo = utilities.threadInfos[threadID]; + const threadInfo = threadInfos[threadID]; invariant(threadInfo.thick, 'Thread should be thick'); const messageData = createMessageDataFromDMOperation(dmOperation); @@ -78,7 +78,7 @@ viewerIsRemoved && (threadInfo.type !== threadTypes.THICK_SIDEBAR || (threadInfo.parentThreadID && - !utilities.threadInfos[threadInfo.parentThreadID])) + !threadInfos[threadInfo.parentThreadID])) ) { updateInfos.push({ type: updateTypes.DELETE_THREAD, @@ -111,7 +111,6 @@ }, canBeProcessed: async ( dmOperation: DMRemoveMembersOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { if (utilities.threadInfos[dmOperation.threadID]) { diff --git a/lib/shared/dm-ops/send-edit-message-spec.js b/lib/shared/dm-ops/send-edit-message-spec.js --- a/lib/shared/dm-ops/send-edit-message-spec.js +++ b/lib/shared/dm-ops/send-edit-message-spec.js @@ -44,7 +44,6 @@ }, canBeProcessed: async ( dmOperation: DMSendEditMessageOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const message = await utilities.fetchMessage(dmOperation.targetMessageID); diff --git a/lib/shared/dm-ops/send-multimedia-message-spec.js b/lib/shared/dm-ops/send-multimedia-message-spec.js --- a/lib/shared/dm-ops/send-multimedia-message-spec.js +++ b/lib/shared/dm-ops/send-multimedia-message-spec.js @@ -47,7 +47,6 @@ }, canBeProcessed: async ( dmOperation: DMSendMultimediaMessageOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { if (utilities.threadInfos[dmOperation.threadID]) { diff --git a/lib/shared/dm-ops/send-reaction-message-spec.js b/lib/shared/dm-ops/send-reaction-message-spec.js --- a/lib/shared/dm-ops/send-reaction-message-spec.js +++ b/lib/shared/dm-ops/send-reaction-message-spec.js @@ -46,7 +46,6 @@ }, canBeProcessed: async ( dmOperation: DMSendReactionMessageOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const message = await utilities.fetchMessage(dmOperation.targetMessageID); diff --git a/lib/shared/dm-ops/send-text-message-spec.js b/lib/shared/dm-ops/send-text-message-spec.js --- a/lib/shared/dm-ops/send-text-message-spec.js +++ b/lib/shared/dm-ops/send-text-message-spec.js @@ -44,7 +44,6 @@ }, canBeProcessed: async ( dmOperation: DMSendTextMessageOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { if (utilities.threadInfos[dmOperation.threadID]) { diff --git a/lib/shared/dm-ops/update-relationship-spec.js b/lib/shared/dm-ops/update-relationship-spec.js --- a/lib/shared/dm-ops/update-relationship-spec.js +++ b/lib/shared/dm-ops/update-relationship-spec.js @@ -10,10 +10,10 @@ async function createMessageDataFromDMOperation( dmOperation: DMUpdateRelationshipOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) { const { threadID, creatorID, time, operation } = dmOperation; + const { viewerID, findUserIdentities } = utilities; if (operation !== 'farcaster_mutual') { return { type: messageTypes.UPDATE_RELATIONSHIP, @@ -24,7 +24,6 @@ operation, }; } - const { findUserIdentities } = utilities; const { identities: userIdentities } = await findUserIdentities([ creatorID, viewerID, @@ -54,25 +53,21 @@ Object.freeze({ notificationsCreationData: async ( dmOperation: DMUpdateRelationshipOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const messageData = await createMessageDataFromDMOperation( dmOperation, - viewerID, utilities, ); return { messageDatas: [messageData] }; }, processDMOperation: async ( dmOperation: DMUpdateRelationshipOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { const { messageID } = dmOperation; const messageData = await createMessageDataFromDMOperation( dmOperation, - viewerID, utilities, ); const rawMessageInfos = [ @@ -85,15 +80,10 @@ }, canBeProcessed: async ( dmOperation: DMUpdateRelationshipOperation, - viewerID: string, utilities: ProcessDMOperationUtilities, ) => { try { - await createMessageDataFromDMOperation( - dmOperation, - viewerID, - utilities, - ); + await createMessageDataFromDMOperation(dmOperation, utilities); return { isProcessingPossible: true, };