From c6b1413b7862812999d54607c202efcaedd4a34e Mon Sep 17 00:00:00 2001 From: Diogo Date: Tue, 8 Oct 2024 15:26:55 +0100 Subject: [PATCH] simplify and pass direction --- apps/ios/Shared/Views/Chat/ChatView.swift | 13 ++++++++----- apps/ios/Shared/Views/Chat/ReverseList.swift | 15 ++------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 7f6b61c1ea..85b3935502 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -179,7 +179,7 @@ struct ChatView: View { if !isLoading, im.reversedChatItems.count <= loadItemsPerPage, filtered(im.reversedChatItems).count < 10 { - loadChatItems(chat.chatInfo) + loadChatItems(chat.chatInfo, .toOldest) } } .environmentObject(scrollModel) @@ -433,8 +433,8 @@ struct ChatView: View { forwardedChatItems: $forwardedChatItems ) .id(ci.id) // Required to trigger `onAppear` on iOS15 - } loadPage: { - loadChatItems(cInfo) + } loadPage: { direction in + loadChatItems(cInfo, direction) } .opacity(ItemsModel.shared.isLoading ? 0 : 1) .padding(.vertical, -InvertedTableView.inset) @@ -834,7 +834,7 @@ struct ChatView: View { } } - private func loadChatItems(_ cInfo: ChatInfo) { + private func loadChatItems(_ cInfo: ChatInfo, _ direction: ChatScrollDirection) { Task { if loadingItems || firstPage { return } loadingItems = true @@ -844,8 +844,11 @@ struct ChatView: View { // Load additional items until the page is +50 large after merging while chatItemsAvailable && filtered(reversedPage).count < loadItemsPerPage { let pagination: ChatPagination = - if let lastItem = reversedPage.last ?? im.reversedChatItems.last { + if direction == .toOldest, let lastItem = reversedPage.last ?? im.reversedChatItems.last { .before(chatItemId: lastItem.id, count: loadItemsPerPage) + } else if direction == .toLatest, let firstItem = reversedPage.first ?? im.reversedChatItems.first { + // TODO: Replace with anchor. + .after(chatItemId: firstItem.id, count: loadItemsPerPage) } else { .last(count: loadItemsPerPage) } diff --git a/apps/ios/Shared/Views/Chat/ReverseList.swift b/apps/ios/Shared/Views/Chat/ReverseList.swift index 29a09a9429..b6cf500b84 100644 --- a/apps/ios/Shared/Views/Chat/ReverseList.swift +++ b/apps/ios/Shared/Views/Chat/ReverseList.swift @@ -25,7 +25,7 @@ struct ReverseList: UIViewControllerRepresentable { /// Closure, that returns user interface for a given item let content: (ChatItem) -> Content - let loadPage: () -> Void + let loadPage: (ChatScrollDirection) -> Void func makeUIViewController(context: Context) -> Controller { Controller(representer: self) @@ -56,8 +56,6 @@ struct ReverseList: UIViewControllerRepresentable { private var itemCount: Int = 0 private let updateFloatingButtons = PassthroughSubject() private var bag = Set() - private var lastContentOffset: CGFloat = 0 - private var scrollDirection: ChatScrollDirection = .none init(representer: ReverseList) { self.representer = representer @@ -87,7 +85,7 @@ struct ReverseList: UIViewControllerRepresentable { tableView: tableView ) { (tableView, indexPath, item) -> UITableViewCell? in if indexPath.item > self.itemCount - 8, self.itemCount > 8 { - self.representer.loadPage() + self.representer.loadPage(.toOldest) } let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseId, for: indexPath) if #available(iOS 16.0, *) { @@ -213,15 +211,6 @@ struct ReverseList: UIViewControllerRepresentable { } override func scrollViewDidScroll(_ scrollView: UIScrollView) { - let currentOffset = scrollView.contentOffset.y - if currentOffset > lastContentOffset { - scrollDirection = .toOldest - } else if currentOffset < lastContentOffset { - scrollDirection = .toLatest - } else { - scrollDirection = .none - } - lastContentOffset = currentOffset updateFloatingButtons.send() }