// // Preferences.swift // Reader // // Created by Shadowfacts on 1/16/22. // import UIKit class Preferences: Codable, ObservableObject { private static let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! private static let archiveURL = Preferences.documentsDirectory.appendingPathComponent("preferences").appendingPathExtension("plist") private static let decoder = PropertyListDecoder() private static let encoder = PropertyListEncoder() static var shared = load() private static func load() -> Preferences { if let data = try? Data(contentsOf: archiveURL), let prefs = try? decoder.decode(Preferences.self, from: data) { return prefs } else { return Preferences() } } static func save() { if let data = try? encoder.encode(shared) { try? data.write(to: archiveURL, options: .noFileProtection) } } init() { } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.appearance = try container.decode(UIUserInterfaceStyle.self, forKey: .appearance) } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(appearance, forKey: .appearance) } var appearance = UIUserInterfaceStyle.unspecified { willSet { objectWillChange.send() } didSet { NotificationCenter.default.post(name: .userInterfaceStyleChanged, object: nil) } } private enum CodingKeys: String, CodingKey { case appearance } } extension UIUserInterfaceStyle: Codable { } extension Notification.Name { static let userInterfaceStyleChanged = Notification.Name("userInterfaceStyleChanged") }