diff --git a/ElementX/Sources/Services/Client/ClientProxy.swift b/ElementX/Sources/Services/Client/ClientProxy.swift index 0a2578499..e3b6052be 100644 --- a/ElementX/Sources/Services/Client/ClientProxy.swift +++ b/ElementX/Sources/Services/Client/ClientProxy.swift @@ -683,6 +683,7 @@ class ClientProxy: ClientProxyProtocol { .roomHistoryVisibility, .roomJoinRules, .roomPinnedEvents, + .roomPowerLevels, .roomServerAcl, .roomTombstone, .spaceChild, diff --git a/ElementX/Sources/Services/Timeline/TimelineItems/RoomStateEventStringBuilder.swift b/ElementX/Sources/Services/Timeline/TimelineItems/RoomStateEventStringBuilder.swift index 28b52c50f..cf480eab2 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItems/RoomStateEventStringBuilder.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItems/RoomStateEventStringBuilder.swift @@ -151,10 +151,6 @@ struct RoomStateEventStringBuilder { case (nil, true): return L10n.stateEventRoomNameRemovedByYou } - case .roomPowerLevels(let users, let previous): - let newRoles = users.compactMap { userRoleChanged(userID: $0.key, powerLevel: $0.value, previous: previous?[$0.key]) } - guard !newRoles.isEmpty else { return nil } - return newRoles.formatted(.list(type: .and)) case .roomThirdPartyInvite(let displayName): guard let displayName else { MXLog.error("roomThirdPartyInvite undisplayable due to missing name.") @@ -177,6 +173,8 @@ struct RoomStateEventStringBuilder { case (nil, true): return L10n.stateEventRoomTopicRemovedByYou } + case .roomPowerLevels: // Long term we might show only the user changes, but we need an SDK filter to fix read receipts in that case. + break case .policyRuleRoom, .policyRuleServer, .policyRuleUser: // No strings available. break case .roomAliases, .roomCanonicalAlias: // Doesn't provide the alias. @@ -198,26 +196,4 @@ struct RoomStateEventStringBuilder { MXLog.verbose("Filtering timeline item for state: \(state)") return nil } - - private func userRoleChanged(userID: String, powerLevel: Int64, previous: Int64?) -> String? { - let previous = previous ?? 0 // TODO: Include the previous default in the SDK item. - - let role = suggestedRoleForPowerLevel(powerLevel: powerLevel) - let previousRole = suggestedRoleForPowerLevel(powerLevel: previous) - guard role != previousRole else { return nil } - - let isPromotion = powerLevel > previous - return switch (role, isPromotion) { - case (.user, false): - L10n.stateEventDemotedToMember(userID) - case (.moderator, true): - L10n.stateEventPromotedToModerator(userID) - case (.moderator, false): - L10n.stateEventDemotedToModerator(userID) - case (.administrator, true): - L10n.stateEventPromotedToAdministrator(userID) - default: - nil - } - } } diff --git a/UnitTests/Sources/RoomStateEventStringBuilderTests.swift b/UnitTests/Sources/RoomStateEventStringBuilderTests.swift index d2cac957d..a886fe346 100644 --- a/UnitTests/Sources/RoomStateEventStringBuilderTests.swift +++ b/UnitTests/Sources/RoomStateEventStringBuilderTests.swift @@ -89,93 +89,4 @@ class RoomStateEventStringBuilderTests: XCTestCase { memberIsYou: sender.id == userID) XCTAssertEqual(string, expectedString) } - - // MARK: - User Power Levels - - let aliceID = "@alice" - let bobID = "@bob" - - func testUserPowerLevelsPromotion() { - var string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .moderator)], - previous: [aliceID: suggestedPowerLevelForRole(role: .user)]), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertEqual(string, L10n.stateEventPromotedToModerator(aliceID)) - - string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .administrator)], - previous: [aliceID: suggestedPowerLevelForRole(role: .user)]), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertEqual(string, L10n.stateEventPromotedToAdministrator(aliceID)) - - string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .administrator)], - previous: [aliceID: suggestedPowerLevelForRole(role: .moderator)]), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertEqual(string, L10n.stateEventPromotedToAdministrator(aliceID)) - } - - func testUserPowerLevelsDemotion() { - var string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .moderator)], - previous: [aliceID: suggestedPowerLevelForRole(role: .administrator)]), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertEqual(string, L10n.stateEventDemotedToModerator(aliceID)) - - string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .user)], - previous: [aliceID: suggestedPowerLevelForRole(role: .administrator)]), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertEqual(string, L10n.stateEventDemotedToMember(aliceID)) - - string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: suggestedPowerLevelForRole(role: .user)], - previous: [aliceID: suggestedPowerLevelForRole(role: .moderator)]), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertEqual(string, L10n.stateEventDemotedToMember(aliceID)) - } - - func testMultipleUserPowerLevels() { - let new = [aliceID: suggestedPowerLevelForRole(role: .administrator), - bobID: suggestedPowerLevelForRole(role: .user)] - let previous = [aliceID: suggestedPowerLevelForRole(role: .user), - bobID: suggestedPowerLevelForRole(role: .moderator)] - let string = stringBuilder.buildString(for: .roomPowerLevels(users: new, previous: previous), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertEqual(string?.contains(L10n.stateEventPromotedToAdministrator(aliceID)), true) - XCTAssertEqual(string?.contains(L10n.stateEventDemotedToMember(bobID)), true) - } - - func testInvalidUserPowerLevels() { - // Admin demotions aren't relevant. - var string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: 100], - previous: [aliceID: 200]), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertNil(string) - - // User promotions aren't relevant. - string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: 0], - previous: [aliceID: -100]), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertNil(string) - - // Or more generally, any change within the same role isn't relevant either. - string = stringBuilder.buildString(for: .roomPowerLevels(users: [aliceID: 75], - previous: [aliceID: 60]), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertNil(string) - - let new = [aliceID: 100, - bobID: suggestedPowerLevelForRole(role: .user)] - let previous = [aliceID: 200, - bobID: suggestedPowerLevelForRole(role: .moderator)] - string = stringBuilder.buildString(for: .roomPowerLevels(users: new, previous: previous), - sender: TimelineItemSender(id: ""), - isOutgoing: false) - XCTAssertEqual(string, L10n.stateEventDemotedToMember(bobID)) - } } diff --git a/changelog.d/2359.misc b/changelog.d/2359.misc new file mode 100644 index 000000000..88c79b96a --- /dev/null +++ b/changelog.d/2359.misc @@ -0,0 +1 @@ +Stop showing that a user's role has changed in the room timeline. \ No newline at end of file