Alpha 5
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
import AppKit
|
||||
import UserNotifications
|
||||
|
||||
final class MailNotificationDelegate: NSObject, UNUserNotificationCenterDelegate {
|
||||
static let shared = MailNotificationDelegate()
|
||||
|
||||
func userNotificationCenter(
|
||||
_ center: UNUserNotificationCenter,
|
||||
willPresent notification: UNNotification,
|
||||
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
|
||||
) {
|
||||
completionHandler([.banner, .list, .sound])
|
||||
}
|
||||
}
|
||||
|
||||
struct NewMailNotification: Sendable {
|
||||
let sender: String
|
||||
let subject: String
|
||||
}
|
||||
|
||||
@MainActor
|
||||
enum MailNotifications {
|
||||
static let enabledKey = "newMailNotifications"
|
||||
|
||||
static func configure() {
|
||||
UNUserNotificationCenter.current().delegate = MailNotificationDelegate.shared
|
||||
}
|
||||
|
||||
static func requestAuthorization() async -> Bool {
|
||||
let center = UNUserNotificationCenter.current()
|
||||
let settings = await center.notificationSettings()
|
||||
switch settings.authorizationStatus {
|
||||
case .authorized, .provisional:
|
||||
return true
|
||||
case .notDetermined:
|
||||
return (try? await center.requestAuthorization(options: [.alert, .sound])) == true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
static func postNewMail(_ messages: [NewMailNotification], badgeCount: Int) async {
|
||||
guard !messages.isEmpty, UserDefaults.standard.bool(forKey: enabledKey) else { return }
|
||||
guard await requestAuthorization() else { return }
|
||||
|
||||
for message in messages {
|
||||
let content = UNMutableNotificationContent()
|
||||
content.title = String(localized: "Neue Mail")
|
||||
content.subtitle = message.sender.isEmpty
|
||||
? String(localized: "Unbekannter Absender")
|
||||
: message.sender
|
||||
content.body = message.subject.isEmpty
|
||||
? String(localized: "(Ohne Betreff)")
|
||||
: message.subject
|
||||
content.sound = .default
|
||||
content.badge = NSNumber(value: badgeCount)
|
||||
|
||||
let request = UNNotificationRequest(
|
||||
identifier: UUID().uuidString,
|
||||
content: content,
|
||||
trigger: nil
|
||||
)
|
||||
try? await UNUserNotificationCenter.current().add(request)
|
||||
}
|
||||
}
|
||||
|
||||
static func updateBadge(_ count: Int) {
|
||||
NSApp.dockTile.badgeLabel = count > 0 ? String(count) : nil
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user