mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-07-12 03:09:15 +00:00
account for inset; remove old on appear/disappear blocks
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user