// // DraftsManager.swift // Tusker // // Created by Shadowfacts on 10/22/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import Foundation class DraftsManager: Codable { private(set) static var shared: DraftsManager = load() private static var documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! private static var archiveURL = DraftsManager.documentsDirectory.appendingPathComponent("drafts").appendingPathExtension("plist") static func save() { DispatchQueue.global(qos: .userInitiated).async { let encoder = PropertyListEncoder() let data = try? encoder.encode(shared) try? data?.write(to: archiveURL, options: .noFileProtection) } } static func load() -> DraftsManager { let decoder = PropertyListDecoder() if let data = try? Data(contentsOf: archiveURL), let draftsManager = try? decoder.decode(DraftsManager.self, from: data) { return draftsManager } return DraftsManager() } private init() {} var drafts: [Draft] = [] var sorted: [Draft] { return drafts.sorted(by: { $0.lastModified > $1.lastModified }) } func create(accountID: String, text: String, contentWarning: String?, inReplyToID: String?, attachments: [DraftAttachment]) -> Draft { let draft = Draft(accountID: accountID, text: text, contentWarning: contentWarning, inReplyToID: inReplyToID, attachments: attachments) drafts.append(draft) return draft } func remove(_ draft: Draft) { let index = drafts.firstIndex(of: draft)! drafts.remove(at: index) } } extension DraftsManager { class Draft: Codable, Equatable { let id: UUID private(set) var accountID: String private(set) var text: String private(set) var contentWarning: String? private(set) var attachments: [DraftAttachment] private(set) var inReplyToID: String? private(set) var lastModified: Date init(accountID: String, text: String, contentWarning: String?, inReplyToID: String?, attachments: [DraftAttachment], lastModified: Date = Date()) { self.id = UUID() self.accountID = accountID self.text = text self.contentWarning = contentWarning self.inReplyToID = inReplyToID self.attachments = attachments self.lastModified = lastModified } func update(accountID: String, text: String, contentWarning: String?, attachments: [DraftAttachment]) { self.accountID = accountID self.text = text self.contentWarning = contentWarning self.lastModified = Date() self.attachments = attachments } static func ==(lhs: Draft, rhs: Draft) -> Bool { return lhs.id == rhs.id } } struct DraftAttachment: Codable { let attachment: CompositionAttachment let description: String } }