This commit is contained in:
Avently 2024-12-26 08:28:17 -08:00
parent 1d8bc5e622
commit 553be124d5
2 changed files with 14 additions and 14 deletions

View file

@ -273,17 +273,17 @@ class ActiveChatState {
} }
} }
struct BoxedValue2<T: Hashable>: /*Identifiable, */Hashable { class BoxedValue2<T: Hashable>: /*Identifiable, */Hashable {
// var id: Int64 { (boxedValue as! MergedItem).id } // var id: Int64 { (boxedValue as! MergedItem).id }
static func == (lhs: BoxedValue2<T>, rhs: BoxedValue2<T>) -> Bool { static func == (lhs: BoxedValue2<T>, rhs: BoxedValue2<T>) -> Bool {
lhs.boxedValue == rhs.boxedValue 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) { func hash(into hasher: inout Hasher) {
hasher.combine("\((boxedValue as! MergedItem).newest())") hasher.combine("\((boxedValue as! MergedItem).newest().item)")
} }
var boxedValue : T var boxedValue : T

View file

@ -48,7 +48,7 @@ struct ReverseList<Content: View>: UIViewControllerRepresentable {
itemsUpdaterTask?.cancel() itemsUpdaterTask?.cancel()
// when tableView is dragging and new items are added, scroll position cannot be set correctly // 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 // so it's better to just wait until dragging ends
if controller.tableView.isDragging { if false && controller.tableView.isDragging {
DispatchQueue.main.async { DispatchQueue.main.async {
itemsUpdaterTask = Task { itemsUpdaterTask = Task {
while controller.tableView.isDragging { while controller.tableView.isDragging {
@ -78,7 +78,7 @@ struct ReverseList<Content: View>: UIViewControllerRepresentable {
// Putting MergedItem here directly prevents UITableViewDiffableDataSource to make partial updates // Putting MergedItem here directly prevents UITableViewDiffableDataSource to make partial updates
// which looks like UITableView scrolls to bottom on insert values to bottom instead of // which looks like UITableView scrolls to bottom on insert values to bottom instead of
// remains in the same scroll position // remains in the same scroll position
private var dataSource: UITableViewDiffableDataSource<Section, Int>! private var dataSource: UITableViewDiffableDataSource<Section, BoxedValue2<MergedItem>>!
var itemCount: Int { var itemCount: Int {
get { get {
representer.mergedItems.items.count representer.mergedItems.items.count
@ -114,7 +114,7 @@ struct ReverseList<Content: View>: UIViewControllerRepresentable {
} }
// 3. Configure data source // 3. Configure data source
self.dataSource = UITableViewDiffableDataSource<Section, Int>( self.dataSource = UITableViewDiffableDataSource<Section, BoxedValue2<MergedItem>>(
tableView: tableView tableView: tableView
) { (tableView, indexPath, item) -> UITableViewCell? in ) { (tableView, indexPath, item) -> UITableViewCell? in
if indexPath.item > self.itemCount - 8 { if indexPath.item > self.itemCount - 8 {
@ -124,12 +124,12 @@ struct ReverseList<Content: View>: UIViewControllerRepresentable {
} }
let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseId, for: indexPath) let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseId, for: indexPath)
if #available(iOS 16.0, *) { 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) .margins(.all, 0)
.minSize(height: 1) // Passing zero will result in system default of 44 points being used .minSize(height: 1) // Passing zero will result in system default of 44 points being used
} else { } else {
if let cell = cell as? HostingCell<Content> { if let cell = cell as? HostingCell<Content> {
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 { } else {
fatalError("Unexpected Cell Type for: \(item)") fatalError("Unexpected Cell Type for: \(item)")
} }
@ -256,21 +256,21 @@ struct ReverseList<Content: View>: UIViewControllerRepresentable {
let insertedOneNewestItem = wasCount != 0 && representer.mergedItems.items.count - wasCount == 1 && prevSnapshot.itemIdentifiers.first!.hashValue == self.representer.mergedItems.items[1].hashValue 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)") 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) //self.representer.mergedItems = MergedItems.create(items, representer.unreadCount, representer.revealedItems, ItemsModel.shared.chatState)
let snapshot: NSDiffableDataSourceSnapshot<Section, Int> let snapshot: NSDiffableDataSourceSnapshot<Section, BoxedValue2<MergedItem>>
let itemsInCurrentSnapshot: Dictionary<Int, MergedItem> let itemsInCurrentSnapshot: Dictionary<Int, MergedItem>
if insertedOneNewestItem { 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 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 itemsInCurrentSnapshot = new
snapshot = prevSnapshot snapshot = prevSnapshot
} else { } else {
var new: Dictionary<Int, MergedItem> = [:] var new: Dictionary<Int, MergedItem> = [:]
var snap = NSDiffableDataSourceSnapshot<Section, Int>() var snap = NSDiffableDataSourceSnapshot<Section, BoxedValue2<MergedItem>>()
snap.appendSections([.main]) snap.appendSections([.main])
snap.appendItems(representer.mergedItems.items.map({ merged in snap.appendItems(representer.mergedItems.items.map({ merged in
new[merged.hashValue] = merged new[merged.hashValue] = merged
return merged.hashValue return BoxedValue2(merged)//.hashValue
})) }))
itemsInCurrentSnapshot = new itemsInCurrentSnapshot = new
@ -295,7 +295,7 @@ struct ReverseList<Content: View>: UIViewControllerRepresentable {
snapshot, snapshot,
animatingDifferences: insertedOneNewestItem 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) scrollToRowWhenKnowSize(firstUnreadItem)
} else { } else {
tableView.setContentOffset( tableView.setContentOffset(