import Combine import CoreData import Foundation import Models import OSLog let logger = Logger(subsystem: "app.omnivore", category: "data-service") public final class DataService: ObservableObject { public static var registerIntercomUser: ((String) -> Void)? public static var showIntercomMessenger: (() -> Void)? public let appEnvironment: AppEnvironment let networker: Networker let persistentContainer: PersistentContainer let backgroundContext: NSManagedObjectContext var subscriptions = Set() public var viewContext: NSManagedObjectContext { persistentContainer.viewContext } public init(appEnvironment: AppEnvironment, networker: Networker) { self.appEnvironment = appEnvironment self.networker = networker self.persistentContainer = PersistentContainer.make() self.backgroundContext = persistentContainer.newBackgroundContext() backgroundContext.mergePolicy = NSMergePolicy.mergeByPropertyObjectTrump persistentContainer.loadPersistentStores { _, error in if let error = error { fatalError("Core Data store failed to load with error: \(error)") } } } public var currentViewer: Viewer? { let fetchRequest: NSFetchRequest = Viewer.fetchRequest() fetchRequest.fetchLimit = 1 // we should only have one viewer saved return try? persistentContainer.viewContext.fetch(fetchRequest).first } 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)") } } }