development
swift 38 lines 889 Bytes
Raw
1 import Combine
2 import Foundation
3
4 @MainActor
5 final class FavoritesStore: ObservableObject {
6 @Published private(set) var favoriteIDs: Set<String>
7
8 private let defaults: UserDefaults
9 private let storageKey = "klepon.favoriteIDs"
10
11 init(defaults: UserDefaults = .standard) {
12 self.defaults = defaults
13 self.favoriteIDs = Set(defaults.stringArray(forKey: storageKey) ?? [])
14 }
15
16 func isFavorite(_ entryID: String) -> Bool {
17 favoriteIDs.contains(entryID)
18 }
19
20 func toggle(_ entryID: String) {
21 if favoriteIDs.contains(entryID) {
22 favoriteIDs.remove(entryID)
23 } else {
24 favoriteIDs.insert(entryID)
25 }
26
27 persist()
28 }
29
30 func clear() {
31 favoriteIDs = []
32 persist()
33 }
34
35 private func persist() {
36 defaults.set(Array(favoriteIDs).sorted(), forKey: storageKey)
37 }
38 }