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
@@ -18,36 +18,35 @@ import Foundation
import MatrixRustSDK
struct RoomEventStringBuilder {
private let stateEventStringBuilder: RoomStateEventStringBuilder
private let messageEventStringBuilder: RoomMessageEventStringBuilder
init(stateEventStringBuilder: RoomStateEventStringBuilder, messageEventStringBuilder: RoomMessageEventStringBuilder) {
self.stateEventStringBuilder = stateEventStringBuilder
self.messageEventStringBuilder = messageEventStringBuilder
}
let stateEventStringBuilder: RoomStateEventStringBuilder
let messageEventStringBuilder: RoomMessageEventStringBuilder
let shouldDisambiguateDisplayNames: Bool
func buildAttributedString(for eventItemProxy: EventTimelineItemProxy) -> AttributedString? {
let sender = eventItemProxy.sender
let isOutgoing = eventItemProxy.isOwn
let senderDisplayName = sender.displayName ?? sender.id
let displayName = if shouldDisambiguateDisplayNames {
sender.disambiguatedDisplayName ?? sender.id
} else {
sender.displayName ?? sender.id
}
switch eventItemProxy.content.kind() {
case .unableToDecrypt:
return prefix(L10n.commonDecryptionError, with: senderDisplayName)
return prefix(L10n.commonDecryptionError, with: displayName)
case .redactedMessage:
return prefix(L10n.commonMessageRemoved, with: senderDisplayName)
return prefix(L10n.commonMessageRemoved, with: displayName)
case .sticker:
return prefix(L10n.commonSticker, with: senderDisplayName)
return prefix(L10n.commonSticker, with: displayName)
case .failedToParseMessageLike, .failedToParseState:
return prefix(L10n.commonUnsupportedEvent, with: senderDisplayName)
return prefix(L10n.commonUnsupportedEvent, with: displayName)
case .message:
guard let messageContent = eventItemProxy.content.asMessage() else {
fatalError("Invalid message timeline item: \(eventItemProxy)")
}
let messageType = messageContent.msgtype()
return messageEventStringBuilder.buildAttributedString(for: messageType, senderDisplayName: senderDisplayName, prefixWithSenderName: true)
return messageEventStringBuilder.buildAttributedString(for: messageType, senderDisplayName: displayName, prefixWithSenderName: true)
case .state(_, let state):
return stateEventStringBuilder
.buildString(for: state, sender: sender, isOutgoing: isOutgoing)
@@ -66,9 +65,9 @@ struct RoomEventStringBuilder {
memberIsYou: isOutgoing)
.map(AttributedString.init)
case .poll(let question, _, _, _, _, _, _):
return prefix(L10n.commonPollSummary(question), with: senderDisplayName)
return prefix(L10n.commonPollSummary(question), with: displayName)
case .callInvite:
return prefix(L10n.commonCallInvite, with: senderDisplayName)
return prefix(L10n.commonCallInvite, with: displayName)
}
}