metatext/ViewModels/Sources/ViewModels/NotificationTypesPreferencesViewModel.swift

47 lines
1.6 KiB
Swift
Raw Normal View History

2020-08-14 21:41:55 +00:00
// Copyright © 2020 Metabolist. All rights reserved.
import Foundation
import Combine
2020-08-30 23:33:11 +00:00
import Mastodon
2020-08-31 18:57:02 +00:00
import ServiceLayer
2020-08-14 21:41:55 +00:00
2020-09-01 07:33:49 +00:00
public class NotificationTypesPreferencesViewModel: ObservableObject {
@Published public var pushSubscriptionAlerts: PushSubscription.Alerts
@Published public var alertItem: AlertItem?
2020-08-14 21:41:55 +00:00
private let identityService: IdentityService
private var cancellables = Set<AnyCancellable>()
init(identityService: IdentityService) {
self.identityService = identityService
pushSubscriptionAlerts = identityService.identity.pushSubscriptionAlerts
identityService.$identity
.map(\.pushSubscriptionAlerts)
.dropFirst()
.removeDuplicates()
.assign(to: &$pushSubscriptionAlerts)
$pushSubscriptionAlerts
.dropFirst()
.removeDuplicates()
2020-08-24 05:15:46 +00:00
.sink { [weak self] in self?.update(alerts: $0) }
2020-08-14 21:41:55 +00:00
.store(in: &cancellables)
}
}
private extension NotificationTypesPreferencesViewModel {
func update(alerts: PushSubscription.Alerts) {
guard alerts != identityService.identity.pushSubscriptionAlerts else { return }
identityService.updatePushSubscription(alerts: alerts)
.sink { [weak self] in
guard let self = self, case let .failure(error) = $0 else { return }
self.alertItem = AlertItem(error: error)
self.pushSubscriptionAlerts = self.identityService.identity.pushSubscriptionAlerts
2020-08-26 09:19:38 +00:00
} receiveValue: { _ in }
2020-08-14 21:41:55 +00:00
.store(in: &cancellables)
}
}