commit ec75769a0fbe2e1e22b593a2d2d53a46670d6c3c
parent 47e349558c509cfddbcd95fed213c64fcd0bdc80
Author: William Casarin <jb55@jb55.com>
Date:   Fri, 21 Apr 2023 16:39:12 -0700
Refactor notification state filter saving and loading
Diffstat:
2 files changed, 36 insertions(+), 41 deletions(-)
diff --git a/damus/Models/UserSettingsStore.swift b/damus/Models/UserSettingsStore.swift
@@ -130,6 +130,12 @@ class UserSettingsStore: ObservableObject {
     
     @Setting(key: "disable_animation", default_value: UIAccessibility.isReduceMotionEnabled)
     var disable_animation: Bool
+    
+    @StringSetting(key: "friend_filter", default_value: .all)
+    var friend_filter: FriendFilter
+    
+    @StringSetting(key: "notification_state", default_value: .all)
+    var notification_state: NotificationFilterState
 
     @StringSetting(key: "translation_service", default_value: .none)
     var translation_service: TranslationService
diff --git a/damus/Views/Notifications/NotificationsView.swift b/damus/Views/Notifications/NotificationsView.swift
@@ -7,10 +7,22 @@
 
 import SwiftUI
 
-enum FriendFilter: String {
+enum FriendFilter: String, StringCodable {
     case all
     case friends
     
+    init?(from string: String) {
+        guard let ff = FriendFilter(rawValue: string) else {
+            return nil
+        }
+        
+        self = ff
+    }
+    
+    func to_string() -> String {
+        self.rawValue
+    }
+    
     func filter(contacts: Contacts, pubkey: String) -> Bool {
         switch self {
         case .all:
@@ -70,11 +82,23 @@ class NotificationFilter: ObservableObject, Equatable {
     }
 }
 
-enum NotificationFilterState: String {
+enum NotificationFilterState: String, StringCodable {
     case all
     case zaps
     case replies
     
+    init?(from string: String) {
+        guard let val = NotificationFilterState(rawValue: string) else {
+            return nil
+        }
+        
+        self = val
+    }
+    
+    func to_string() -> String {
+        self.rawValue
+    }
+    
     func is_other( item: NotificationItem) -> Bool {
         return item.is_zap == nil && item.is_reply == nil
     }
@@ -143,15 +167,14 @@ struct NotificationsView: View {
             }
         }
         .onChange(of: filter_state.fine_filter) { val in
-            save_friend_filter(pubkey: state.pubkey, filter: val)
+            state.settings.friend_filter = val
         }
         .onChange(of: filter_state.state) { val in
-            save_notification_filter_state(pubkey: state.pubkey, state: val)
+            state.settings.notification_state = val
         }
         .onAppear {
-            let state = load_notification_filter_state(pubkey: state.pubkey)
-            self.filter_state.fine_filter = state.fine_filter
-            self.filter_state.state = state.state
+            self.filter_state.fine_filter = state.settings.friend_filter
+            self.filter_state.state = state.settings.notification_state
         }
         .safeAreaInset(edge: .top, spacing: 0) {
             VStack(spacing: 0) {
@@ -210,40 +233,6 @@ struct NotificationsView_Previews: PreviewProvider {
     }
 }
 
-func notification_filter_state_key(pubkey: String) -> String {
-    return pk_setting_key(pubkey, key: "notification_filter_state")
-}
-
-func friend_filter_key(pubkey: String) -> String {
-    return pk_setting_key(pubkey, key: "friend_filter")
-}
-
-func load_notification_filter_state(pubkey: String) -> NotificationFilter {
-    let key = notification_filter_state_key(pubkey: pubkey)
-    let fine_key = friend_filter_key(pubkey: pubkey)
-    
-    let state_str = UserDefaults.standard.string(forKey: key)
-    let state = (state_str.flatMap { NotificationFilterState(rawValue: $0) }) ?? .all
-    
-    let filter_str = UserDefaults.standard.string(forKey: fine_key)
-    let filter = (filter_str.flatMap { FriendFilter(rawValue: $0) } ) ?? .all
-    
-    return NotificationFilter(state: state, fine_filter: filter)
-}
-
-
-func save_notification_filter_state(pubkey: String, state: NotificationFilterState)  {
-    let key = notification_filter_state_key(pubkey: pubkey)
-    
-    UserDefaults.standard.set(state.rawValue, forKey: key)
-}
-
-func save_friend_filter(pubkey: String, filter: FriendFilter) {
-    let key = friend_filter_key(pubkey: pubkey)
-    
-    UserDefaults.standard.set(filter.rawValue, forKey: key)
-}
-
 func would_filter_non_friends_from_notifications(contacts: Contacts, state: NotificationFilterState, items: [NotificationItem]) -> Bool {
     for item in items {
         // this is only valid depending on which tab we're looking at