diff --git a/ntfy.xcodeproj/project.pbxproj b/ntfy.xcodeproj/project.pbxproj index 46c8a91..d2cd723 100644 --- a/ntfy.xcodeproj/project.pbxproj +++ b/ntfy.xcodeproj/project.pbxproj @@ -33,6 +33,7 @@ 9474F2142834755E00CDE4DD /* Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9474F1FE28316ACE00CDE4DD /* Subscription.swift */; }; 9474F2152834758700CDE4DD /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9474F211283327C200CDE4DD /* Helpers.swift */; }; 9474F217283531A300CDE4DD /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9474F216283531A200CDE4DD /* Log.swift */; }; + 94A3F7C8283734D900C48E79 /* SubscriptionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A3F7C7283734D900C48E79 /* SubscriptionManager.swift */; }; 94E9196C28353E0100F30170 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9474F216283531A200CDE4DD /* Log.swift */; }; /* End PBXBuildFile section */ @@ -86,6 +87,7 @@ 9474F20E283326C500CDE4DD /* ApiService.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiService.swift; sourceTree = ""; }; 9474F211283327C200CDE4DD /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; 9474F216283531A200CDE4DD /* Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; }; + 94A3F7C7283734D900C48E79 /* SubscriptionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionManager.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -187,6 +189,7 @@ 9474F1FE28316ACE00CDE4DD /* Subscription.swift */, 9474F1F82830835400CDE4DD /* Store.swift */, 9474F20B283321C300CDE4DD /* Notification.swift */, + 94A3F7C7283734D900C48E79 /* SubscriptionManager.swift */, ); path = Persistence; sourceTree = ""; @@ -321,6 +324,7 @@ 9474F212283327C200CDE4DD /* Helpers.swift in Sources */, 9474F217283531A300CDE4DD /* Log.swift in Sources */, 9474F20928331F3A00CDE4DD /* NotificationListView.swift in Sources */, + 94A3F7C8283734D900C48E79 /* SubscriptionManager.swift in Sources */, 9474F20A28331F3A00CDE4DD /* NotificationRowView.swift in Sources */, 9474F1D2282F2D2C00CDE4DD /* AppDelegate.swift in Sources */, 9474F1C3282F2AA700CDE4DD /* ContentView.swift in Sources */, diff --git a/ntfy/App/AppMain.swift b/ntfy/App/AppMain.swift index 3f6d755..73e8584 100644 --- a/ntfy/App/AppMain.swift +++ b/ntfy/App/AppMain.swift @@ -7,7 +7,7 @@ struct AppMain: App { @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate: AppDelegate @StateObject private var store = Store.shared - + init() { FirebaseApp.configure() } diff --git a/ntfy/Persistence/Store.swift b/ntfy/Persistence/Store.swift index fa365da..72ceed8 100644 --- a/ntfy/Persistence/Store.swift +++ b/ntfy/Persistence/Store.swift @@ -67,6 +67,11 @@ class Store: ObservableObject { return try? context.fetch(fetchRequest).first } + func deleteSubscription(subscription: Subscription) { + context.delete(subscription) + try? context.save() + } + func saveNotification(fromUserInfo userInfo: [AnyHashable: Any]) { guard let id = userInfo["id"] as? String, let topic = userInfo["topic"] as? String, // FIXME: Notification should also contain baseUrl diff --git a/ntfy/Persistence/SubscriptionManager.swift b/ntfy/Persistence/SubscriptionManager.swift new file mode 100644 index 0000000..b302bc1 --- /dev/null +++ b/ntfy/Persistence/SubscriptionManager.swift @@ -0,0 +1,23 @@ +import Foundation +import FirebaseMessaging + +struct SubscriptionManager { + private let tag = "Store" + var store: Store + + func subscribe(baseUrl: String, topic: String) { + Log.d(tag, "Subscribing to \(topicUrl(baseUrl: appBaseUrl, topic: topic))") + Messaging.messaging().subscribe(toTopic: topic) + store.saveSubscription(baseUrl: baseUrl, topic: topic) + } + + func unsubscribe(_ subscription: Subscription) { + Log.d(tag, "Unsubscribing from \(subscription.urlString())") + DispatchQueue.main.async { + if let topic = subscription.topic { + Messaging.messaging().unsubscribe(fromTopic: topic) + } + store.deleteSubscription(subscription: subscription) + } + } +} diff --git a/ntfy/Views/NotificationListView.swift b/ntfy/Views/NotificationListView.swift index cc57329..7c51c5e 100644 --- a/ntfy/Views/NotificationListView.swift +++ b/ntfy/Views/NotificationListView.swift @@ -19,6 +19,10 @@ struct NotificationListView: View { @State private var showAlert = false @State private var activeAlert: ActiveAlert = .clear + private var subscriptionManager: SubscriptionManager { + return SubscriptionManager(store: store) + } + var body: some View { List(selection: $selection) { ForEach(subscription.notificationsSorted(), id: \.self) { notification in @@ -99,7 +103,7 @@ struct NotificationListView: View { primaryButton: .destructive( Text("Unsubscribe"), action: { - try? context.delete(subscription) + subscriptionManager.unsubscribe(subscription) self.presentationMode.wrappedValue.dismiss() }), secondaryButton: .cancel()) diff --git a/ntfy/Views/SubscriptionAddView.swift b/ntfy/Views/SubscriptionAddView.swift index 731c35b..fa57c5e 100644 --- a/ntfy/Views/SubscriptionAddView.swift +++ b/ntfy/Views/SubscriptionAddView.swift @@ -9,6 +9,10 @@ struct SubscriptionAddView: View { @EnvironmentObject private var store: Store @State private var topic: String = "" + private var subscriptionManager: SubscriptionManager { + return SubscriptionManager(store: store) + } + var body: some View { VStack { Form { @@ -41,10 +45,7 @@ struct SubscriptionAddView: View { } private func subscribeAction() { - Log.d(tag, "Subscribing to \(topicUrl(baseUrl: appBaseUrl, topic: topic))") - Messaging.messaging().subscribe(toTopic: topic) - - store.saveSubscription(baseUrl: appBaseUrl, topic: topic) + subscriptionManager.subscribe(baseUrl: appBaseUrl, topic: topic) presentationMode.wrappedValue.dismiss() } } diff --git a/ntfy/Views/SubscriptionsListView.swift b/ntfy/Views/SubscriptionsListView.swift index 36084b9..f38e591 100644 --- a/ntfy/Views/SubscriptionsListView.swift +++ b/ntfy/Views/SubscriptionsListView.swift @@ -13,6 +13,10 @@ struct SubscriptionListView: View { @EnvironmentObject private var store: Store @FetchRequest(sortDescriptors: [NSSortDescriptor(key: "topic", ascending: true)]) var subscriptions: FetchedResults + private var subscriptionManager: SubscriptionManager { + return SubscriptionManager(store: store) + } + var body: some View { NavigationView { List { @@ -28,7 +32,7 @@ struct SubscriptionListView: View { } .swipeActions(edge: .trailing) { Button(role: .destructive) { - unsubscribe(subscription) + subscriptionManager.unsubscribe(subscription) } label: { Label("Delete", systemImage: "trash.circle") } @@ -44,7 +48,6 @@ struct SubscriptionListView: View { ) { Image(systemName: "plus") } - } } .overlay(Group { @@ -57,17 +60,6 @@ struct SubscriptionListView: View { } .navigationViewStyle(StackNavigationViewStyle()) } - - func unsubscribe(_ subscription: Subscription) { - DispatchQueue.main.async { - if let topic = subscription.topic { - Messaging.messaging().unsubscribe(fromTopic: topic) - } - context.delete(subscription) - try? context.save() - } - } - } /*