2022-03-30 23:39:51 +00:00
|
|
|
import Combine
|
2022-04-16 16:12:10 +00:00
|
|
|
import CoreData
|
2022-02-11 17:24:33 +00:00
|
|
|
import Foundation
|
|
|
|
|
import Models
|
2022-04-18 20:44:52 +00:00
|
|
|
import OSLog
|
2022-02-11 17:24:33 +00:00
|
|
|
|
2022-04-21 21:44:08 +00:00
|
|
|
let logger = Logger(subsystem: "app.omnivore", category: "data-service")
|
|
|
|
|
|
2022-02-24 01:08:16 +00:00
|
|
|
public final class DataService: ObservableObject {
|
2022-02-11 17:24:33 +00:00
|
|
|
public static var registerIntercomUser: ((String) -> Void)?
|
|
|
|
|
public static var showIntercomMessenger: (() -> Void)?
|
|
|
|
|
|
|
|
|
|
public let appEnvironment: AppEnvironment
|
|
|
|
|
let networker: Networker
|
|
|
|
|
|
2022-04-15 01:17:12 +00:00
|
|
|
let persistentContainer: PersistentContainer
|
2022-04-21 22:25:34 +00:00
|
|
|
let backgroundContext: NSManagedObjectContext
|
2022-03-30 23:39:51 +00:00
|
|
|
var subscriptions = Set<AnyCancellable>()
|
2022-04-21 22:25:34 +00:00
|
|
|
|
2022-04-22 03:27:10 +00:00
|
|
|
public var viewContext: NSManagedObjectContext {
|
2022-04-21 22:25:34 +00:00
|
|
|
persistentContainer.viewContext
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-11 17:24:33 +00:00
|
|
|
public init(appEnvironment: AppEnvironment, networker: Networker) {
|
|
|
|
|
self.appEnvironment = appEnvironment
|
|
|
|
|
self.networker = networker
|
2022-04-15 20:35:55 +00:00
|
|
|
self.persistentContainer = PersistentContainer.make()
|
2022-04-21 22:25:34 +00:00
|
|
|
self.backgroundContext = persistentContainer.newBackgroundContext()
|
2022-04-22 00:31:06 +00:00
|
|
|
backgroundContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump
|
2022-04-15 01:17:12 +00:00
|
|
|
|
|
|
|
|
persistentContainer.loadPersistentStores { _, error in
|
|
|
|
|
if let error = error {
|
|
|
|
|
fatalError("Core Data store failed to load with error: \(error)")
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-03-30 23:39:51 +00:00
|
|
|
}
|
|
|
|
|
|
2022-04-18 20:44:52 +00:00
|
|
|
public var currentViewer: Viewer? {
|
|
|
|
|
let fetchRequest: NSFetchRequest<Models.Viewer> = Viewer.fetchRequest()
|
2022-04-18 22:30:16 +00:00
|
|
|
fetchRequest.fetchLimit = 1 // we should only have one viewer saved
|
2022-04-18 20:44:52 +00:00
|
|
|
return try? persistentContainer.viewContext.fetch(fetchRequest).first
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-31 22:04:22 +00:00
|
|
|
public func switchAppEnvironment(appEnvironment: AppEnvironment) {
|
|
|
|
|
do {
|
|
|
|
|
try ValetKey.appEnvironmentString.setValue(appEnvironment.rawValue)
|
|
|
|
|
fatalError("App environment changed -- restarting app")
|
|
|
|
|
} catch {
|
|
|
|
|
fatalError("Unable to write to Keychain: \(error)")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|