diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 19eb4b7ff..2ce10d515 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 1850257127B6A135002E6B18 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1850256927B6A135002E6B18 /* LaunchScreen.storyboard */; }; 1863A3FC27BA5A9100B52E4D /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = 1863A3FB27BA5A9100B52E4D /* KeychainAccess */; }; 1863A40627BA6DFC00B52E4D /* SwiftyBeaver in Frameworks */ = {isa = PBXBuildFile; productRef = 1863A40527BA6DFC00B52E4D /* SwiftyBeaver */; }; + 186AD17D27F72E5200048C8E /* MemberDetailProviderManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 186AD17C27F72E5200048C8E /* MemberDetailProviderManager.swift */; }; 18920C0E27F233FF00A717B5 /* NoticeRoomMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18920C0C27F233FF00A717B5 /* NoticeRoomMessage.swift */; }; 18920C0F27F233FF00A717B5 /* EmoteRoomMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18920C0D27F233FF00A717B5 /* EmoteRoomMessage.swift */; }; 18920C1227F2347600A717B5 /* NoticeRoomTimelineItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18920C1027F2347600A717B5 /* NoticeRoomTimelineItem.swift */; }; @@ -166,6 +167,7 @@ 1850256727B6A135002E6B18 /* ElementX.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = ElementX.entitlements; sourceTree = ""; }; 1850256827B6A135002E6B18 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 1850256A27B6A135002E6B18 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 186AD17C27F72E5200048C8E /* MemberDetailProviderManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemberDetailProviderManager.swift; sourceTree = ""; }; 18920C0C27F233FF00A717B5 /* NoticeRoomMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoticeRoomMessage.swift; sourceTree = ""; }; 18920C0D27F233FF00A717B5 /* EmoteRoomMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmoteRoomMessage.swift; sourceTree = ""; }; 18920C1027F2347600A717B5 /* NoticeRoomTimelineItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoticeRoomTimelineItem.swift; sourceTree = ""; }; @@ -487,6 +489,7 @@ children = ( 183E023327E4A73C00903BED /* MemberDetailsProviderProtocol.swift */, 18DF7C5227E4754500291672 /* MemberDetailsProvider.swift */, + 186AD17C27F72E5200048C8E /* MemberDetailProviderManager.swift */, ); path = Members; sourceTree = ""; @@ -955,6 +958,7 @@ 189E496527F4777400D86BA3 /* NoticeRoomTimelineView.swift in Sources */, 18F2BAED27D25B4000DD1988 /* FullscreenLoadingActivityPresenter.swift in Sources */, 18DF7C4127E4670600291672 /* RoomTimelineViewProvider.swift in Sources */, + 186AD17D27F72E5200048C8E /* MemberDetailProviderManager.swift in Sources */, 18F2BB0F27D25B4000DD1988 /* RoomScreen.swift in Sources */, 18F2BAFF27D25B4000DD1988 /* HomeScreenModels.swift in Sources */, 183E023427E4A73C00903BED /* MemberDetailsProviderProtocol.swift in Sources */, diff --git a/ElementX/Sources/AppCoordinator.swift b/ElementX/Sources/AppCoordinator.swift index 855fa6120..d2563ed69 100644 --- a/ElementX/Sources/AppCoordinator.swift +++ b/ElementX/Sources/AppCoordinator.swift @@ -18,6 +18,8 @@ class AppCoordinator: AuthenticationCoordinatorDelegate, Coordinator { private let keychainController: KeychainControllerProtocol private let authenticationCoordinator: AuthenticationCoordinator! + private let memberDetailProviderManager: MemberDetailProviderManager + private var loadingActivity: Activity? private var errorActivity: Activity? @@ -31,6 +33,8 @@ class AppCoordinator: AuthenticationCoordinatorDelegate, Coordinator { navigationRouter = NavigationRouter(navigationController: mainNavigationController) + memberDetailProviderManager = MemberDetailProviderManager() + guard let bundleIdentifier = Bundle.main.bundleIdentifier else { fatalError("Should have a valid bundle identifier at this point") } @@ -82,8 +86,8 @@ class AppCoordinator: AuthenticationCoordinatorDelegate, Coordinator { let parameters = HomeScreenCoordinatorParameters(userSession: userSession, mediaProvider: userSession.mediaProvider, - eventBriefFactory: EventBriefFactory(), - attributedStringBuilder: AttributedStringBuilder()) + attributedStringBuilder: AttributedStringBuilder(), + memberDetailProviderManager: memberDetailProviderManager) let coordinator = HomeScreenCoordinator(parameters: parameters) coordinator.completion = { [weak self] result in @@ -109,16 +113,16 @@ class AppCoordinator: AuthenticationCoordinatorDelegate, Coordinator { return } - let memberDetailsProvider = MemberDetailsProvider(roomProxy: roomProxy) + let memberDetailProvider = memberDetailProviderManager.memberDetailProviderForRoomProxy(roomProxy) let timelineItemFactory = RoomTimelineItemFactory(mediaProvider: userSession.mediaProvider, - memberDetailsProvider: memberDetailsProvider, + memberDetailProvider: memberDetailProvider, attributedStringBuilder: AttributedStringBuilder()) let timelineController = RoomTimelineController(timelineProvider: RoomTimelineProvider(roomProxy: roomProxy), timelineItemFactory: timelineItemFactory, mediaProvider: userSession.mediaProvider, - memberDetailsProvider: memberDetailsProvider) + memberDetailProvider: memberDetailProvider) let parameters = RoomScreenCoordinatorParameters(timelineController: timelineController, roomName: roomProxy.name) diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenCoordinator.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenCoordinator.swift index 8b4f5bfaf..21fc8039d 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenCoordinator.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenCoordinator.swift @@ -20,8 +20,8 @@ import Combine struct HomeScreenCoordinatorParameters { let userSession: UserSession let mediaProvider: MediaProviderProtocol - let eventBriefFactory: EventBriefFactoryProtocol let attributedStringBuilder: AttributedStringBuilderProtocol + let memberDetailProviderManager: MemberDetailProviderManager } enum HomeScreenCoordinatorResult { @@ -96,14 +96,20 @@ final class HomeScreenCoordinator: Coordinator, Presentable { // MARK: - Private func updateRoomsList() { - self.roomSummaries = parameters.userSession.rooms.map { roomProxy in + self.roomSummaries = parameters.userSession.rooms.compactMap { roomProxy in + guard !roomProxy.isSpace, !roomProxy.isTombstoned else { + return nil + } + if let summary = self.roomSummaries.first(where: { $0.id == roomProxy.id }) { return summary } + let memberDetailProvider = parameters.memberDetailProviderManager.memberDetailProviderForRoomProxy(roomProxy) + return RoomSummary(roomProxy: roomProxy, mediaProvider: parameters.mediaProvider, - eventBriefFactory: parameters.eventBriefFactory) + eventBriefFactory: EventBriefFactory(memberDetailProvider: memberDetailProvider)) } self.viewModel.updateWithRoomList(roomSummaries) diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift index b72fc0745..7f9cef32c 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift @@ -36,27 +36,19 @@ struct HomeScreenViewState: BindableState { var isLoadingRooms: Bool = false var unencryptedDMs: [HomeScreenRoom] { - Array(sortedRooms.filter { $0.isDirect && !$0.isEncrypted }) + Array(rooms.filter { $0.isDirect && !$0.isEncrypted }) } var encryptedDMs: [HomeScreenRoom] { - Array(sortedRooms.filter { $0.isDirect && $0.isEncrypted}) + Array(rooms.filter { $0.isDirect && $0.isEncrypted}) } var unencryptedRooms: [HomeScreenRoom] { - Array(sortedRooms.filter { !$0.isDirect && !$0.isEncrypted }) + Array(rooms.filter { !$0.isDirect && !$0.isEncrypted }) } var encryptedRooms: [HomeScreenRoom] { - Array(sortedRooms.filter { !$0.isDirect && $0.isEncrypted }) - } - - private var filteredRooms: [HomeScreenRoom] { - rooms.filter { !$0.isSpace && !$0.isTombstoned } - } - - private var sortedRooms: [HomeScreenRoom] { - filteredRooms.sorted(by: { ($0.displayName ?? $0.id).lowercased() < ($1.displayName ?? $1.id).lowercased() }) + Array(rooms.filter { !$0.isDirect && $0.isEncrypted }) } } diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift index 2337e6eba..deea95f63 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift @@ -113,12 +113,11 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol } private func buildOrUpdateRoomFromSummary(_ roomSummary: RoomSummaryProtocol) -> HomeScreenRoom { - let lastMessage = lastMessageFromEventBrief(roomSummary.lastMessage) guard var room = self.state.rooms.first(where: { $0.id == roomSummary.id }) else { return HomeScreenRoom(id: roomSummary.id, - displayName: roomSummary.name, + displayName: roomSummary.displayName ?? roomSummary.name, topic: roomSummary.topic, lastMessage: lastMessage, avatar: roomSummary.avatar, @@ -140,11 +139,17 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol return nil } + let senderDisplayName = senderDisplayNameForBrief(eventBrief) + if let htmlBody = eventBrief.htmlBody, let lastMessageAttributedString = attributedStringBuilder.fromHTML(htmlBody) { - return "\(eventBrief.senderName): \(String(lastMessageAttributedString.characters))" + return "\(senderDisplayName): \(String(lastMessageAttributedString.characters))" } else { - return "\(eventBrief.senderName): \(eventBrief.body)" + return "\(senderDisplayName): \(eventBrief.body)" } } + + private func senderDisplayNameForBrief(_ brief: EventBrief) -> String { + brief.senderDisplayName ?? brief.senderId + } } diff --git a/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift b/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift index 1c34008a6..67d15aff2 100644 --- a/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift +++ b/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift @@ -115,23 +115,23 @@ struct RoomCell: View { .frame(width: 40, height: 40) } - VStack(alignment: .leading, spacing: 4.0) { + VStack(alignment: .leading, spacing: 2.0) { Text(roomName(room)) - .font(.headline) - .fontWeight(.regular) + .foregroundStyle(.primary) if let roomTopic = room.topic, roomTopic.count > 0 { Text(roomTopic) - .font(.footnote) - .fontWeight(.bold) + .font(.footnote.weight(.semibold)) .lineLimit(1) + .foregroundStyle(.secondary) } if let lastMessage = room.lastMessage { Text(lastMessage) - .font(.footnote) - .fontWeight(.medium) + .font(.callout) .lineLimit(1) + .foregroundStyle(.secondary) + .padding(.top, 2) } } } @@ -156,9 +156,16 @@ struct HomeScreen_Previews: PreviewProvider { mediaProvider: MockMediaProvider(), attributedStringBuilder: AttributedStringBuilder()) - let rooms = [MockRoomSummary(displayName: "Alpha"), + let eventBrief = EventBrief(eventId: "id", + senderId: "senderId", + senderDisplayName: "Sender", + body: "Some message", + htmlBody: nil, + date: .now) + + let rooms = [MockRoomSummary(topic: "Topic", displayName: "Alpha"), MockRoomSummary(displayName: "Beta"), - MockRoomSummary(displayName: "Omega")] + MockRoomSummary(displayName: "Omega", lastMessage: eventBrief)] viewModel.updateWithRoomList(rooms) diff --git a/ElementX/Sources/Services/Room/Members/MemberDetailProviderManager.swift b/ElementX/Sources/Services/Room/Members/MemberDetailProviderManager.swift new file mode 100644 index 000000000..c3a7218e1 --- /dev/null +++ b/ElementX/Sources/Services/Room/Members/MemberDetailProviderManager.swift @@ -0,0 +1,24 @@ +// +// MemberDetailProviderManager.swift +// ElementX +// +// Created by Stefan Ceriu on 01/04/2022. +// Copyright © 2022 Element. All rights reserved. +// + +import Foundation + +class MemberDetailProviderManager { + + private var memberDetailProviders: [String: MemberDetailProviderProtocol] = [:] + + func memberDetailProviderForRoomProxy(_ roomProxy: RoomProxyProtocol) -> MemberDetailProviderProtocol { + if let memberDetailProvider = memberDetailProviders[roomProxy.id] { + return memberDetailProvider + } + + let memberDetailProvider = MemberDetailProvider(roomProxy: roomProxy) + memberDetailProviders[roomProxy.id] = memberDetailProvider + return memberDetailProvider + } +} diff --git a/ElementX/Sources/Services/Room/Members/MemberDetailsProvider.swift b/ElementX/Sources/Services/Room/Members/MemberDetailsProvider.swift index 26a7fc4ca..3bab47903 100644 --- a/ElementX/Sources/Services/Room/Members/MemberDetailsProvider.swift +++ b/ElementX/Sources/Services/Room/Members/MemberDetailsProvider.swift @@ -1,5 +1,5 @@ // -// MemberDetailsProvider.swift +// MemberDetailProvider.swift // ElementX // // Created by Stefan Ceriu on 18/03/2022. @@ -8,7 +8,7 @@ import Foundation -class MemberDetailsProvider: MemberDetailsProviderProtocol { +class MemberDetailProvider: MemberDetailProviderProtocol { private let roomProxy: RoomProxyProtocol? private var memberAvatars = [String: String]() private var memberDisplayNames = [String: String]() @@ -21,7 +21,7 @@ class MemberDetailsProvider: MemberDetailsProviderProtocol { self.memberAvatars[userId] } - func avatarURLForUserId(_ userId: String, completion: @escaping (Result) -> Void) { + func avatarURLForUserId(_ userId: String, completion: @escaping (Result) -> Void) { guard let roomProxy = roomProxy else { return } @@ -49,7 +49,7 @@ class MemberDetailsProvider: MemberDetailsProviderProtocol { self.memberDisplayNames[userId] } - func displayNameForUserId(_ userId: String, completion: @escaping (Result) -> Void) { + func displayNameForUserId(_ userId: String, completion: @escaping (Result) -> Void) { guard let roomProxy = roomProxy else { return } diff --git a/ElementX/Sources/Services/Room/Members/MemberDetailsProviderProtocol.swift b/ElementX/Sources/Services/Room/Members/MemberDetailsProviderProtocol.swift index b42590f46..219f5a859 100644 --- a/ElementX/Sources/Services/Room/Members/MemberDetailsProviderProtocol.swift +++ b/ElementX/Sources/Services/Room/Members/MemberDetailsProviderProtocol.swift @@ -1,5 +1,5 @@ // -// MemberDetailsProviderProtocol.swift +// MemberDetailProviderProtocol.swift // ElementX // // Created by Stefan Ceriu on 18/03/2022. @@ -8,16 +8,16 @@ import Foundation -enum MemberDetailsProviderError: Error { +enum MemberDetailProviderError: Error { case invalidRoomProxy case failedRetrievingUserAvatarURL case failedRetrievingUserDisplayName } -protocol MemberDetailsProviderProtocol { +protocol MemberDetailProviderProtocol { func avatarURLForUserId(_ userId: String) -> String? - func avatarURLForUserId(_ userId: String, completion: @escaping (Result) -> Void) + func avatarURLForUserId(_ userId: String, completion: @escaping (Result) -> Void) func displayNameForUserId(_ userId: String) -> String? - func displayNameForUserId(_ userId: String, completion: @escaping (Result) -> Void) + func displayNameForUserId(_ userId: String, completion: @escaping (Result) -> Void) } diff --git a/ElementX/Sources/Services/Room/RoomSummary/EventBrief.swift b/ElementX/Sources/Services/Room/RoomSummary/EventBrief.swift index cce6b4df7..f41a7d5df 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/EventBrief.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/EventBrief.swift @@ -9,8 +9,9 @@ import Foundation struct EventBrief { - let id: String - let senderName: String + let eventId: String + let senderId: String + let senderDisplayName: String? let body: String let htmlBody: String? let date: Date diff --git a/ElementX/Sources/Services/Room/RoomSummary/EventBriefFactory.swift b/ElementX/Sources/Services/Room/RoomSummary/EventBriefFactory.swift index c37b82e66..8a5725b4a 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/EventBriefFactory.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/EventBriefFactory.swift @@ -10,20 +10,27 @@ import Foundation struct EventBriefFactory: EventBriefFactoryProtocol { - func eventBriefForMessage(_ message: RoomMessageProtocol?) -> EventBrief? { + private let memberDetailProvider: MemberDetailProviderProtocol + + init(memberDetailProvider: MemberDetailProviderProtocol) { + self.memberDetailProvider = memberDetailProvider + } + + func eventBriefForMessage(_ message: RoomMessageProtocol?, completion: @escaping ((EventBrief?) -> Void)) { guard let message = message else { - return nil + completion(nil) + return } switch message { case is ImageRoomMessage: - return nil + completion(nil) case let message as TextRoomMessage: - return buildEventBrief(message: message, htmlBody: message.htmlBody) + buildEventBrief(message: message, htmlBody: message.htmlBody, completion: completion) case let message as NoticeRoomMessage: - return buildEventBrief(message: message, htmlBody: message.htmlBody) + buildEventBrief(message: message, htmlBody: message.htmlBody, completion: completion) case let message as EmoteRoomMessage: - return buildEventBrief(message: message, htmlBody: message.htmlBody) + buildEventBrief(message: message, htmlBody: message.htmlBody, completion: completion) default: fatalError("Unknown room message.") } @@ -31,11 +38,26 @@ struct EventBriefFactory: EventBriefFactoryProtocol { // MARK: - Private - private func buildEventBrief(message: RoomMessageProtocol, htmlBody: String?) -> EventBrief { - return EventBrief(id: message.id, - senderName: message.sender, - body: message.body, - htmlBody: htmlBody, - date: message.originServerTs) + private func buildEventBrief(message: RoomMessageProtocol, htmlBody: String?, completion: @escaping ((EventBrief?) -> Void)) { + memberDetailProvider.displayNameForUserId(message.sender) { result in + switch result { + case .success(let displayName): + completion(EventBrief(eventId: message.id, + senderId: message.sender, + senderDisplayName: displayName, + body: message.body, + htmlBody: htmlBody, + date: message.originServerTs)) + case .failure(let error): + MXLog.error("Failed fetching sender display name with error: \(error)") + + completion(EventBrief(eventId: message.id, + senderId: message.sender, + senderDisplayName: nil, + body: message.body, + htmlBody: htmlBody, + date: message.originServerTs)) + } + } } } diff --git a/ElementX/Sources/Services/Room/RoomSummary/EventBriefFactoryProtocol.swift b/ElementX/Sources/Services/Room/RoomSummary/EventBriefFactoryProtocol.swift index af4baa25a..21f2869af 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/EventBriefFactoryProtocol.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/EventBriefFactoryProtocol.swift @@ -9,5 +9,5 @@ import Foundation protocol EventBriefFactoryProtocol { - func eventBriefForMessage(_ message: RoomMessageProtocol?) -> EventBrief? + func eventBriefForMessage(_ message: RoomMessageProtocol?, completion: @escaping ((EventBrief?) -> Void)) } diff --git a/ElementX/Sources/Services/Room/RoomSummary/RoomSummary.swift b/ElementX/Sources/Services/Room/RoomSummary/RoomSummary.swift index 4bf9d6a6d..690739bdb 100644 --- a/ElementX/Sources/Services/Room/RoomSummary/RoomSummary.swift +++ b/ElementX/Sources/Services/Room/RoomSummary/RoomSummary.swift @@ -71,7 +71,9 @@ class RoomSummary: RoomSummaryProtocol { self.mediaProvider = mediaProvider self.eventBriefFactory = eventBriefFactory - lastMessage = eventBriefFactory.eventBriefForMessage(roomProxy.messages.last) + eventBriefFactory.eventBriefForMessage(roomProxy.messages.last) { [weak self] result in + self?.lastMessage = result + } roomProxy.callbacks.sink { [weak self] callback in guard let self = self else { @@ -80,7 +82,9 @@ class RoomSummary: RoomSummaryProtocol { switch callback { case .updatedMessages: - self.lastMessage = self.eventBriefFactory.eventBriefForMessage(self.roomProxy.messages.last) + self.eventBriefFactory.eventBriefForMessage(self.roomProxy.messages.last) { [weak self] result in + self?.lastMessage = result + } } } .store(in: &roomUpdateListeners) @@ -120,7 +124,9 @@ class RoomSummary: RoomSummaryProtocol { switch result { case .success: - self.lastMessage = self.eventBriefFactory.eventBriefForMessage(self.roomProxy.messages.last) + self.eventBriefFactory.eventBriefForMessage(self.roomProxy.messages.last) { [weak self] result in + self?.lastMessage = result + } case .failure(let error): MXLog.error("Failed back paginating with error: \(error)") } diff --git a/ElementX/Sources/Services/Timeline/RoomTimelineController.swift b/ElementX/Sources/Services/Timeline/RoomTimelineController.swift index eb4a34bf8..ebe42dfca 100644 --- a/ElementX/Sources/Services/Timeline/RoomTimelineController.swift +++ b/ElementX/Sources/Services/Timeline/RoomTimelineController.swift @@ -14,7 +14,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol { private let timelineProvider: RoomTimelineProviderProtocol private let timelineItemFactory: RoomTimelineItemFactory private let mediaProvider: MediaProviderProtocol - private let memberDetailsProvider: MemberDetailsProviderProtocol + private let memberDetailProvider: MemberDetailProviderProtocol private var cancellables = Set() @@ -25,11 +25,11 @@ class RoomTimelineController: RoomTimelineControllerProtocol { init(timelineProvider: RoomTimelineProviderProtocol, timelineItemFactory: RoomTimelineItemFactory, mediaProvider: MediaProviderProtocol, - memberDetailsProvider: MemberDetailsProviderProtocol) { + memberDetailProvider: MemberDetailProviderProtocol) { self.timelineProvider = timelineProvider self.timelineItemFactory = timelineItemFactory self.mediaProvider = mediaProvider - self.memberDetailsProvider = memberDetailsProvider + self.memberDetailProvider = memberDetailProvider self.timelineProvider.callbacks.sink { [weak self] callback in guard let self = self else { return } @@ -152,7 +152,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol { return } - memberDetailsProvider.avatarURLForUserId(timelineItem.senderId) { result in + memberDetailProvider.avatarURLForUserId(timelineItem.senderId) { result in if case let .success(avatarURL) = result, let avatarURL = avatarURL { self.mediaProvider.loadImageFromURL(avatarURL) { result in @@ -176,7 +176,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol { return } - memberDetailsProvider.displayNameForUserId(timelineItem.senderId) { result in + memberDetailProvider.displayNameForUserId(timelineItem.senderId) { result in if case let .success(displayName) = result, let displayName = displayName { guard let index = self.timelineItems.firstIndex(where: { $0.id == timelineItem.id }), diff --git a/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineItemFactory.swift b/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineItemFactory.swift index 6569c9692..cb45400e3 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineItemFactory.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineItemFactory.swift @@ -11,20 +11,20 @@ import UIKit struct RoomTimelineItemFactory { private let mediaProvider: MediaProviderProtocol - private let memberDetailsProvider: MemberDetailsProviderProtocol + private let memberDetailProvider: MemberDetailProviderProtocol private let attributedStringBuilder: AttributedStringBuilderProtocol init(mediaProvider: MediaProviderProtocol, - memberDetailsProvider: MemberDetailsProviderProtocol, + memberDetailProvider: MemberDetailProviderProtocol, attributedStringBuilder: AttributedStringBuilderProtocol) { self.mediaProvider = mediaProvider - self.memberDetailsProvider = memberDetailsProvider + self.memberDetailProvider = memberDetailProvider self.attributedStringBuilder = attributedStringBuilder } func buildTimelineItemFor(_ roomMessage: RoomMessageProtocol, showSenderDetails: Bool) -> RoomTimelineItemProtocol { - let displayName = memberDetailsProvider.displayNameForUserId(roomMessage.sender) - let avatarURL = memberDetailsProvider.avatarURLForUserId(roomMessage.sender) + let displayName = memberDetailProvider.displayNameForUserId(roomMessage.sender) + let avatarURL = memberDetailProvider.avatarURLForUserId(roomMessage.sender) let avatarImage = mediaProvider.imageForURL(avatarURL) switch roomMessage {