mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 10:33:45 +00:00
Fixes #2706 - Use disambiguated display names for timeline item senders and state event bodies. (#2739)
This commit is contained in:
+36
-24
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user