Added user display names and switched to using an avatar url directly in the homeScreen viewModel for the current user.

This commit is contained in:
Stefan Ceriu
2022-03-21 19:35:24 +02:00
parent a9c0a8f334
commit d201ca1ad8
23 changed files with 152 additions and 71 deletions
@@ -12,6 +12,7 @@ class MemberDetailsProvider: MemberDetailsProviderProtocol {
private let roomProxy: RoomProxyProtocol?
private let processingQueue = DispatchQueue(label: "MemberDetailsProviderProcessingQueue")
private var memberAvatars = [String: String]()
private var memberDisplayNames = [String: String]()
init(roomProxy: RoomProxyProtocol) {
self.roomProxy = roomProxy
@@ -50,4 +51,38 @@ class MemberDetailsProvider: MemberDetailsProviderProtocol {
})
}
}
func displayNameForUserId(_ userId: String) -> String? {
self.memberDisplayNames[userId]
}
func displayNameForUserId(_ userId: String, completion: @escaping (Result<String?, MemberDetailsProviderError>) -> Void) {
guard let roomProxy = roomProxy else {
return
}
if let avatarURL = displayNameForUserId(userId) {
completion(.success(avatarURL))
}
processingQueue.async {
roomProxy.displayNameForUserId(userId, completion: { [weak self] result in
guard let self = self else {
return
}
switch result {
case .success(let displayName):
DispatchQueue.main.async {
self.memberDisplayNames[userId] = displayName
completion(.success(displayName))
}
case .failure:
DispatchQueue.main.async {
completion(.failure(.failedRetrievingUserDisplayName))
}
}
})
}
}
}
@@ -11,9 +11,13 @@ import Foundation
enum MemberDetailsProviderError: Error {
case invalidRoomProxy
case failedRetrievingUserAvatarURL
case failedRetrievingUserDisplayName
}
protocol MemberDetailsProviderProtocol {
func avatarURLForUserId(_ userId: String) -> String?
func avatarURLForUserId(_ userId: String, completion: @escaping (Result<String?, MemberDetailsProviderError>) -> Void)
func displayNameForUserId(_ userId: String) -> String?
func displayNameForUserId(_ userId: String, completion: @escaping (Result<String?, MemberDetailsProviderError>) -> Void)
}
@@ -26,7 +26,7 @@ struct MockRoomProxy: RoomProxyProtocol {
var callbacks = PassthroughSubject<RoomProxyCallback, Never>()
func loadDisplayName(_ completion: @escaping (Result<String, RoomProxyError>) -> Void) {
func displayName(_ completion: @escaping (Result<String, RoomProxyError>) -> Void) {
completion(.success(displayName))
}
@@ -41,4 +41,8 @@ struct MockRoomProxy: RoomProxyProtocol {
func avatarURLForUserId(_ userId: String, completion: @escaping (Result<String?, RoomProxyError>) -> Void) {
}
func displayNameForUserId(_ userId: String, completion: @escaping (Result<String?, RoomProxyError>) -> Void) {
}
}
+18 -2
View File
@@ -100,13 +100,29 @@ class RoomProxy: RoomProxyProtocol, Equatable {
}
} catch {
DispatchQueue.main.async {
completion(.failure(RoomProxyError.failedRetrievingDisplayName))
completion(.failure(RoomProxyError.failedRetrievingMemberAvatarURL))
}
}
}
}
func loadDisplayName(_ completion: @escaping (Result<String, RoomProxyError>) -> Void) {
func displayNameForUserId(_ userId: String, completion: @escaping (Result<String?, RoomProxyError>) -> Void) {
processingQueue.async {
do {
let displayName = try self.room.memberDisplayName(userId: userId)
DispatchQueue.main.async {
completion(.success(displayName))
}
} catch {
DispatchQueue.main.async {
completion(.failure(RoomProxyError.failedRetrievingMemberDisplayName))
}
}
}
}
func displayName(_ completion: @escaping (Result<String, RoomProxyError>) -> Void) {
processingQueue.async {
do {
let displayName = try self.room.displayName()
@@ -12,6 +12,8 @@ enum RoomProxyError: Error {
case failedRetrievingDisplayName
case failedRetrievingAvatar
case backwardStreamNotAvailable
case failedRetrievingMemberAvatarURL
case failedRetrievingMemberDisplayName
}
enum RoomProxyCallback {
@@ -33,9 +35,11 @@ protocol RoomProxyProtocol {
var avatarURL: String? { get }
func displayName(_ completion: @escaping (Result<String, RoomProxyError>) -> Void)
func avatarURLForUserId(_ userId: String, completion: @escaping (Result<String?, RoomProxyError>) -> Void)
func loadDisplayName(_ completion: @escaping (Result<String, RoomProxyError>) -> Void)
func displayNameForUserId(_ userId: String, completion: @escaping (Result<String?, RoomProxyError>) -> Void)
func paginateBackwards(count: UInt, callback: ((Result<[RoomMessageProtocol], RoomProxyError>) -> Void)?)