Update pinned timelines when changed remotely
This commit is contained in:
parent
60b182ac18
commit
3cba0bce34
|
@ -507,24 +507,28 @@ class MastodonCachePersistentStore: NSPersistentCloudKitContainer {
|
||||||
self.backgroundContext.performAndWait {
|
self.backgroundContext.performAndWait {
|
||||||
if let result = try? self.backgroundContext.execute(req) as? NSPersistentHistoryResult,
|
if let result = try? self.backgroundContext.execute(req) as? NSPersistentHistoryResult,
|
||||||
let transactions = result.result as? [NSPersistentHistoryTransaction] {
|
let transactions = result.result as? [NSPersistentHistoryTransaction] {
|
||||||
var changes: (hashtags: Bool, instances: Bool) = (false, false)
|
var changedHashtags = false
|
||||||
|
var changedInstances = false
|
||||||
var changedTimelinePositions: [NSManagedObjectID] = []
|
var changedTimelinePositions: [NSManagedObjectID] = []
|
||||||
|
var changedAccountPrefs = false
|
||||||
outer: for transaction in transactions {
|
outer: for transaction in transactions {
|
||||||
for change in transaction.changes ?? [] {
|
for change in transaction.changes ?? [] {
|
||||||
if change.changedObjectID.entity.name == "SavedHashtag" {
|
if change.changedObjectID.entity.name == "SavedHashtag" {
|
||||||
changes.hashtags = true
|
changedHashtags = true
|
||||||
} else if change.changedObjectID.entity.name == "SavedInstance" {
|
} else if change.changedObjectID.entity.name == "SavedInstance" {
|
||||||
changes.instances = true
|
changedInstances = true
|
||||||
} else if change.changedObjectID.entity.name == "TimelinePosition" {
|
} else if change.changedObjectID.entity.name == "TimelinePosition" {
|
||||||
changedTimelinePositions.append(change.changedObjectID)
|
changedTimelinePositions.append(change.changedObjectID)
|
||||||
|
} else if change.changedObjectID.entity.name == "AccountPreferences" {
|
||||||
|
changedAccountPrefs = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
if changes.hashtags {
|
if changedHashtags {
|
||||||
NotificationCenter.default.post(name: .savedHashtagsChanged, object: nil)
|
NotificationCenter.default.post(name: .savedHashtagsChanged, object: nil)
|
||||||
}
|
}
|
||||||
if changes.instances {
|
if changedInstances {
|
||||||
NotificationCenter.default.post(name: .savedInstancesChanged, object: nil)
|
NotificationCenter.default.post(name: .savedInstancesChanged, object: nil)
|
||||||
}
|
}
|
||||||
for id in changedTimelinePositions {
|
for id in changedTimelinePositions {
|
||||||
|
@ -533,6 +537,9 @@ class MastodonCachePersistentStore: NSPersistentCloudKitContainer {
|
||||||
}
|
}
|
||||||
NotificationCenter.default.post(name: .timelinePositionChanged, object: timelinePosition)
|
NotificationCenter.default.post(name: .timelinePositionChanged, object: timelinePosition)
|
||||||
}
|
}
|
||||||
|
if changedAccountPrefs {
|
||||||
|
NotificationCenter.default.post(name: .accountPreferencesChangedRemotely, object: nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -543,4 +550,5 @@ class MastodonCachePersistentStore: NSPersistentCloudKitContainer {
|
||||||
|
|
||||||
extension Foundation.Notification.Name {
|
extension Foundation.Notification.Name {
|
||||||
static let timelinePositionChanged = Notification.Name("timelinePositionChanged")
|
static let timelinePositionChanged = Notification.Name("timelinePositionChanged")
|
||||||
|
static let accountPreferencesChangedRemotely = Notification.Name("accountPreferencesChangedRemotely")
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
import UIKit
|
import UIKit
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import Pachyderm
|
import Pachyderm
|
||||||
|
import Combine
|
||||||
|
|
||||||
class TimelinesPageViewController: SegmentedPageViewController<TimelinesPageViewController.Page> {
|
class TimelinesPageViewController: SegmentedPageViewController<TimelinesPageViewController.Page> {
|
||||||
|
|
||||||
|
@ -18,7 +19,7 @@ class TimelinesPageViewController: SegmentedPageViewController<TimelinesPageView
|
||||||
|
|
||||||
weak var mastodonController: MastodonController!
|
weak var mastodonController: MastodonController!
|
||||||
|
|
||||||
private var pinnedTimelinesObservation: NSKeyValueObservation?
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
|
||||||
init(mastodonController: MastodonController) {
|
init(mastodonController: MastodonController) {
|
||||||
self.mastodonController = mastodonController
|
self.mastodonController = mastodonController
|
||||||
|
@ -63,12 +64,16 @@ class TimelinesPageViewController: SegmentedPageViewController<TimelinesPageView
|
||||||
}),
|
}),
|
||||||
]
|
]
|
||||||
|
|
||||||
pinnedTimelinesObservation = mastodonController.accountPreferences.observe(\.pinnedTimelinesData, changeHandler: { [unowned self] _, _ in
|
mastodonController.accountPreferences.publisher(for: \.pinnedTimelinesData)
|
||||||
|
.map { _ in () }
|
||||||
|
.merge(with: NotificationCenter.default.publisher(for: .accountPreferencesChangedRemotely).map { _ in () })
|
||||||
|
.sink { _ in
|
||||||
let pages = self.mastodonController.accountPreferences.pinnedTimelines.map {
|
let pages = self.mastodonController.accountPreferences.pinnedTimelines.map {
|
||||||
Page(mastodonController: self.mastodonController, timeline: $0)
|
Page(mastodonController: self.mastodonController, timeline: $0)
|
||||||
}
|
}
|
||||||
self.setPages(pages, animated: false)
|
self.setPages(pages, animated: false)
|
||||||
})
|
}
|
||||||
|
.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
required init?(coder: NSCoder) {
|
required init?(coder: NSCoder) {
|
||||||
|
|
Loading…
Reference in New Issue