mirror of https://github.com/vector-im/riot-web
				
				
				
			Fix start DM with pending third party invite (#10347)
* Fix start DM with pending third party invite
* Make the fix more clearly visible
---------
Co-authored-by: Janne Mareike Koschinski <jannemk@element.io>
Co-authored-by: Janne Mareike Koschinski <janne@kuschku.de>
(cherry picked from commit d53e91802d)
			
			
				pull/28788/head^2
			
			
		
							parent
							
								
									ad28d123b2
								
							
						
					
					
						commit
						a9161981e2
					
				|  | @ -21,7 +21,20 @@ import { isLocalRoom } from "../localRoom/isLocalRoom"; | |||
| import { isJoinedOrNearlyJoined } from "../membership"; | ||||
| import { getFunctionalMembers } from "../room/getFunctionalMembers"; | ||||
| 
 | ||||
| function extractSuitableRoom(rooms: Room[], userId: string): Room | undefined { | ||||
| /** | ||||
|  * Iterates the rooms and tries to find a DM room with the user identified by UserId. | ||||
|  * A DM room is assumed if one of the following matches: | ||||
|  * - Has two members and contains a membership for the user identified by userId | ||||
|  * - findRoomWithThirdpartyInvites is true and has one member and a third pending third party invite | ||||
|  * | ||||
|  * If multiple rooms match it will return the one with the most recent event. | ||||
|  * | ||||
|  * @param rooms - Rooms to iterate | ||||
|  * @param userId - User Id of the other user | ||||
|  * @param [findRoomWithThirdpartyInvites] - Whether to find a DM for a pending thirdparty invite | ||||
|  * @returns DM room if found or undefined if not | ||||
|  */ | ||||
| function extractSuitableRoom(rooms: Room[], userId: string, findRoomWithThirdpartyInvites: boolean): Room | undefined { | ||||
|     const suitableRooms = rooms | ||||
|         .filter((r) => { | ||||
|             // Validate that we are joined and the other person is also joined. We'll also make sure
 | ||||
|  | @ -46,7 +59,7 @@ function extractSuitableRoom(rooms: Room[], userId: string): Room | undefined { | |||
|                 const thirdPartyInvites = r.currentState.getStateEvents("m.room.third_party_invite") || []; | ||||
| 
 | ||||
|                 // match room with pending third-party invite
 | ||||
|                 return joinedMembers.length === 1 && thirdPartyInvites.length === 1; | ||||
|                 return findRoomWithThirdpartyInvites && joinedMembers.length === 1 && thirdPartyInvites.length === 1; | ||||
|             } | ||||
|             return false; | ||||
|         }) | ||||
|  | @ -71,7 +84,10 @@ function extractSuitableRoom(rooms: Room[], userId: string): Room | undefined { | |||
| export function findDMForUser(client: MatrixClient, userId: string): Room | undefined { | ||||
|     const roomIdsForUserId = DMRoomMap.shared().getDMRoomsForUserId(userId); | ||||
|     const roomsForUserId = roomIdsForUserId.map((id) => client.getRoom(id)).filter((r): r is Room => r !== null); | ||||
|     const suitableRoomForUserId = extractSuitableRoom(roomsForUserId, userId); | ||||
|     // Call with findRoomWithThirdpartyInvites = true to also include rooms with pending thirdparty invites.
 | ||||
|     // roomsForUserId can only contain rooms with the other user here,
 | ||||
|     // because they have been queried by getDMRoomsForUserId().
 | ||||
|     const suitableRoomForUserId = extractSuitableRoom(roomsForUserId, userId, true); | ||||
| 
 | ||||
|     if (suitableRoomForUserId) { | ||||
|         return suitableRoomForUserId; | ||||
|  | @ -82,5 +98,5 @@ export function findDMForUser(client: MatrixClient, userId: string): Room | unde | |||
|     const allRooms = Array.from(allRoomIds) | ||||
|         .map((id) => client.getRoom(id)) | ||||
|         .filter((r): r is Room => r !== null); | ||||
|     return extractSuitableRoom(allRooms, userId); | ||||
|     return extractSuitableRoom(allRooms, userId, false); | ||||
| } | ||||
|  |  | |||
|  | @ -135,6 +135,10 @@ describe("findDMForUser", () => { | |||
|                 return [room1.roomId, room2.roomId, room3.roomId, room4.roomId, room5.roomId, unknownRoomId]; | ||||
|             } | ||||
| 
 | ||||
|             if (userId === thirdPartyId) { | ||||
|                 return [room7.roomId]; | ||||
|             } | ||||
| 
 | ||||
|             return []; | ||||
|         }); | ||||
|     }); | ||||
|  | @ -174,4 +178,8 @@ describe("findDMForUser", () => { | |||
|     it("should find a room with a pending third-party invite", () => { | ||||
|         expect(findDMForUser(mockClient, thirdPartyId)).toBe(room7); | ||||
|     }); | ||||
| 
 | ||||
|     it("should not find a room for an unknown Id", () => { | ||||
|         expect(findDMForUser(mockClient, "@unknown:example.com")).toBe(undefined); | ||||
|     }); | ||||
| }); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Michael Weimann
						Michael Weimann