Fix room avatars on timeline (#213)

This commit is contained in:
ismailgulek
2022-09-23 17:52:08 +03:00
committed by GitHub
parent dab23c23e7
commit 5772fae6ff
9 changed files with 43 additions and 13 deletions
+2 -1
View File
@@ -369,8 +369,9 @@ class AppCoordinator: Coordinator {
roomProxy: roomProxy) roomProxy: roomProxy)
let parameters = RoomScreenCoordinatorParameters(timelineController: timelineController, let parameters = RoomScreenCoordinatorParameters(timelineController: timelineController,
mediaProvider: userSession.mediaProvider,
roomName: roomProxy.displayName ?? roomProxy.name, roomName: roomProxy.displayName ?? roomProxy.name,
roomAvatar: userSession.mediaProvider.imageFromURLString(roomProxy.avatarURL, avatarSize: .room(on: .timeline))) roomAvatarUrl: roomProxy.avatarURL)
let coordinator = RoomScreenCoordinator(parameters: parameters) let coordinator = RoomScreenCoordinator(parameters: parameters)
add(childCoordinator: coordinator) add(childCoordinator: coordinator)
@@ -18,8 +18,9 @@ import SwiftUI
struct RoomScreenCoordinatorParameters { struct RoomScreenCoordinatorParameters {
let timelineController: RoomTimelineControllerProtocol let timelineController: RoomTimelineControllerProtocol
let mediaProvider: MediaProviderProtocol
let roomName: String? let roomName: String?
let roomAvatar: UIImage? let roomAvatarUrl: String?
} }
final class RoomScreenCoordinator: Coordinator, Presentable { final class RoomScreenCoordinator: Coordinator, Presentable {
@@ -43,8 +44,9 @@ final class RoomScreenCoordinator: Coordinator, Presentable {
let viewModel = RoomScreenViewModel(timelineController: parameters.timelineController, let viewModel = RoomScreenViewModel(timelineController: parameters.timelineController,
timelineViewFactory: RoomTimelineViewFactory(), timelineViewFactory: RoomTimelineViewFactory(),
mediaProvider: parameters.mediaProvider,
roomName: parameters.roomName, roomName: parameters.roomName,
roomAvatar: parameters.roomAvatar) roomAvatarUrl: parameters.roomAvatarUrl)
let view = RoomScreen(context: viewModel.context) let view = RoomScreen(context: viewModel.context)
roomScreenViewModel = viewModel roomScreenViewModel = viewModel
@@ -25,20 +25,23 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
private let timelineController: RoomTimelineControllerProtocol private let timelineController: RoomTimelineControllerProtocol
private let timelineViewFactory: RoomTimelineViewFactoryProtocol private let timelineViewFactory: RoomTimelineViewFactoryProtocol
private let mediaProvider: MediaProviderProtocol
// MARK: - Setup // MARK: - Setup
init(timelineController: RoomTimelineControllerProtocol, init(timelineController: RoomTimelineControllerProtocol,
timelineViewFactory: RoomTimelineViewFactoryProtocol, timelineViewFactory: RoomTimelineViewFactoryProtocol,
mediaProvider: MediaProviderProtocol,
roomName: String?, roomName: String?,
roomAvatar: UIImage? = nil, roomAvatarUrl: String? = nil,
roomEncryptionBadge: UIImage? = nil) { roomEncryptionBadge: UIImage? = nil) {
self.timelineController = timelineController self.timelineController = timelineController
self.timelineViewFactory = timelineViewFactory self.timelineViewFactory = timelineViewFactory
self.mediaProvider = mediaProvider
super.init(initialViewState: RoomScreenViewState(roomId: timelineController.roomId, super.init(initialViewState: RoomScreenViewState(roomId: timelineController.roomId,
roomTitle: roomName ?? "Unknown room 💥", roomTitle: roomName ?? "Unknown room 💥",
roomAvatar: roomAvatar, roomAvatar: nil,
roomEncryptionBadge: roomEncryptionBadge, roomEncryptionBadge: roomEncryptionBadge,
bindings: .init(composerText: "", composerFocused: false))) bindings: .init(composerText: "", composerFocused: false)))
@@ -64,6 +67,15 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
state.contextMenuBuilder = buildContexMenuForItemId(_:) state.contextMenuBuilder = buildContexMenuForItemId(_:)
buildTimelineViews() buildTimelineViews()
if let roomAvatarUrl = roomAvatarUrl {
Task {
if case let .success(avatar) = await mediaProvider.loadImageFromURLString(roomAvatarUrl,
avatarSize: .room(on: .timeline)) {
state.roomAvatar = avatar
}
}
}
} }
// MARK: - Public // MARK: - Public
@@ -72,8 +72,9 @@ struct RoomHeaderView_Previews: PreviewProvider {
static var bodyPlain: some View { static var bodyPlain: some View {
let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(), let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(),
timelineViewFactory: RoomTimelineViewFactory(), timelineViewFactory: RoomTimelineViewFactory(),
mediaProvider: MockMediaProvider(),
roomName: "Some Room name", roomName: "Some Room name",
roomAvatar: Asset.Images.appLogo.image) roomAvatarUrl: "mock_url")
RoomHeaderView(context: viewModel.context) RoomHeaderView(context: viewModel.context)
.previewLayout(.sizeThatFits) .previewLayout(.sizeThatFits)
@@ -84,8 +85,9 @@ struct RoomHeaderView_Previews: PreviewProvider {
static var bodyEncrypted: some View { static var bodyEncrypted: some View {
let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(), let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(),
timelineViewFactory: RoomTimelineViewFactory(), timelineViewFactory: RoomTimelineViewFactory(),
mediaProvider: MockMediaProvider(),
roomName: "Some Room name", roomName: "Some Room name",
roomAvatar: nil, roomAvatarUrl: nil,
roomEncryptionBadge: Asset.Images.encryptionTrusted.image) roomEncryptionBadge: Asset.Images.encryptionTrusted.image)
RoomHeaderView(context: viewModel.context) RoomHeaderView(context: viewModel.context)
@@ -64,6 +64,7 @@ struct RoomScreen_Previews: PreviewProvider {
static var body: some View { static var body: some View {
let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(), let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(),
timelineViewFactory: RoomTimelineViewFactory(), timelineViewFactory: RoomTimelineViewFactory(),
mediaProvider: MockMediaProvider(),
roomName: "Preview room") roomName: "Preview room")
NavigationView { NavigationView {
@@ -172,6 +172,7 @@ struct TimelineItemList_Previews: PreviewProvider {
static var body: some View { static var body: some View {
let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(), let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(),
timelineViewFactory: RoomTimelineViewFactory(), timelineViewFactory: RoomTimelineViewFactory(),
mediaProvider: MockMediaProvider(),
roomName: nil) roomName: nil)
TimelineItemList(bottomVisiblePublisher: PassthroughSubject(), scrollToBottomPublisher: PassthroughSubject()) TimelineItemList(bottomVisiblePublisher: PassthroughSubject(), scrollToBottomPublisher: PassthroughSubject())
@@ -59,6 +59,7 @@ struct TimelineView_Previews: PreviewProvider {
static var body: some View { static var body: some View {
let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(), let viewModel = RoomScreenViewModel(timelineController: MockRoomTimelineController(),
timelineViewFactory: RoomTimelineViewFactory(), timelineViewFactory: RoomTimelineViewFactory(),
mediaProvider: MockMediaProvider(),
roomName: nil) roomName: nil)
TimelineView() TimelineView()
@@ -27,11 +27,19 @@ struct MockMediaProvider: MediaProviderProtocol {
} }
func imageFromURLString(_ urlString: String?, avatarSize: AvatarSize?) -> UIImage? { func imageFromURLString(_ urlString: String?, avatarSize: AvatarSize?) -> UIImage? {
if urlString != nil { guard urlString != nil else {
return UIImage(systemName: "photo") return nil
} }
return nil if let avatarSize = avatarSize {
switch avatarSize {
case .room:
return Asset.Images.appLogo.image
default:
return UIImage(systemName: "photo")
}
}
return UIImage(systemName: "photo")
} }
func loadImageFromURLString(_ urlString: String, avatarSize: AvatarSize?) async -> Result<UIImage, MediaProviderError> { func loadImageFromURLString(_ urlString: String, avatarSize: AvatarSize?) async -> Result<UIImage, MediaProviderError> {
+4 -2
View File
@@ -116,13 +116,15 @@ class MockScreen: Identifiable {
return SplashScreenCoordinator() return SplashScreenCoordinator()
case .roomPlainNoAvatar: case .roomPlainNoAvatar:
let parameters = RoomScreenCoordinatorParameters(timelineController: MockRoomTimelineController(), let parameters = RoomScreenCoordinatorParameters(timelineController: MockRoomTimelineController(),
mediaProvider: MockMediaProvider(),
roomName: "Some room name", roomName: "Some room name",
roomAvatar: nil) roomAvatarUrl: nil)
return RoomScreenCoordinator(parameters: parameters) return RoomScreenCoordinator(parameters: parameters)
case .roomEncryptedWithAvatar: case .roomEncryptedWithAvatar:
let parameters = RoomScreenCoordinatorParameters(timelineController: MockRoomTimelineController(), let parameters = RoomScreenCoordinatorParameters(timelineController: MockRoomTimelineController(),
mediaProvider: MockMediaProvider(),
roomName: "Some room name", roomName: "Some room name",
roomAvatar: Asset.Images.appLogo.image) roomAvatarUrl: "mock_url")
return RoomScreenCoordinator(parameters: parameters) return RoomScreenCoordinator(parameters: parameters)
case .sessionVerification: case .sessionVerification:
let parameters = SessionVerificationCoordinatorParameters(sessionVerificationControllerProxy: MockSessionVerificationControllerProxy()) let parameters = SessionVerificationCoordinatorParameters(sessionVerificationControllerProxy: MockSessionVerificationControllerProxy())