mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Fix room avatars on timeline (#213)
This commit is contained in:
@@ -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> {
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user