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