// // OldDraftsManager.swift // Tusker // // Created by Shadowfacts on 10/22/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import Foundation class OldDraftsManager: Codable, ObservableObject { private(set) static var shared: OldDraftsManager = load() private static var documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! private static var archiveURL = OldDraftsManager.documentsDirectory.appendingPathComponent("drafts").appendingPathExtension("plist") static func save() { DispatchQueue.global(qos: .utility).async { let encoder = PropertyListEncoder() let data = try? encoder.encode(shared) try? data?.write(to: archiveURL, options: .noFileProtection) } } static func load() -> OldDraftsManager { let decoder = PropertyListDecoder() if let data = try? Data(contentsOf: archiveURL), let OldDraftsManager = try? decoder.decode(OldDraftsManager.self, from: data) { return OldDraftsManager } return OldDraftsManager() } private init() {} required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) if let dict = try? container.decode([UUID: OldDraft].self, forKey: .drafts) { self.drafts = dict } else if let array = try? container.decode([OldDraft].self, forKey: .drafts) { self.drafts = array.reduce(into: [:], { partialResult, draft in partialResult[draft.id] = draft }) } else { throw DecodingError.dataCorruptedError(forKey: .drafts, in: container, debugDescription: "expected drafts to be a dict or array of drafts") } } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(drafts, forKey: .drafts) } @Published private var drafts: [UUID: OldDraft] = [:] var sorted: [OldDraft] { return drafts.values.sorted(by: { $0.lastModified > $1.lastModified }) } func add(_ draft: OldDraft) { drafts[draft.id] = draft } func remove(_ draft: OldDraft) { drafts.removeValue(forKey: draft.id) } func getBy(id: UUID) -> OldDraft? { return drafts[id] } enum CodingKeys: String, CodingKey { case drafts } }