mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Introduced MemberDetailsProvider, caching user avatar urls and images. Various other tweaks and improvements.
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
//
|
||||
// MemberDetailsProvider.swift
|
||||
// ElementX
|
||||
//
|
||||
// Created by Stefan Ceriu on 18/03/2022.
|
||||
// Copyright © 2022 Element. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
enum MemberDetailsProviderError: Error {
|
||||
case invalidRoomProxy
|
||||
case failedRetrievingUserAvatarURL
|
||||
}
|
||||
|
||||
class MemberDetailsProvider {
|
||||
private let roomProxy: RoomProxyProtocol?
|
||||
private let processingQueue = DispatchQueue(label: "MemberDetailsProviderProcessingQueue")
|
||||
private var memberAvatars = [String: String]()
|
||||
|
||||
init(roomProxy: RoomProxyProtocol) {
|
||||
self.roomProxy = roomProxy
|
||||
}
|
||||
|
||||
func avatarURLForUserId(_ userId: String) -> String? {
|
||||
self.memberAvatars[userId]
|
||||
}
|
||||
|
||||
func avatarURLForUserId(_ userId: String, completion: @escaping (Result<String?, MemberDetailsProviderError>) -> Void) {
|
||||
guard let roomProxy = roomProxy else {
|
||||
return
|
||||
}
|
||||
|
||||
if let avatarURL = avatarURLForUserId(userId) {
|
||||
completion(.success(avatarURL))
|
||||
}
|
||||
|
||||
processingQueue.async {
|
||||
roomProxy.avatarURLForUserId(userId, completion: { [weak self] result in
|
||||
guard let self = self else {
|
||||
return
|
||||
}
|
||||
|
||||
switch result {
|
||||
case .success(let avatarURL):
|
||||
DispatchQueue.main.async {
|
||||
self.memberAvatars[userId] = avatarURL
|
||||
completion(.success(avatarURL))
|
||||
}
|
||||
case .failure:
|
||||
DispatchQueue.main.async {
|
||||
completion(.failure(.failedRetrievingUserAvatarURL))
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -91,7 +91,7 @@ class RoomProxy: RoomProxyProtocol, Equatable {
|
||||
}
|
||||
|
||||
func avatarURLForUserId(_ userId: String, completion: @escaping (Result<String?, RoomProxyError>) -> Void) {
|
||||
DispatchQueue.global(qos: .background).async {
|
||||
processingQueue.async {
|
||||
do {
|
||||
let avatarURL = try self.room.memberAvatarUrl(userId: userId)
|
||||
|
||||
@@ -107,7 +107,7 @@ class RoomProxy: RoomProxyProtocol, Equatable {
|
||||
}
|
||||
|
||||
func loadDisplayName(_ completion: @escaping (Result<String, RoomProxyError>) -> Void) {
|
||||
DispatchQueue.global(qos: .background).async {
|
||||
processingQueue.async {
|
||||
do {
|
||||
let displayName = try self.room.displayName()
|
||||
|
||||
@@ -123,7 +123,6 @@ class RoomProxy: RoomProxyProtocol, Equatable {
|
||||
}
|
||||
|
||||
func paginateBackwards(count: UInt, callback: ((Result<[RoomMessageProtocol], RoomProxyError>) -> Void)?) {
|
||||
MXLog.debug("Started backpaginating")
|
||||
processingQueue.async {
|
||||
guard let backwardStream = self.backwardStream else {
|
||||
DispatchQueue.main.async {
|
||||
@@ -136,8 +135,6 @@ class RoomProxy: RoomProxyProtocol, Equatable {
|
||||
self.messageFactory.buildRoomMessageFrom(message)
|
||||
}
|
||||
|
||||
MXLog.debug("Finished backpaginating")
|
||||
|
||||
DispatchQueue.main.async {
|
||||
callback?(.success(messages))
|
||||
if self.lastMessage == nil {
|
||||
|
||||
Reference in New Issue
Block a user