diff --git a/apps/ios/Shared/Views/Chat/ChatItemsMerger.swift b/apps/ios/Shared/Views/Chat/ChatItemsMerger.swift index be1e83a0c8..e0af28cef4 100644 --- a/apps/ios/Shared/Views/Chat/ChatItemsMerger.swift +++ b/apps/ios/Shared/Views/Chat/ChatItemsMerger.swift @@ -273,17 +273,17 @@ class ActiveChatState { } } -struct BoxedValue2: /*Identifiable, */Hashable { +class BoxedValue2: /*Identifiable, */Hashable { // var id: Int64 { (boxedValue as! MergedItem).id } static func == (lhs: BoxedValue2, rhs: BoxedValue2) -> Bool { lhs.boxedValue == rhs.boxedValue } - var hashValue: Int { (boxedValue as! MergedItem).newest().hashValue } + var hashValue: Int { (boxedValue as! MergedItem).newest().item.hashValue } func hash(into hasher: inout Hasher) { - hasher.combine("\((boxedValue as! MergedItem).newest())") + hasher.combine("\((boxedValue as! MergedItem).newest().item)") } var boxedValue : T diff --git a/apps/ios/Shared/Views/Chat/ReverseList.swift b/apps/ios/Shared/Views/Chat/ReverseList.swift index 3bed52cef2..4c2368c3c0 100644 --- a/apps/ios/Shared/Views/Chat/ReverseList.swift +++ b/apps/ios/Shared/Views/Chat/ReverseList.swift @@ -48,7 +48,7 @@ struct ReverseList: UIViewControllerRepresentable { itemsUpdaterTask?.cancel() // when tableView is dragging and new items are added, scroll position cannot be set correctly // so it's better to just wait until dragging ends - if controller.tableView.isDragging { + if false && controller.tableView.isDragging { DispatchQueue.main.async { itemsUpdaterTask = Task { while controller.tableView.isDragging { @@ -78,7 +78,7 @@ struct ReverseList: UIViewControllerRepresentable { // Putting MergedItem here directly prevents UITableViewDiffableDataSource to make partial updates // which looks like UITableView scrolls to bottom on insert values to bottom instead of // remains in the same scroll position - private var dataSource: UITableViewDiffableDataSource! + private var dataSource: UITableViewDiffableDataSource>! var itemCount: Int { get { representer.mergedItems.items.count @@ -114,7 +114,7 @@ struct ReverseList: UIViewControllerRepresentable { } // 3. Configure data source - self.dataSource = UITableViewDiffableDataSource( + self.dataSource = UITableViewDiffableDataSource>( tableView: tableView ) { (tableView, indexPath, item) -> UITableViewCell? in if indexPath.item > self.itemCount - 8 { @@ -124,12 +124,12 @@ struct ReverseList: UIViewControllerRepresentable { } let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseId, for: indexPath) if #available(iOS 16.0, *) { - cell.contentConfiguration = UIHostingConfiguration { self.representer.content(indexPath.item, self.itemsInPrevSnapshot[item]!) } + cell.contentConfiguration = UIHostingConfiguration { self.representer.content(indexPath.item, item.boxedValue) } .margins(.all, 0) .minSize(height: 1) // Passing zero will result in system default of 44 points being used } else { if let cell = cell as? HostingCell { - cell.set(content: self.representer.content(indexPath.item, self.itemsInPrevSnapshot[item]!), parent: self) + cell.set(content: self.representer.content(indexPath.item, item.boxedValue), parent: self) } else { fatalError("Unexpected Cell Type for: \(item)") } @@ -256,21 +256,21 @@ struct ReverseList: UIViewControllerRepresentable { let insertedOneNewestItem = wasCount != 0 && representer.mergedItems.items.count - wasCount == 1 && prevSnapshot.itemIdentifiers.first!.hashValue == self.representer.mergedItems.items[1].hashValue logger.debug("LALAL WAS \(wasCount) will be \(self.representer.mergedItems.items.count)") //self.representer.mergedItems = MergedItems.create(items, representer.unreadCount, representer.revealedItems, ItemsModel.shared.chatState) - let snapshot: NSDiffableDataSourceSnapshot + let snapshot: NSDiffableDataSourceSnapshot> let itemsInCurrentSnapshot: Dictionary if insertedOneNewestItem { - prevSnapshot.insertItems([representer.mergedItems.items.first!.hashValue], beforeItem: prevSnapshot.itemIdentifiers.first!) + prevSnapshot.insertItems([BoxedValue2(representer.mergedItems.items.first!)], beforeItem: prevSnapshot.itemIdentifiers.first!) var new = itemsInPrevSnapshot - new[representer.mergedItems.items.first!.hashValue] = representer.mergedItems.items.first! + //new[representer.mergedItems.items.first!.hashValue] = representer.mergedItems.items.first! itemsInCurrentSnapshot = new snapshot = prevSnapshot } else { var new: Dictionary = [:] - var snap = NSDiffableDataSourceSnapshot() + var snap = NSDiffableDataSourceSnapshot>() snap.appendSections([.main]) snap.appendItems(representer.mergedItems.items.map({ merged in new[merged.hashValue] = merged - return merged.hashValue + return BoxedValue2(merged)//.hashValue })) itemsInCurrentSnapshot = new @@ -295,7 +295,7 @@ struct ReverseList: UIViewControllerRepresentable { snapshot, animatingDifferences: insertedOneNewestItem ) - if let firstUnreadItem = snapshot.itemIdentifiers.lastIndex(where: { hash in itemsInPrevSnapshot[hash]!.hasUnread() }) { + if let firstUnreadItem = snapshot.itemIdentifiers.lastIndex(where: { item in item.boxedValue.hasUnread() }) { scrollToRowWhenKnowSize(firstUnreadItem) } else { tableView.setContentOffset(