SubscriptionManager, make unsubscribe menu item work

This commit is contained in:
Philipp Heckel 2022-05-19 22:46:41 -04:00
parent fee0d95561
commit fead4c0814
7 changed files with 48 additions and 19 deletions

View file

@ -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 */,

View file

@ -7,7 +7,7 @@ struct AppMain: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate: AppDelegate
@StateObject private var store = Store.shared
init() {
FirebaseApp.configure()
}

View file

@ -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

View 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)
}
}
}

View file

@ -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())

View file

@ -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()
}
}

View file

@ -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()
}
}
}
/*