Fixes #2706 - Use disambiguated display names for timeline item senders and state event bodies. (#2739)

This commit is contained in:
Stefan Ceriu
2024-04-25 14:53:18 +03:00
committed by GitHub
parent 6661c16154
commit 8d66572cc9
7 changed files with 84 additions and 50 deletions
@@ -19,55 +19,63 @@ import UIKit
struct RoomStateEventStringBuilder {
let userID: String
var shouldDisambiguateDisplayNames = true
func buildString(for change: MembershipChange?, member: String, sender: TimelineItemSender, isOutgoing: Bool) -> String? {
func buildString(for change: MembershipChange?,
member: String,
sender: TimelineItemSender,
isOutgoing: Bool) -> String? {
guard let change else {
MXLog.verbose("Filtering timeline item for membership change that is nil")
return nil
}
let senderName = sender.displayName ?? sender.id
let senderIsYou = isOutgoing
let memberIsYou = member == userID
let displayName = if shouldDisambiguateDisplayNames {
sender.disambiguatedDisplayName ?? sender.id
} else {
sender.displayName ?? sender.id
}
switch change {
case .joined:
return memberIsYou ? L10n.stateEventRoomJoinByYou : L10n.stateEventRoomJoin(member)
return memberIsYou ? L10n.stateEventRoomJoinByYou : L10n.stateEventRoomJoin(displayName)
case .left:
return memberIsYou ? L10n.stateEventRoomLeaveByYou : L10n.stateEventRoomLeave(member)
return memberIsYou ? L10n.stateEventRoomLeaveByYou : L10n.stateEventRoomLeave(displayName)
case .banned, .kickedAndBanned:
return senderIsYou ? L10n.stateEventRoomBanByYou(member) : L10n.stateEventRoomBan(senderName, member)
return senderIsYou ? L10n.stateEventRoomBanByYou(member) : L10n.stateEventRoomBan(displayName, member)
case .unbanned:
return senderIsYou ? L10n.stateEventRoomUnbanByYou(member) : L10n.stateEventRoomUnban(senderName, member)
return senderIsYou ? L10n.stateEventRoomUnbanByYou(member) : L10n.stateEventRoomUnban(displayName, member)
case .kicked:
return senderIsYou ? L10n.stateEventRoomRemoveByYou(member) : L10n.stateEventRoomRemove(senderName, member)
return senderIsYou ? L10n.stateEventRoomRemoveByYou(member) : L10n.stateEventRoomRemove(displayName, member)
case .invited:
if senderIsYou {
return L10n.stateEventRoomInviteByYou(member)
} else if memberIsYou {
return L10n.stateEventRoomInviteYou(senderName)
return L10n.stateEventRoomInviteYou(displayName)
} else {
return L10n.stateEventRoomInvite(senderName, member)
return L10n.stateEventRoomInvite(displayName, member)
}
case .invitationAccepted:
return memberIsYou ? L10n.stateEventRoomInviteAcceptedByYou : L10n.stateEventRoomInviteAccepted(member)
return memberIsYou ? L10n.stateEventRoomInviteAcceptedByYou : L10n.stateEventRoomInviteAccepted(displayName)
case .invitationRejected:
return memberIsYou ? L10n.stateEventRoomRejectByYou : L10n.stateEventRoomReject(member)
return memberIsYou ? L10n.stateEventRoomRejectByYou : L10n.stateEventRoomReject(displayName)
case .invitationRevoked:
return senderIsYou ? L10n.stateEventRoomThirdPartyRevokedInviteByYou(member) : L10n.stateEventRoomThirdPartyRevokedInvite(sender, member)
return senderIsYou ? L10n.stateEventRoomThirdPartyRevokedInviteByYou(member) : L10n.stateEventRoomThirdPartyRevokedInvite(displayName, member)
case .knocked:
return memberIsYou ? L10n.stateEventRoomKnockByYou : L10n.stateEventRoomKnock(member)
case .knockAccepted:
return senderIsYou ? L10n.stateEventRoomKnockAcceptedByYou(senderName) : L10n.stateEventRoomKnockAccepted(senderName, member)
return senderIsYou ? L10n.stateEventRoomKnockAcceptedByYou(displayName) : L10n.stateEventRoomKnockAccepted(displayName, member)
case .knockRetracted:
return memberIsYou ? L10n.stateEventRoomKnockRetractedByYou : L10n.stateEventRoomKnockRetracted(member)
case .knockDenied:
if senderIsYou {
return L10n.stateEventRoomKnockDeniedByYou(member)
} else if memberIsYou {
return L10n.stateEventRoomKnockDeniedYou(senderName)
return L10n.stateEventRoomKnockDeniedYou(displayName)
} else {
return L10n.stateEventRoomKnockDenied(senderName, member)
return L10n.stateEventRoomKnockDenied(displayName, member)
}
case .none, .error, .notImplemented: // Not useful information for the user.
MXLog.verbose("Filtering timeline item for membership change: \(change)")
@@ -122,30 +130,34 @@ struct RoomStateEventStringBuilder {
}
func buildString(for state: OtherState, sender: TimelineItemSender, isOutgoing: Bool) -> String? {
let senderName = sender.displayName ?? sender.id
let displayName = if shouldDisambiguateDisplayNames {
sender.disambiguatedDisplayName ?? sender.id
} else {
sender.displayName ?? sender.id
}
switch state {
case .roomAvatar(let url):
switch (url, isOutgoing) {
case (.some, false):
return L10n.stateEventRoomAvatarChanged(senderName)
return L10n.stateEventRoomAvatarChanged(displayName)
case (nil, false):
return L10n.stateEventRoomAvatarRemoved(senderName)
return L10n.stateEventRoomAvatarRemoved(displayName)
case (.some, true):
return L10n.stateEventRoomAvatarChangedByYou
case (nil, true):
return L10n.stateEventRoomAvatarRemovedByYou
}
case .roomCreate:
return isOutgoing ? L10n.stateEventRoomCreatedByYou : L10n.stateEventRoomCreated(senderName)
return isOutgoing ? L10n.stateEventRoomCreatedByYou : L10n.stateEventRoomCreated(displayName)
case .roomEncryption:
return L10n.commonEncryptionEnabled
case .roomName(let name):
switch (name, isOutgoing) {
case (.some(let name), false):
return L10n.stateEventRoomNameChanged(senderName, name)
return L10n.stateEventRoomNameChanged(displayName, name)
case (nil, false):
return L10n.stateEventRoomNameRemoved(senderName)
return L10n.stateEventRoomNameRemoved(displayName)
case (.some(let name), true):
return L10n.stateEventRoomNameChangedByYou(name)
case (nil, true):
@@ -160,14 +172,14 @@ struct RoomStateEventStringBuilder {
if isOutgoing {
return L10n.stateEventRoomThirdPartyInviteByYou(displayName)
} else {
return L10n.stateEventRoomThirdPartyInvite(senderName, displayName)
return L10n.stateEventRoomThirdPartyInvite(displayName, displayName)
}
case .roomTopic(let topic):
switch (topic, isOutgoing) {
case (.some(let topic), false):
return L10n.stateEventRoomTopicChanged(senderName, topic)
return L10n.stateEventRoomTopicChanged(displayName, topic)
case (nil, false):
return L10n.stateEventRoomTopicRemoved(senderName)
return L10n.stateEventRoomTopicRemoved(displayName)
case (.some(let name), true):
return L10n.stateEventRoomTopicChangedByYou(name)
case (nil, true):