Tusker/Tusker/SavedDataManager.swift

89 lines
2.6 KiB
Swift

//
// SavedDataManager.swift
// Tusker
//
// Created by Shadowfacts on 12/19/19.
// Copyright © 2019 Shadowfacts. All rights reserved.
//
import Foundation
import Pachyderm
class SavedDataManager: Codable {
private(set) static var shared: SavedDataManager = load()
private static var documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
private static var archiveURL = SavedDataManager.documentsDirectory.appendingPathComponent("saved_data").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() -> SavedDataManager {
let decoder = PropertyListDecoder()
if let data = try? Data(contentsOf: archiveURL),
let savedHashtagsManager = try? decoder.decode(Self.self, from: data) {
return savedHashtagsManager
}
return SavedDataManager()
}
private init() {}
private var savedHashtags: [Hashtag] = [] {
didSet {
SavedDataManager.save()
NotificationCenter.default.post(name: .savedHashtagsChanged, object: nil)
}
}
var sortedHashtags: [Hashtag] {
return savedHashtags.sorted(by: { $0.name < $1.name })
}
private(set) var savedInstances: [URL] = [] {
didSet {
SavedDataManager.save()
NotificationCenter.default.post(name: .savedInstancesChanged, object: nil)
}
}
func isSaved(hashtag: Hashtag) -> Bool {
return savedHashtags.contains(hashtag)
}
func add(hashtag: Hashtag) {
if isSaved(hashtag: hashtag) {
return
}
savedHashtags.append(hashtag)
}
func remove(hashtag: Hashtag) {
guard isSaved(hashtag: hashtag) else { return }
savedHashtags.removeAll(where: { $0.name == hashtag.name })
}
func isSaved(instance url: URL) -> Bool {
return savedInstances.contains(url)
}
func add(instance url: URL) {
if isSaved(instance: url) { return }
savedInstances.append(url)
}
func remove(instance url: URL) {
guard isSaved(instance: url) else { return }
savedInstances.removeAll(where: { $0 == url })
}
}
extension Foundation.Notification.Name {
static let savedHashtagsChanged = Notification.Name("savedHashtagsChanged")
static let savedInstancesChanged = Notification.Name("savedInstancesChanged")
}