IceCubesApp/IceCubesApp/App/Tabs/Settings/PushNotificationsView.swift

155 lines
4.4 KiB
Swift
Raw Normal View History

2023-01-17 10:36:01 +00:00
import AppAccount
2023-01-08 09:22:52 +00:00
import DesignSystem
2023-01-17 10:36:01 +00:00
import Env
import Models
2023-01-08 09:22:52 +00:00
import Network
2023-01-17 10:36:01 +00:00
import NukeUI
import SwiftUI
2023-01-08 09:22:52 +00:00
import UserNotifications
2023-12-19 08:48:12 +00:00
struct PushNotificationsViewWrapper: View {
@Environment(\.dismiss) private var dismiss
public let subscription: PushNotificationSubscriptionSettings
var body: some View {
NavigationStack {
PushNotificationsView(subscription: subscription)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button {
dismiss()
} label: {
Image(systemName: "xmark.circle")
}
}
}
}
}
}
2023-09-18 19:03:52 +00:00
@MainActor
2023-01-08 09:22:52 +00:00
struct PushNotificationsView: View {
2023-09-18 19:03:52 +00:00
@Environment(Theme.self) private var theme
@Environment(AppAccountsManager.self) private var appAccountsManager
@Environment(PushNotificationsService.self) private var pushNotifications
2023-01-17 10:36:01 +00:00
@State public var subscription: PushNotificationSubscriptionSettings
2023-01-17 10:36:01 +00:00
2023-01-08 09:22:52 +00:00
var body: some View {
Form {
Section {
Toggle(isOn: .init(get: {
subscription.isEnabled
}, set: { newValue in
subscription.isEnabled = newValue
if newValue {
updateSubscription()
} else {
deleteSubscription()
}
})) {
Text("settings.push.main-toggle")
2023-01-08 09:22:52 +00:00
}
2023-01-08 13:16:43 +00:00
} footer: {
Text("settings.push.main-toggle.description")
2023-01-08 09:57:58 +00:00
}
2023-12-19 08:48:12 +00:00
#if !os(visionOS)
2023-01-08 09:57:58 +00:00
.listRowBackground(theme.primaryBackgroundColor)
2023-12-19 08:48:12 +00:00
#endif
2023-01-27 19:36:40 +00:00
if subscription.isEnabled {
2023-01-08 09:57:58 +00:00
Section {
Toggle(isOn: .init(get: {
subscription.isMentionNotificationEnabled
}, set: { newValue in
subscription.isMentionNotificationEnabled = newValue
updateSubscription()
})) {
Label("settings.push.mentions", systemImage: "at")
2023-01-08 13:16:43 +00:00
}
Toggle(isOn: .init(get: {
subscription.isFollowNotificationEnabled
}, set: { newValue in
subscription.isFollowNotificationEnabled = newValue
updateSubscription()
})) {
Label("settings.push.follows", systemImage: "person.badge.plus")
2023-01-08 09:22:52 +00:00
}
Toggle(isOn: .init(get: {
subscription.isFavoriteNotificationEnabled
}, set: { newValue in
subscription.isFavoriteNotificationEnabled = newValue
updateSubscription()
})) {
Label("settings.push.favorites", systemImage: "star")
2023-01-08 09:22:52 +00:00
}
Toggle(isOn: .init(get: {
subscription.isReblogNotificationEnabled
}, set: { newValue in
subscription.isReblogNotificationEnabled = newValue
updateSubscription()
})) {
Label("settings.push.boosts", image: "Rocket")
2023-01-08 09:22:52 +00:00
}
Toggle(isOn: .init(get: {
subscription.isPollNotificationEnabled
}, set: { newValue in
subscription.isPollNotificationEnabled = newValue
updateSubscription()
})) {
Label("settings.push.polls", systemImage: "chart.bar")
2023-01-08 13:16:43 +00:00
}
Toggle(isOn: .init(get: {
subscription.isNewPostsNotificationEnabled
}, set: { newValue in
subscription.isNewPostsNotificationEnabled = newValue
updateSubscription()
})) {
Label("settings.push.new-posts", systemImage: "bubble.right")
2023-01-08 09:22:52 +00:00
}
2023-01-08 09:57:58 +00:00
}
2023-12-19 08:48:12 +00:00
#if !os(visionOS)
2023-01-08 09:57:58 +00:00
.listRowBackground(theme.primaryBackgroundColor)
2023-12-19 08:48:12 +00:00
#endif
2023-01-08 09:22:52 +00:00
}
2023-01-27 19:36:40 +00:00
Section {
Button("settings.push.duplicate.button.fix") {
Task {
await subscription.deleteSubscription()
await subscription.updateSubscription()
}
}
} header: {
Text("settings.push.duplicate.title")
} footer: {
Text("settings.push.duplicate.footer")
}
2023-12-19 08:48:12 +00:00
#if !os(visionOS)
.listRowBackground(theme.primaryBackgroundColor)
2023-12-19 08:48:12 +00:00
#endif
2023-01-08 09:22:52 +00:00
}
.navigationTitle("settings.push.navigation-title")
2023-12-19 08:48:12 +00:00
#if !os(visionOS)
2023-01-08 09:22:52 +00:00
.scrollContentBackground(.hidden)
.background(theme.secondaryBackgroundColor)
2023-12-19 08:48:12 +00:00
#endif
.task {
await subscription.fetchSubscription()
2023-01-08 13:16:43 +00:00
}
2023-01-08 09:22:52 +00:00
}
2023-01-17 10:36:01 +00:00
private func updateSubscription() {
Task {
await subscription.updateSubscription()
}
}
2023-01-27 19:36:40 +00:00
private func deleteSubscription() {
2023-01-08 09:22:52 +00:00
Task {
await subscription.deleteSubscription()
2023-01-08 09:22:52 +00:00
}
}
}