()
| 267 | } |
| 268 | |
| 269 | function useAddDMThreadMembers(): ( |
| 270 | newMemberIDs: $ReadOnlyArray<string>, |
| 271 | threadInfo: ThreadInfo, |
| 272 | ) => Promise<void> { |
| 273 | const viewerID = useSelector( |
| 274 | state => state.currentUserInfo && state.currentUserInfo.id, |
| 275 | ); |
| 276 | const processAndSendDMOperation = useProcessAndSendDMOperation(); |
| 277 | const threadInfos = useSelector(state => state.threadStore.threadInfos); |
| 278 | |
| 279 | return React.useCallback( |
| 280 | async (newMemberIDs: $ReadOnlyArray<string>, threadInfo: ThreadInfo) => { |
| 281 | const rawThreadInfo = threadInfos[threadInfo.id]; |
| 282 | invariant(rawThreadInfo.thick, 'thread should be thick'); |
| 283 | const existingThreadDetails = |
| 284 | getCreateThickRawThreadInfoInputFromThreadInfo(rawThreadInfo); |
| 285 | |
| 286 | const messageID = uuid.v4(); |
| 287 | |
| 288 | invariant(viewerID, 'viewerID should be set'); |
| 289 | const addViewerToThreadMembersOperation: DMAddViewerToThreadMembersOperation = |
| 290 | { |
| 291 | type: 'add_viewer_to_thread_members', |
| 292 | existingThreadDetails, |
| 293 | editorID: viewerID, |
| 294 | time: Date.now(), |
| 295 | messageID, |
| 296 | addedUserIDs: newMemberIDs, |
| 297 | }; |
| 298 | const viewerOperationSpecification: OutboundDMOperationSpecification = { |
| 299 | type: dmOperationSpecificationTypes.OUTBOUND, |
| 300 | op: addViewerToThreadMembersOperation, |
| 301 | recipients: { |
| 302 | type: 'some_users', |
| 303 | userIDs: newMemberIDs, |
| 304 | }, |
| 305 | sendOnly: true, |
| 306 | }; |
| 307 | |
| 308 | invariant(viewerID, 'viewerID should be set'); |
| 309 | const addMembersOperation: DMAddMembersOperation = { |
| 310 | type: 'add_members', |
| 311 | threadID: threadInfo.id, |
| 312 | editorID: viewerID, |
| 313 | time: Date.now(), |
| 314 | messageID, |
| 315 | addedUserIDs: newMemberIDs, |
| 316 | }; |
| 317 | const newMemberIDsSet = new Set<string>(newMemberIDs); |
| 318 | const recipientsThreadID = |
| 319 | threadInfo.type === thickThreadTypes.THICK_SIDEBAR && |
| 320 | threadInfo.parentThreadID |
| 321 | ? threadInfo.parentThreadID |
| 322 | : threadInfo.id; |
| 323 | |
| 324 | const existingMembers = |
| 325 | threadInfos[recipientsThreadID]?.members |
| 326 | ?.map(member => member.id) |
no test coverage detected