// // Preferences.swift // Tusker // // Created by Shadowfacts on 8/28/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import Foundation import Pachyderm import SwiftUI import Combine class Preferences: Codable, BindableObject { static var shared: Preferences = load() private static var documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! private static var archiveURL = Preferences.documentsDirectory.appendingPathComponent("preferences").appendingPathExtension("plist") static func save() { let encoder = PropertyListEncoder() let data = try? encoder.encode(shared) try? data?.write(to: archiveURL, options: .noFileProtection) } static func load() -> Preferences { let decoder = PropertyListDecoder() if let data = try? Data(contentsOf: archiveURL), let preferences = try? decoder.decode(Preferences.self, from: data) { return preferences } return Preferences() } private init() {} let didChange = PassthroughSubject() // MARK: - Appearance var showRepliesInProfiles = false { didSet { didChange.send(self) } } var avatarStyle = AvatarStyle.roundRect { didSet { didChange.send(self) } } var hideCustomEmojiInUsernames = false { didSet { didChange.send(self) } } // MARK: - Behavior var defaultPostVisibility = Status.Visibility.public { didSet { didChange.send(self) } } var automaticallySaveDrafts = true { didSet { didChange.send(self) } } var openLinksInApps = true { didSet { didChange.send(self) } } // MARK: - Advanced var silentActions: [String: Permission] = [:] { didSet { didChange.send(self) } } var statusContentType: StatusContentType = .plain { didSet { didChange.send(self) } } } extension PassthroughSubject: Codable { public convenience init(from decoder: Decoder) throws { self.init() } public func encode(to encoder: Encoder) throws { } } extension Preferences { enum Permission: String, Codable { case undecided, accepted, rejected } }