Use the room heroes when computing a DM avatar. (#2900)

* Use room heroes for DM avatar content ID.

* Use RoomAvatar.heroes for the DM Details stack.
This commit is contained in:
Doug
2024-06-19 11:27:10 +01:00
committed by GitHub
parent 17d96b0f4b
commit 834260c144
55 changed files with 524 additions and 198 deletions
@@ -19,7 +19,7 @@ import Foundation
struct RoomDetails {
let id: String
let name: String?
let avatarURL: URL?
let avatar: RoomAvatar
let canonicalAlias: String?
let isEncrypted: Bool
let isPublic: Bool
@@ -100,6 +100,18 @@ class RoomProxy: RoomProxyProtocol {
var avatarURL: URL? {
roomListItem.avatarUrl().flatMap(URL.init(string:))
}
var avatar: RoomAvatar {
if isDirect, avatarURL == nil {
let heroes = room.heroes()
if heroes.count == 1 {
return .heroes(heroes.map(UserProfileProxy.init))
}
}
return .room(id: id, name: name, avatarURL: avatarURL)
}
var joinedMembersCount: Int {
Int(room.joinedMembersCount())
@@ -47,12 +47,15 @@ protocol RoomProxyProtocol {
var topic: String? { get }
/// The room's avatar info for use in a ``RoomAvatarImage``.
var avatar: RoomAvatar { get }
/// The room's avatar URL. Use this for editing and favour ``avatar`` for display.
var avatarURL: URL? { get }
var membersPublisher: CurrentValuePublisher<[RoomMemberProxyProtocol], Never> { get }
var typingMembersPublisher: CurrentValuePublisher<[String], Never> { get }
var joinedMembersCount: Int { get }
var activeMembersCount: Int { get }
@@ -146,7 +149,7 @@ extension RoomProxyProtocol {
var details: RoomDetails {
RoomDetails(id: id,
name: name,
avatarURL: avatarURL,
avatar: avatar,
canonicalAlias: canonicalAlias,
isEncrypted: isEncrypted,
isPublic: isPublic)
@@ -26,6 +26,7 @@ struct RoomSummaryDetails {
let name: String
let isDirect: Bool
let avatarURL: URL?
let heroes: [UserProfileProxy]
let lastMessage: AttributedString?
let lastMessageFormattedTimestamp: String?
let unreadMessagesCount: UInt
@@ -64,6 +65,7 @@ extension RoomSummaryDetails {
name = string
isDirect = true
avatarURL = nil
heroes = []
lastMessage = AttributedString(string)
lastMessageFormattedTimestamp = "Now"
unreadMessagesCount = hasUnreadMessages ? 1 : 0
@@ -78,4 +80,12 @@ extension RoomSummaryDetails {
isMarkedUnread = false
isFavourite = false
}
var avatar: RoomAvatar {
if isDirect, avatarURL == nil, heroes.count == 1 {
.heroes(heroes)
} else {
.room(id: id, name: name, avatarURL: avatarURL)
}
}
}
@@ -252,6 +252,7 @@ class RoomSummaryProvider: RoomSummaryProviderProtocol {
name: roomInfo.displayName ?? roomInfo.id,
isDirect: roomInfo.isDirect,
avatarURL: roomInfo.avatarUrl.flatMap(URL.init(string:)),
heroes: roomInfo.heroes.map(UserProfileProxy.init),
lastMessage: attributedLastMessage,
lastMessageFormattedTimestamp: lastMessageFormattedTimestamp,
unreadMessagesCount: UInt(roomInfo.numUnreadMessages),
@@ -154,7 +154,7 @@ final class RoomDirectorySearchProxy: RoomDirectorySearchProxyProtocol {
alias: value.alias,
name: value.name,
topic: value.topic,
avatarURL: value.avatarUrl.flatMap(URL.init(string:)),
avatar: .room(id: value.roomId, name: value.name, avatarURL: value.avatarUrl.flatMap(URL.init(string:))),
canBeJoined: value.joinRule == .public)
}
}
@@ -34,6 +34,6 @@ struct RoomDirectorySearchResult: Identifiable {
let alias: String?
let name: String?
let topic: String?
let avatarURL: URL?
let avatar: RoomAvatar
let canBeJoined: Bool
}
@@ -28,12 +28,24 @@ struct UserProfileProxy: Equatable, Hashable {
self.avatarURL = avatarURL
}
init(member: RoomMemberDetails) {
userID = member.id
displayName = member.isBanned ? nil : member.name
avatarURL = member.isBanned ? nil : member.avatarURL
}
init(sdkUserProfile: MatrixRustSDK.UserProfile) {
userID = sdkUserProfile.userId
displayName = sdkUserProfile.displayName
avatarURL = sdkUserProfile.avatarUrl.flatMap(URL.init(string:))
}
init(sdkRoomHero: MatrixRustSDK.RoomHero) {
userID = sdkRoomHero.userId
displayName = sdkRoomHero.displayName
avatarURL = sdkRoomHero.avatarUrl.flatMap(URL.init(string:))
}
/// A user is meant to be "verified" when the GET profile returns back either the display name or the avatar
/// If isn't we aren't sure that the related matrix id really exists.
var isVerified: Bool {