simplify and pass direction

This commit is contained in:
Diogo
2024-10-08 15:26:55 +01:00
parent d4e460ac8c
commit c6b1413b78
2 changed files with 10 additions and 18 deletions
+8 -5
View File
@@ -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)
}
+2 -13
View File
@@ -25,7 +25,7 @@ struct ReverseList<Content: View>: 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<Content: View>: UIViewControllerRepresentable {
private var itemCount: Int = 0
private let updateFloatingButtons = PassthroughSubject<Void, Never>()
private var bag = Set<AnyCancellable>()
private var lastContentOffset: CGFloat = 0
private var scrollDirection: ChatScrollDirection = .none
init(representer: ReverseList) {
self.representer = representer
@@ -87,7 +85,7 @@ struct ReverseList<Content: View>: 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<Content: View>: 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()
}