Correctly building image items for the timeline. Missing URL and way to load image.

This commit is contained in:
Stefan Ceriu
2022-03-16 18:01:42 +02:00
parent 439f09095a
commit 30378ae6a9
13 changed files with 83 additions and 31 deletions
@@ -12,14 +12,20 @@ import MatrixRustSDK
class RoomTimelineController: RoomTimelineControllerProtocol {
private let timelineProvider: RoomTimelineProvider
private let timelineItemFactory: TimelineItemFactory
private let timelineViewFactory: TimelineViewFactory
private var cancellables = Set<AnyCancellable>()
let callbacks = PassthroughSubject<RoomTimelineControllerCallback, Never>()
private(set) var timelineItems = [RoomTimelineViewProvider]()
init(timelineProvider: RoomTimelineProvider) {
init(timelineProvider: RoomTimelineProvider,
timelineItemFactory: TimelineItemFactory,
timelineViewFactory: TimelineViewFactory) {
self.timelineProvider = timelineProvider
self.timelineItemFactory = timelineItemFactory
self.timelineViewFactory = timelineViewFactory
self.timelineProvider.callbacks.sink { [weak self] callback in
guard let self = self else { return }
@@ -63,13 +69,8 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
let areMessagesFromTheSameSender = (previousMessage?.sender == message.sender)
let shouldShowSenderDetails = !areMessagesFromTheSameSender || !areMessagesFromTheSameDay
let item = TextRoomTimelineItem(id: message.id,
senderDisplayName: message.sender,
text: message.content,
timestamp: message.originServerTs.formatted(date: .omitted, time: .shortened),
shouldShowSenderDetails: shouldShowSenderDetails)
newTimelineItems.append(RoomTimelineViewProvider.text(item))
let timelineItem = timelineItemFactory.buildTimelineItemFor(message, showSenderDetails: shouldShowSenderDetails)
newTimelineItems.append(timelineViewFactory.buildTimelineViewFor(timelineItem))
previousMessage = message
}
@@ -8,7 +8,10 @@
import Foundation
struct ImageRoomTimelineItem: Identifiable, Equatable {
struct ImageRoomTimelineItem: TimelineItemProtocol, Identifiable, Equatable {
let id: String
let senderDisplayName: String
let text: String
let timestamp: String
let shouldShowSenderDetails: Bool
}
@@ -17,7 +17,10 @@ struct ImageRoomTimelineView: View {
if let loadedImage = loadedImage {
Image(uiImage: loadedImage)
} else {
ProgressView()
VStack {
Image(systemName: "photo")
ProgressView()
}
}
}
}
@@ -8,7 +8,7 @@
import Foundation
struct SeparatorRoomTimelineItem: Identifiable, Equatable {
struct SeparatorRoomTimelineItem: TimelineItemProtocol, Identifiable, Equatable {
let id: String
let text: String
}
@@ -8,7 +8,7 @@
import Foundation
struct TextRoomTimelineItem: Identifiable, Equatable {
struct TextRoomTimelineItem: TimelineItemProtocol, Identifiable, Equatable {
let id: String
let senderDisplayName: String
let text: String
@@ -9,7 +9,22 @@
import Foundation
struct TimelineItemFactory {
func buildTimelineItemFor(_ message: RoomMessageProtocol) {
func buildTimelineItemFor(_ roomMessage: RoomMessageProtocol, showSenderDetails: Bool) -> TimelineItemProtocol {
switch roomMessage {
case let message as TextRoomMessage:
return TextRoomTimelineItem(id: message.id,
senderDisplayName: message.sender,
text: message.content,
timestamp: message.originServerTs.formatted(date: .omitted, time: .shortened),
shouldShowSenderDetails: showSenderDetails)
case let message as ImageRoomMessage:
return ImageRoomTimelineItem(id: message.id,
senderDisplayName: message.sender,
text: message.content,
timestamp: message.originServerTs.formatted(date: .omitted, time: .shortened),
shouldShowSenderDetails: showSenderDetails)
default:
fatalError("Unknown room message.")
}
}
}
@@ -0,0 +1,13 @@
//
// TimelineItemProtocol.swift
// ElementX
//
// Created by Stefan Ceriu on 16/03/2022.
// Copyright © 2022 Element. All rights reserved.
//
import Foundation
protocol TimelineItemProtocol {
}
@@ -0,0 +1,22 @@
//
// TimelineViewFactory.swift
// ElementX
//
// Created by Stefan Ceriu on 16/03/2022.
// Copyright © 2022 Element. All rights reserved.
//
import Foundation
struct TimelineViewFactory {
func buildTimelineViewFor(_ timelineItem: TimelineItemProtocol) -> RoomTimelineViewProvider {
switch timelineItem {
case let textItem as TextRoomTimelineItem:
return .text(textItem)
case let imageItem as ImageRoomTimelineItem:
return .image(imageItem)
default:
fatalError("Unknown timeline item")
}
}
}