metatext/ServiceLayer/Sources/ServiceLayer/UserNotificationService.swift

56 lines
1.8 KiB
Swift
Raw Normal View History

2020-08-12 07:24:39 +00:00
// Copyright © 2020 Metabolist. All rights reserved.
import Foundation
import Combine
import UserNotifications
2020-09-01 07:33:49 +00:00
public struct UserNotificationService {
let events: AnyPublisher<UserNotificationClient.DelegateEvent, Never>
2020-08-12 07:24:39 +00:00
2020-09-01 07:33:49 +00:00
private let userNotificationClient: UserNotificationClient
2020-09-01 07:33:49 +00:00
public init(environment: AppEnvironment) {
self.userNotificationClient = environment.userNotificationClient
events = userNotificationClient.delegateEvents
2020-08-12 07:24:39 +00:00
}
}
2020-08-31 10:21:01 +00:00
public extension UserNotificationService {
2020-08-12 07:24:39 +00:00
func isAuthorized() -> AnyPublisher<Bool, Error> {
getNotificationSettings()
.map(\.authorizationStatus)
2020-09-01 07:33:49 +00:00
.flatMap { status -> AnyPublisher<Bool, Error> in
2020-08-12 07:24:39 +00:00
if status == .notDetermined {
2020-09-01 07:33:49 +00:00
return requestProvisionalAuthorization().eraseToAnyPublisher()
2020-08-12 07:24:39 +00:00
}
return Just(status == .authorized || status == .provisional)
.setFailureType(to: Error.self)
.eraseToAnyPublisher()
}
.eraseToAnyPublisher()
}
}
private extension UserNotificationService {
2020-08-12 07:24:39 +00:00
func getNotificationSettings() -> AnyPublisher<UNNotificationSettings, Never> {
2020-09-01 07:33:49 +00:00
Future<UNNotificationSettings, Never> { promise in
userNotificationClient.getNotificationSettings { promise(.success($0)) }
2020-08-12 07:24:39 +00:00
}
.eraseToAnyPublisher()
}
func requestProvisionalAuthorization() -> AnyPublisher<Bool, Error> {
2020-09-01 07:33:49 +00:00
Future<Bool, Error> { promise in
userNotificationClient.requestAuthorization([.alert, .sound, .badge, .provisional]) { granted, error in
2020-08-12 07:24:39 +00:00
if let error = error {
return promise(.failure(error))
}
return promise(.success(granted))
}
}
.eraseToAnyPublisher()
}
}