mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
simplify and pass direction
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user