Skip to content
Snippets Groups Projects
SearchContainerViewModel.swift 1.63 KiB
Newer Older
import UIKit
import Combine
import Defaults
import XXClient
Bruno Muniz's avatar
Bruno Muniz committed
import PushFeature
Bruno Muniz's avatar
Bruno Muniz committed
import DI

final class SearchContainerViewModel {
    @Dependency var pushHandler: PushHandling
    @Dependency var dummyTrafficManager: DummyTraffic
Bruno Muniz's avatar
Bruno Muniz committed
    @KeyObject(.dummyTrafficOn, defaultValue: false) var dummyTrafficOn
    @KeyObject(.pushNotifications, defaultValue: false) var pushNotifications
    @KeyObject(.askedDummyTrafficOnce, defaultValue: false) var offeredCoverTraffic

    var coverTrafficPublisher: AnyPublisher<Void, Never> {
        coverTrafficSubject.eraseToAnyPublisher()
    }

    private let coverTrafficSubject = PassthroughSubject<Void, Never>()

    func didAppear() {
        verifyCoverTraffic()
        verifyNotifications()
    }

    func didEnableCoverTraffic() {
        try! dummyTrafficManager.setStatus(true)
        dummyTrafficOn = true
    }

    private func verifyCoverTraffic() {
        guard offeredCoverTraffic == false else { return }
        offeredCoverTraffic = true
        coverTrafficSubject.send()
    }

    private func verifyNotifications() {
        guard pushNotifications == false else { return }

        pushHandler.requestAuthorization { [weak self] result in
Bruno Muniz's avatar
Bruno Muniz committed
            guard let self else { return }

            switch result {
            case .success(let granted):
                if granted {
                    DispatchQueue.main.async {
                        UIApplication.shared.registerForRemoteNotifications()
                    }
                }

                self.pushNotifications = granted
            case .failure:
                self.pushNotifications = false
            }
        }
    }
}