// // UpdateWalletStateService.swift // Malinka // // Created by Juraldinio on 11/14/22. // Copyright © 2022 NUT.Tech. All rights reserved. // import Foundation import Combine import WalletKit final class UpdateWalletStateService { // MARK: - Constants private enum Constants { static let timerInterval = 3 static let maximumRefreshCount = 5 } // MARK: - Properties private let status: CurrentValueSubject private var timerPublisher: DispatchTimer? private var refreshStatus: AnyCancellable? var statusPublisher: AnyPublisher { self.status.eraseToAnyPublisher() } // MARK: - Init init(bank: Bank, wallet: WalletKit.Wallet) { self.status = CurrentValueSubject(wallet) let publisher = Publishers.timer(queue: DispatchQueue.global(qos: .background), interval: .seconds(Constants.timerInterval), times: .max(Constants.maximumRefreshCount)) self.timerPublisher = publisher self.refreshStatus = publisher.sink(receiveCompletion: { [weak self] _ in self?.status.send(wallet) self?.status.send(completion: .finished) }, receiveValue: { [weak self] _ in self?.updateState(for: wallet, in: bank) }) } // MARK: - Private private func updateState(for wallet: WalletKit.Wallet, in bank: Bank) { Task { try await bank.refreshStatus(wallet: wallet) } self.status.send(wallet) guard wallet.isOnCreationState else { self.refreshStatus?.cancel() self.refreshStatus = nil self.status.send(completion: .finished) return } } }