Remove notifications from the bottom when scrolling up notifications list
This commit is contained in:
parent
6d8c5f632c
commit
98529ca5af
|
@ -127,6 +127,33 @@ class NotificationsTableViewController: EnhancedTableViewController {
|
|||
// MARK: - Table view delegate
|
||||
|
||||
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
|
||||
// see TimelineTableViewController.tableView(_:willDisplay:forRowAt:)
|
||||
if !isCurrentlyScrollingToTop, scrollViewDirection < 0 {
|
||||
let pageSize = 20
|
||||
if groups.count > 2 * pageSize,
|
||||
indexPath.row < groups.count - (2 * pageSize) {
|
||||
let groupsToRemove = groups[groups.count - pageSize..<groups.count]
|
||||
for group in groupsToRemove {
|
||||
for notification in group.notifications {
|
||||
// todo: reference count accounts
|
||||
// mastodonController.persistentContainer.account(for: notification.account.id)?.decrementReferenceCount()
|
||||
if let id = notification.status?.id {
|
||||
mastodonController.persistentContainer.status(for: id)?.decrementReferenceCount()
|
||||
}
|
||||
}
|
||||
}
|
||||
let removedIndexPaths = (groups.count - 20..<groups.count).map { IndexPath(row: $0, section: 0) }
|
||||
|
||||
groups.removeLast(pageSize)
|
||||
|
||||
DispatchQueue.main.async {
|
||||
UIView.performWithoutAnimation {
|
||||
tableView.deleteRows(at: removedIndexPaths, with: .none)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if indexPath.row == groups.count - 1 {
|
||||
guard let older = older else { return }
|
||||
|
||||
|
|
|
@ -19,9 +19,6 @@ class TimelineTableViewController: EnhancedTableViewController {
|
|||
var newer: RequestRange?
|
||||
var older: RequestRange?
|
||||
|
||||
private var prevScrollViewContentOffset: CGPoint?
|
||||
private var scrollViewDirection: CGFloat = 0
|
||||
|
||||
init(for timeline: Timeline, mastodonController: MastodonController) {
|
||||
self.timeline = timeline
|
||||
self.mastodonController = mastodonController
|
||||
|
@ -143,7 +140,7 @@ class TimelineTableViewController: EnhancedTableViewController {
|
|||
for (id, _) in statusesToRemove {
|
||||
mastodonController.persistentContainer.status(for: id)?.decrementReferenceCount()
|
||||
}
|
||||
timelineSegments[timelineSegments.count - 1].removeLast(20)
|
||||
timelineSegments[timelineSegments.count - 1].removeLast(pageSize)
|
||||
|
||||
let removedIndexPaths = (lastSection.count - 20..<lastSection.count).map { IndexPath(row: $0, section: timelineSegments.count - 1) }
|
||||
// Removing this DispatchQueue.main.async call causes things to break when scrolling
|
||||
|
@ -197,6 +194,8 @@ class TimelineTableViewController: EnhancedTableViewController {
|
|||
return (tableView.cellForRow(at: indexPath) as? TableViewSwipeActionProvider)?.trailingSwipeActionsConfiguration()
|
||||
}
|
||||
|
||||
// MARK: Interaction
|
||||
|
||||
@objc func refreshStatuses(_ sender: Any) {
|
||||
guard let newer = newer else { return }
|
||||
|
||||
|
@ -227,15 +226,6 @@ class TimelineTableViewController: EnhancedTableViewController {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Mark: Scroll View Delegate
|
||||
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||
if let prev = prevScrollViewContentOffset {
|
||||
scrollViewDirection = scrollView.contentOffset.y - prev.y
|
||||
}
|
||||
prevScrollViewContentOffset = scrollView.contentOffset
|
||||
}
|
||||
|
||||
|
||||
@objc func composePressed(_ sender: Any) {
|
||||
compose()
|
||||
|
|
|
@ -13,6 +13,10 @@ class EnhancedTableViewController: UITableViewController {
|
|||
|
||||
private var prevScrollToTopOffset: CGPoint? = nil
|
||||
private(set) var isCurrentlyScrollingToTop = false
|
||||
private var prevScrollViewContentOffset: CGPoint?
|
||||
private(set) var scrollViewDirection: CGFloat = 0
|
||||
|
||||
// MARK: Scroll View Delegate
|
||||
|
||||
override func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
|
||||
if let offset = prevScrollToTopOffset {
|
||||
|
@ -37,7 +41,15 @@ class EnhancedTableViewController: UITableViewController {
|
|||
prevScrollToTopOffset = nil
|
||||
}
|
||||
|
||||
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||
if let prev = prevScrollViewContentOffset {
|
||||
scrollViewDirection = scrollView.contentOffset.y - prev.y
|
||||
}
|
||||
prevScrollViewContentOffset = scrollView.contentOffset
|
||||
}
|
||||
|
||||
// MARK: Table View Delegate
|
||||
|
||||
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
||||
if let cell = tableView.cellForRow(at: indexPath) as? SelectableTableViewCell {
|
||||
cell.didSelectCell()
|
||||
|
|
Loading…
Reference in New Issue