From 70790161f1fb00d31c55601d221cc9de9fc51eeb Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Tue, 16 May 2023 15:52:23 +0300 Subject: [PATCH] Start fetching timeline item details directly on creation --- .../RoomTimelineController.swift | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift index 7903ef85b..243520c22 100644 --- a/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift +++ b/ElementX/Sources/Services/Timeline/TimelineController/RoomTimelineController.swift @@ -101,14 +101,8 @@ class RoomTimelineController: RoomTimelineControllerProtocol { return } - // Fetch replied-to event details if unavailable at the point of displaying it in the timeline if let messageTimelineItem = timelineItem as? EventBasedMessageTimelineItemProtocol { - switch messageTimelineItem.replyDetails { - case .notLoaded, .error: - roomProxy.fetchDetails(for: timelineItem.id) - default: - break - } + fetchEventDetails(for: messageTimelineItem, refetchOnError: true) } } @@ -275,7 +269,15 @@ class RoomTimelineController: RoomTimelineControllerProtocol { private func buildTimelineItem(for itemProxy: TimelineItemProxy, chunkIndex: Int) -> RoomTimelineItemProtocol? { switch itemProxy { case .event(let eventTimelineItem): - return timelineItemFactory.buildTimelineItem(for: eventTimelineItem) + let timelineItem = timelineItemFactory.buildTimelineItem(for: eventTimelineItem) + + if let messageTimelineItem = timelineItem as? EventBasedMessageTimelineItemProtocol { + // Avoid fetching this over and over again as it changes states if it keeps failing to load + // Errors will be handled again on appearance + fetchEventDetails(for: messageTimelineItem, refetchOnError: false) + } + + return timelineItem case .virtual(let virtualItem): switch virtualItem { case .dayDivider(let timestamp): @@ -313,4 +315,17 @@ class RoomTimelineController: RoomTimelineControllerProtocol { return false } + + private func fetchEventDetails(for timelineItem: EventBasedMessageTimelineItemProtocol, refetchOnError: Bool) { + switch timelineItem.replyDetails { + case .notLoaded: + roomProxy.fetchDetails(for: timelineItem.id) + case .error: + if refetchOnError { + roomProxy.fetchDetails(for: timelineItem.id) + } + default: + break + } + } }