blob: cd3d961f3ce3c2618e5e1fba94f115697ea30f09 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import Foundation
enum ProjectPinStore {
static func loadPinnedProjectIDs(
for userKey: String,
defaults: UserDefaults = .standard
) -> [String] {
let pinnedProjects = loadAll(defaults: defaults)
return pinnedProjects[userKey] ?? []
}
static func isPinned(
projectID: String,
for userKey: String,
defaults: UserDefaults = .standard
) -> Bool {
loadPinnedProjectIDs(for: userKey, defaults: defaults).contains(projectID)
}
static func togglePin(
projectID: String,
for userKey: String,
defaults: UserDefaults = .standard
) {
var pinnedProjects = loadAll(defaults: defaults)
var projectIDs = pinnedProjects[userKey] ?? []
if let index = projectIDs.firstIndex(of: projectID) {
projectIDs.remove(at: index)
} else {
projectIDs.append(projectID)
}
pinnedProjects[userKey] = projectIDs
save(pinnedProjects, defaults: defaults)
}
private static func loadAll(defaults: UserDefaults) -> [String: [String]] {
guard let data = defaults.data(forKey: AppStorageKeys.pinnedHomeProjects) else {
return [:]
}
return (try? JSONDecoder().decode([String: [String]].self, from: data)) ?? [:]
}
private static func save(_ pinnedProjects: [String: [String]], defaults: UserDefaults) {
guard let data = try? JSONEncoder().encode(pinnedProjects) else { return }
defaults.set(data, forKey: AppStorageKeys.pinnedHomeProjects)
}
}
|