Switched to discrete timeline items that directly expose view builders.

This commit is contained in:
Stefan Ceriu
2022-03-11 11:27:08 +02:00
parent 8d4f6f301b
commit d413a67329
11 changed files with 175 additions and 106 deletions
@@ -14,13 +14,20 @@ enum RoomTimelineControllerCallback {
case updatedTimelineItems
}
private var sectionTitleDateFormatter: DateFormatter = {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .long
dateFormatter.timeStyle = .none
return dateFormatter
}()
class RoomTimelineController: RoomTimelineControllerProtocol {
private let timelineProvider: RoomTimelineProvider
private var cancellables = Set<AnyCancellable>()
let callbacks = PassthroughSubject<RoomTimelineControllerCallback, Never>()
private(set) var timelineItems = [RoomTimelineItemProtocol]()
private(set) var timelineItems = [RoomTimelineItem]()
init(timelineProvider: RoomTimelineProvider) {
self.timelineProvider = timelineProvider
@@ -30,13 +37,36 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
switch callback {
case .updatedMessages:
self.timelineItems = self.timelineProvider.messages.map { message in
var newTimelineItems = [RoomTimelineItem]()
var previousMessage: Message?
var previousSender: String?
for message in self.timelineProvider.messages {
let timestamp = Date(timeIntervalSince1970: TimeInterval(message.originServerTs()))
return TextRoomTimelineItem(id: message.id(),
senderDisplayName: message.sender(),
text: message.content(),
originServerTs: timestamp)
let areMessagesFromTheSameDay = self.haveSameDay(lhs: previousMessage, rhs: message)
// let shouldAddSectionHeader = !areMessagesFromTheSameDay
//
// if shouldAddSectionHeader {
// newTimelineItems.append(RoomTimelineItem.sectionTitle(id: message.id(),
// text: sectionTitleDateFormatter.string(from: timestamp)))
// }
let areMessagesFromTheSameSender = previousSender == message.sender()
let shouldShowSenderDetails = !areMessagesFromTheSameSender || !areMessagesFromTheSameDay
newTimelineItems.append(RoomTimelineItem.text(id: message.id(),
senderDisplayName: message.sender(),
text: message.content(),
originServerTs: timestamp,
shouldShowSenderDetails: shouldShowSenderDetails))
previousMessage = message
previousSender = message.sender()
}
self.timelineItems = newTimelineItems
self.callbacks.send(.updatedTimelineItems)
}
}.store(in: &cancellables)
@@ -45,4 +75,18 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
func paginateBackwards(_ count: UInt) {
timelineProvider.paginateBackwards(count)
}
// MARK: - Private
private func haveSameDay(lhs: Message?, rhs: Message?) -> Bool {
guard let lhs = lhs, let rhs = rhs else {
return false
}
let lhsTimestamp = Date(timeIntervalSince1970: TimeInterval(lhs.originServerTs()))
let rhsTimestamp = Date(timeIntervalSince1970: TimeInterval(rhs.originServerTs()))
return Calendar.current.isDate(lhsTimestamp, inSameDayAs: rhsTimestamp)
}
}