// // ServerPanelPresenter.swift // PrivadoVPN // // Created by Juraldinio on 1/31/21. // Copyright © 2021 Privado LLC. All rights reserved. // import Foundation enum ServerPanelState { case undefined case selected(country: String, city: String, flag: String) case overqoute(country: String, city: String, flag: String) } protocol ServerPanelOutput: AnyObject { var updateEmitter: Emitter { get } func update(for panel: ServerPanelInput) func selectRequired(from panel: ServerPanelInput) } protocol ServerPanelInput: AnyObject { func update(state: ServerPanelState) } final class ServerPanelPresenter { private weak var output: ServerPanelOutput? weak var viewInput: ServerPanelViewInput? // MARK: - Init init(output: ServerPanelOutput?) { self.output = output output?.updateEmitter.addReaction { [weak self] in guard let self = self else { return false } self.output?.update(for: self) return true } guard let session = try? Session.instance() else { return } session.vpnConnectionStateEmitter.addReaction { [weak self, weak session] state, _ in guard let session = session else { self?.viewInput?.countryCircle(isHighlited: false) return self.isExist } self?.viewInput?.countryCircle(isHighlited: state == .connected) // self?.viewInput?.selection(enabled: state == .disconnected && session.currentRecord.isExist) return self.isExist } } } // MARK: - ServerPanelInput extension ServerPanelPresenter: ServerPanelInput { func update(state: ServerPanelState) { switch state { case .undefined: self.viewInput?.hide() case let .selected(country: countryCode, city: city, flag: flag): self.viewInput?.useHandCursor(enable: true) self.viewInput?.show(country: CountryResolver.name(from: countryCode), city: city, flag: flag) case let .overqoute(country: countryCode, city: city, flag: flag): self.viewInput?.useHandCursor(enable: true) self.viewInput?.show(country: CountryResolver.name(from: countryCode), city: city, flag: flag) } } } // MARK: - ServerPanelViewOutput extension ServerPanelPresenter: ServerPanelViewOutput { func viewIsReady() { self.output?.update(for: self) } func viewWillDisappear() { } func serverSelectRequired() { self.output?.selectRequired(from: self) } }