Sign the macOS app and keep its state in SwiftData with iCloud sync
This commit is contained in:
@@ -1,9 +1,9 @@
|
||||
import CoreData
|
||||
import Foundation
|
||||
import Observation
|
||||
import SwiftData
|
||||
import SwiftUI
|
||||
|
||||
private let originKey = "byre.server"
|
||||
|
||||
@MainActor
|
||||
@Observable
|
||||
final class Connection {
|
||||
@@ -21,16 +21,33 @@ final class Connection {
|
||||
@ObservationIgnored private var generation = 0
|
||||
|
||||
init() {
|
||||
let saved = UserDefaults.standard.string(forKey: originKey)
|
||||
serverText = saved ?? ""
|
||||
if let saved, let origin = parseOrigin(saved) {
|
||||
phase = .starting
|
||||
Task {
|
||||
await start(origin)
|
||||
serverText = ""
|
||||
resume()
|
||||
Task {
|
||||
for await note in NotificationCenter.default.notifications(named: NSPersistentCloudKitContainer.eventChangedNotification) {
|
||||
if let event = note.userInfo?[NSPersistentCloudKitContainer.eventNotificationUserInfoKey] as? NSPersistentCloudKitContainer.Event, event.type == .import, event.endDate != nil {
|
||||
store?.drafts?.reload()
|
||||
resume()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func resume() {
|
||||
guard case .connect = phase, serverText.isEmpty, !connecting, let saved = Self.servers().first?.origin, let origin = parseOrigin(saved) else {
|
||||
return
|
||||
}
|
||||
serverText = saved
|
||||
phase = .starting
|
||||
Task {
|
||||
await start(origin)
|
||||
}
|
||||
}
|
||||
|
||||
private static func servers() -> [ServerRecord] {
|
||||
fetchRecords(FetchDescriptor(sortBy: [SortDescriptor(\.saved, order: .reverse)]))
|
||||
}
|
||||
|
||||
var store: Store? {
|
||||
if case .running(let store) = phase {
|
||||
return store
|
||||
@@ -59,7 +76,11 @@ final class Connection {
|
||||
return
|
||||
}
|
||||
connecting = false
|
||||
UserDefaults.standard.set(origin.absoluteString, forKey: originKey)
|
||||
for server in Self.servers() {
|
||||
persistence.delete(server)
|
||||
}
|
||||
persistence.insert(ServerRecord(origin: origin.absoluteString))
|
||||
saveRecords()
|
||||
serverText = origin.absoluteString
|
||||
phase = .starting
|
||||
await start(origin)
|
||||
|
||||
Reference in New Issue
Block a user