// Copyright © 2020 Metabolist. All rights reserved. import Foundation import Combine import UserNotifications public struct UserNotificationService { let events: AnyPublisher private let userNotificationClient: UserNotificationClient public init(environment: AppEnvironment) { self.userNotificationClient = environment.userNotificationClient events = userNotificationClient.delegateEvents } } public extension UserNotificationService { func isAuthorized() -> AnyPublisher { getNotificationSettings() .map(\.authorizationStatus) .flatMap { status -> AnyPublisher in if status == .notDetermined { return requestProvisionalAuthorization().eraseToAnyPublisher() } return Just(status == .authorized || status == .provisional) .setFailureType(to: Error.self) .eraseToAnyPublisher() } .eraseToAnyPublisher() } } private extension UserNotificationService { func getNotificationSettings() -> AnyPublisher { Future { promise in userNotificationClient.getNotificationSettings { promise(.success($0)) } } .eraseToAnyPublisher() } func requestProvisionalAuthorization() -> AnyPublisher { Future { promise in userNotificationClient.requestAuthorization([.alert, .sound, .badge, .provisional]) { granted, error in if let error = error { return promise(.failure(error)) } return promise(.success(granted)) } } .eraseToAnyPublisher() } }