From cc5bc9c2cf3586205ba3887e3a2041a3cab217ff Mon Sep 17 00:00:00 2001 From: Levitating Pineapple Date: Wed, 28 Aug 2024 16:09:51 +0300 Subject: [PATCH] account for inset; remove old on appear/disappear blocks --- apps/ios/Shared/Views/Chat/ChatView.swift | 44 -------------------- apps/ios/Shared/Views/Chat/ReverseList.swift | 19 +++++++-- 2 files changed, 16 insertions(+), 47 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index ea864d4753..9beabe1606 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -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()) { 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) } } diff --git a/apps/ios/Shared/Views/Chat/ReverseList.swift b/apps/ios/Shared/Views/Chat/ReverseList.swift index 5edc051ff3..4344265d54 100644 --- a/apps/ios/Shared/Views/Chat/ReverseList.swift +++ b/apps/ios/Shared/Views/Chat/ReverseList.swift @@ -190,15 +190,28 @@ struct ReverseList: 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 } ) }