summaryrefslogtreecommitdiff
path: root/Hutch/Views/Projects/ProjectPinStore.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-12 19:58:20 -0500
committerChristian Cleberg <[email protected]>2026-04-12 19:58:20 -0500
commit9cd99c3e1c7e2620c34bfd9e78931e3b2b63aa8a (patch)
treebf7a249bec3b9aba18176e6139d690c9bf384ab5 /Hutch/Views/Projects/ProjectPinStore.swift
parent1354f2464180ece6d13296a543a964ddf6d2d393 (diff)
downloadhutch-9cd99c3e1c7e2620c34bfd9e78931e3b2b63aa8a.tar.gz
hutch-9cd99c3e1c7e2620c34bfd9e78931e3b2b63aa8a.tar.bz2
hutch-9cd99c3e1c7e2620c34bfd9e78931e3b2b63aa8a.zip
feat: add projects list, detail view, and home pinning
Implements: https://todo.sr.ht/~ccleberg/hutch/26 Implements: https://todo.sr.ht/~ccleberg/hutch/27 Implements: https://todo.sr.ht/~ccleberg/hutch/28
Diffstat (limited to 'Hutch/Views/Projects/ProjectPinStore.swift')
-rw-r--r--Hutch/Views/Projects/ProjectPinStore.swift50
1 files changed, 50 insertions, 0 deletions
diff --git a/Hutch/Views/Projects/ProjectPinStore.swift b/Hutch/Views/Projects/ProjectPinStore.swift
new file mode 100644
index 0000000..cd3d961
--- /dev/null
+++ b/Hutch/Views/Projects/ProjectPinStore.swift
@@ -0,0 +1,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)
+ }
+}