import Combine
import Encore
import RevenueCat
import SuperwallKit
@MainActor
final class EntitlementManager: ObservableObject {
@Published var hasProAccess = false
private var cancellables = Set<AnyCancellable>()
private let revenueCatActive = CurrentValueSubject<Bool, Never>(false)
init() {
Purchases.shared.delegate = self
Publishers.CombineLatest3(
revenueCatActive.eraseToAnyPublisher(),
Superwall.shared.$subscriptionStatus,
Encore.shared.isActivePublisher(for: .freeTrial())
)
.map { revenueCat, superwall, encore in
revenueCat || superwall != .inactive || encore
}
.assign(to: \.hasProAccess, on: self)
.store(in: &cancellables)
}
}
extension EntitlementManager: PurchasesDelegate {
nonisolated func purchases(_ purchases: Purchases, receivedUpdated customerInfo: CustomerInfo) {
Task { @MainActor in
revenueCatActive.send(!customerInfo.entitlements.active.isEmpty)
}
}
}