account for inset; remove old on appear/disappear blocks

This commit is contained in:
Levitating Pineapple
2024-08-28 16:09:51 +03:00
parent 4153ea7ddc
commit cc5bc9c2cf
2 changed files with 16 additions and 47 deletions
-44
View File
@@ -413,13 +413,6 @@ struct ChatView: View {
revealedChatItem: $revealedChatItem,
selectedChatItems: $selectedChatItems
)
.onAppear {
floatingButtonModel.appeared(viewId: ci.viewId)
}
.onDisappear {
floatingButtonModel.disappeared(viewId: ci.viewId)
}
.id(ci.id) // Required to trigger `onAppear` on iOS15
} loadPage: {
loadChatItems(cInfo)
}
@@ -429,9 +422,6 @@ struct ChatView: View {
.onChange(of: searchText) { _ in
Task { await loadChat(chat: chat, search: searchText) }
}
.onChange(of: im.reversedChatItems) { _ in
floatingButtonModel.chatItemsChanged()
}
.onChange(of: im.itemAdded) { added in
if added {
im.itemAdded = false
@@ -458,12 +448,6 @@ struct ChatView: View {
}
class FloatingButtonModel: ObservableObject {
private enum Event {
case appeared(String)
case disappeared(String)
case chatItemsChanged
}
static let shared = FloatingButtonModel()
@Published var unreadChatItemCounts: UnreadChatItemCounts
@@ -484,34 +468,6 @@ struct ChatView: View {
.throttle(for: .seconds(0.2), scheduler: DispatchQueue.main, latest: true)
.assign(to: \.unreadChatItemCounts, on: self)
.store(in: &bag)
// events
// .receive(on: DispatchQueue.global(qos: .background))
// .scan(Set<String>()) { itemsInView, event in
// var updated = itemsInView
// switch event {
// case let .appeared(viewId): updated.insert(viewId)
// case let .disappeared(viewId): updated.remove(viewId)
// case .chatItemsChanged: ()
// }
// return updated
// }
// .map { ChatModel.shared.unreadChatItemCounts(itemsInView: $0) }
// .removeDuplicates()
// .throttle(for: .seconds(0.2), scheduler: DispatchQueue.main, latest: true)
// .assign(to: \.unreadChatItemCounts, on: self)
// .store(in: &bag)
}
func appeared(viewId: String) {
// events.send(.appeared(viewId))
}
func disappeared(viewId: String) {
// events.send(.disappeared(viewId))
}
func chatItemsChanged() {
// events.send(.chatItemsChanged)
}
}
+16 -3
View File
@@ -190,15 +190,28 @@ struct ReverseList<Content: View>: UIViewControllerRepresentable {
)
}
itemCount = items.count
updateVisibleItems()
}
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
updateVisibleItems()
}
private func updateVisibleItems() {
ChatView.FloatingButtonModel.shared.visibleItems.send(
(tableView.indexPathsForVisibleRows ?? [])
.compactMap { indexPath -> String? in
if indexPath.item < representer.items.count {
representer.items[indexPath.item].viewId
} else { nil }
let relativeFrame = tableView.superview!.convert(
tableView.rectForRow(at: indexPath),
from: tableView
)
// Checks that the cell is visible accounting for the added insets
let isVisible =
relativeFrame.maxY > InvertedTableView.inset &&
relativeFrame.minY < tableView.frame.height - InvertedTableView.inset
return indexPath.item < representer.items.count && isVisible
? representer.items[indexPath.item].viewId
: nil
}
)
}