Checks for notification permissions
If notifications are authorised, the toggle will work. Otherwise, an alert is shown giving the user required information to enable notifications.
This commit is contained in:
parent
62ed7492eb
commit
aa0a5d2269
|
@ -10,6 +10,7 @@ import AppKit
|
||||||
import Articles
|
import Articles
|
||||||
import Account
|
import Account
|
||||||
import RSCore
|
import RSCore
|
||||||
|
import UserNotifications
|
||||||
|
|
||||||
extension Notification.Name {
|
extension Notification.Name {
|
||||||
public static let DidUpdateFeedPreferencesFromContextMenu = Notification.Name(rawValue: "DidUpdateFeedPreferencesFromContextMenu")
|
public static let DidUpdateFeedPreferencesFromContextMenu = Notification.Name(rawValue: "DidUpdateFeedPreferencesFromContextMenu")
|
||||||
|
@ -108,9 +109,29 @@ extension SidebarViewController {
|
||||||
let feed = item.representedObject as? WebFeed else {
|
let feed = item.representedObject as? WebFeed else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
|
||||||
|
if settings.authorizationStatus == .denied {
|
||||||
|
self.showNotificationsNotEnabledAlert()
|
||||||
|
} else if settings.authorizationStatus == .authorized {
|
||||||
|
DispatchQueue.main.async {
|
||||||
feed.isNotifyAboutNewArticles?.toggle()
|
feed.isNotifyAboutNewArticles?.toggle()
|
||||||
NotificationCenter.default.post(Notification(name: .DidUpdateFeedPreferencesFromContextMenu))
|
NotificationCenter.default.post(Notification(name: .DidUpdateFeedPreferencesFromContextMenu))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert]) { (granted, error) in
|
||||||
|
if granted {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
feed.isNotifyAboutNewArticles?.toggle()
|
||||||
|
NotificationCenter.default.post(Notification(name: .DidUpdateFeedPreferencesFromContextMenu))
|
||||||
|
NSApplication.shared.registerForRemoteNotifications()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.showNotificationsNotEnabledAlert()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@objc func toggleArticleExtractorFromContextMenu(_ sender: Any?) {
|
@objc func toggleArticleExtractorFromContextMenu(_ sender: Any?) {
|
||||||
guard let item = sender as? NSMenuItem,
|
guard let item = sender as? NSMenuItem,
|
||||||
|
@ -121,6 +142,25 @@ extension SidebarViewController {
|
||||||
NotificationCenter.default.post(Notification(name: .DidUpdateFeedPreferencesFromContextMenu))
|
NotificationCenter.default.post(Notification(name: .DidUpdateFeedPreferencesFromContextMenu))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func showNotificationsNotEnabledAlert() {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
let alert = NSAlert()
|
||||||
|
alert.messageText = NSLocalizedString("Notifications are not enabled", comment: "Notifications are not enabled.")
|
||||||
|
alert.informativeText = NSLocalizedString("You can enable NetNewsWire notifications in System Preferences.", comment: "Notifications are not enabled.")
|
||||||
|
alert.addButton(withTitle: NSLocalizedString("Open System Preferences", comment: "Open System Preferences"))
|
||||||
|
alert.addButton(withTitle: NSLocalizedString("Dismiss", comment: "Dismiss"))
|
||||||
|
let userChoice = alert.runModal()
|
||||||
|
if userChoice == .alertFirstButtonReturn {
|
||||||
|
let config = NSWorkspace.OpenConfiguration()
|
||||||
|
config.activates = true
|
||||||
|
// If System Preferences is already open, and no delay is provided here, then it appears in the foreground and immediately disappears.
|
||||||
|
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.2, execute: {
|
||||||
|
NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.preference.notifications")!, configuration: config)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension SidebarViewController: RenameWindowControllerDelegate {
|
extension SidebarViewController: RenameWindowControllerDelegate {
|
||||||
|
|
Loading…
Reference in New Issue