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-08-13 10:18:21 +00:00
|
|
|
|
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()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-08-13 10:18:21 +00:00
|
|
|
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()
|
|
|
|
}
|
|
|
|
}
|