Fixes #3713, fixes #3674, fixes #3834 - Invite interaction and preview support for homeservers that don't have MSC3266 enabled.

This commit is contained in:
Stefan Ceriu 2025-03-10 14:23:01 +02:00
parent 54111535ba
commit c31e7b8e91
2 changed files with 27 additions and 9 deletions

View File

@ -896,7 +896,6 @@ class ClientProxy: ClientProxyProtocol {
switch roomListItem.membership() {
case .invited:
return try await .invited(InvitedRoomProxy(roomListItem: roomListItem,
roomPreview: roomListItem.previewRoom(via: []),
ownUserID: userID))
case .knocked:
if appSettings.knockingEnabled {

View File

@ -11,7 +11,10 @@ import UIKit
class InvitedRoomProxy: InvitedRoomProxyProtocol {
private let roomListItem: RoomListItemProtocol
private let roomPreview: RoomPreviewProtocol
private var roomPreview: RoomPreview?
private var invitedRoom: Room?
let info: BaseRoomInfoProxyProtocol
let ownUserID: String
let inviter: RoomMemberProxyProtocol?
@ -20,19 +23,35 @@ class InvitedRoomProxy: InvitedRoomProxyProtocol {
// multiple times over FFI
lazy var id: String = info.id
init(roomListItem: RoomListItemProtocol,
roomPreview: RoomPreviewProtocol,
ownUserID: String) async throws {
init(roomListItem: RoomListItemProtocol, ownUserID: String) async throws {
self.roomListItem = roomListItem
self.roomPreview = roomPreview
self.ownUserID = ownUserID
info = try RoomPreviewInfoProxy(roomPreviewInfo: roomPreview.info())
inviter = await roomPreview.inviter().map(RoomMemberProxy.init)
// The room summary API might not be available on all the homeservers.
// Try to resolve it with what info we already have which also happens to be faster.
if let invitedRoom = try? roomListItem.invitedRoom() {
self.invitedRoom = invitedRoom
inviter = await invitedRoom.inviter().map(RoomMemberProxy.init)
info = try await RoomInfoProxy(roomInfo: invitedRoom.roomInfo())
} else {
let roomPreview = try await roomListItem.previewRoom(via: [])
self.roomPreview = roomPreview
info = try RoomPreviewInfoProxy(roomPreviewInfo: roomPreview.info())
inviter = await roomPreview.inviter().map(RoomMemberProxy.init)
}
}
func rejectInvitation() async -> Result<Void, RoomProxyError> {
do {
return try await .success(roomPreview.leave())
if let invitedRoom {
return try await .success(invitedRoom.leave())
} else if let roomPreview {
return try await .success(roomPreview.leave())
} else {
fatalError("Invalid InvitedRoomProxy state, missing both `invitedRoom` and `roomPreview`")
}
} catch {
MXLog.error("Failed rejecting invitiation with error: \(error)")
return .failure(.sdkError(error))