Tusker/Tusker/Models/DraftsManager.swift

78 lines
2.4 KiB
Swift

//
// 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
}
}