forked from shadowfacts/Tusker
93 lines
3.1 KiB
Swift
93 lines
3.1 KiB
Swift
//
|
|
// 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
|
|
}
|
|
}
|