diff --git a/MatrixSDK/Space/MXSpace.swift b/MatrixSDK/Space/MXSpace.swift index db50289df2..d5ddc91915 100644 --- a/MatrixSDK/Space/MXSpace.swift +++ b/MatrixSDK/Space/MXSpace.swift @@ -223,6 +223,48 @@ public class MXSpace: NSObject { return childRoomIds.contains(roomId) } + /// Check if the current user has enough power level to add room to this space + /// - Parameters: + /// - completion: A closure called when the operation completes. + /// - canAddRoom: Indicates wether the user has right or not to add rooms to this space + public func canAddRoom(completion: @escaping (_ canAddRoom: Bool) -> Void) { + guard let userId = session.myUserId else { + MXLog.warning("[MXSpace] canAddRoom: user ID not found") + completion(false) + return + } + + guard let summary = self.summary else { + MXLog.warning("[MXSpace] canAddRoom: summary not found") + completion(false) + return + } + + guard let room = self.room else { + MXLog.warning("[MXSpace] canAddRoom: room not found") + completion(false) + return + } + + guard summary.membership == .join else { + completion(false) + return + } + + room.state { roomState in + guard let powerLevels = roomState?.powerLevels else { + MXLog.warning("[MXSpace] canAddRoom: space power levels not found") + completion(false) + return + } + let userPowerLevel = powerLevels.powerLevelOfUser(withUserID: userId) + let minimumPowerLevel = powerLevels.events["m.space.child"] as? Int ?? powerLevels.stateDefault + let canAddRoom = userPowerLevel >= minimumPowerLevel + + completion(canAddRoom) + } + } + // MARK: - Private private func updateChildRooms(from space: MXSpace, with directRoomsPerMember: [String : [String]]) { diff --git a/changelog.d/5230.feature b/changelog.d/5230.feature new file mode 100644 index 0000000000..f0b59479c9 --- /dev/null +++ b/changelog.d/5230.feature @@ -0,0 +1 @@ +MXSpace: added canAddRoom() method \ No newline at end of file