SubscriptionManager, make unsubscribe menu item work
This commit is contained in:
parent
fee0d95561
commit
fead4c0814
7 changed files with 48 additions and 19 deletions
|
|
@ -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 = "<group>"; };
|
||||
9474F211283327C200CDE4DD /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = "<group>"; };
|
||||
9474F216283531A200CDE4DD /* Log.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = "<group>"; };
|
||||
94A3F7C7283734D900C48E79 /* SubscriptionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionManager.swift; sourceTree = "<group>"; };
|
||||
/* 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 = "<group>";
|
||||
|
|
@ -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 */,
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ struct AppMain: App {
|
|||
|
||||
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate: AppDelegate
|
||||
@StateObject private var store = Store.shared
|
||||
|
||||
|
||||
init() {
|
||||
FirebaseApp.configure()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
23
ntfy/Persistence/SubscriptionManager.swift
Normal file
23
ntfy/Persistence/SubscriptionManager.swift
Normal file
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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())
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,10 @@ struct SubscriptionListView: View {
|
|||
@EnvironmentObject private var store: Store
|
||||
@FetchRequest(sortDescriptors: [NSSortDescriptor(key: "topic", ascending: true)]) var subscriptions: FetchedResults<Subscription>
|
||||
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue