// // NewServerViewModel.swift // Bark // // Created by huangfeng on 2020/11/18. // Copyright © 2020 Fin. All rights reserved. // import Foundation import Moya import RxCocoa import RxSwift import SwiftyJSON class NewServerViewModel: ViewModel, ViewModelType { struct Input { var noticeClick: Driver var done: Driver var viewDidAppear: Driver var didScan: Driver } struct Output { var showKeyboard: Driver var notice: Driver var urlText: Driver var showSnackbar: Driver var pop: Driver } private var url: String = "" let pop = PublishRelay() func transform(input: Input) -> Output { let showKeyboard = PublishRelay() let urlText = PublishRelay() let showSnackbar = PublishRelay() let notice = input.noticeClick .map { URL(string: NSLocalizedString("deployUrl"))! } .asDriver() input.viewDidAppear .map { "https://" } .asObservable() .take(1) .subscribe(onNext: { text in showKeyboard.accept(true) urlText.accept(text) }).disposed(by: rx.disposeBag) input.didScan.compactMap { text in URL(string: text) }.drive(onNext: { url in urlText.accept(url.absoluteString) }).disposed(by: rx.disposeBag) input.done .asObservable() .flatMapLatest { [weak self] url -> Observable> in showKeyboard.accept(false) if let _ = URL(string: url) { guard let strongSelf = self else { return .empty() } strongSelf.url = url return BarkApi.provider .request(.ping(baseURL: url)) .filterResponseError() } else { showSnackbar.accept(NSLocalizedString("InvalidURL")) return .empty() } } .subscribe(onNext: { [weak self] response in guard let strongSelf = self else { return } switch response { case .success: let server = Server(address: strongSelf.url, key: "") ServerManager.shared.addServer(server: server) ServerManager.shared.setCurrentServer(serverId: server.id) ServerManager.shared.syncAllServers() strongSelf.pop.accept(strongSelf.url) showSnackbar.accept(NSLocalizedString("AddedSuccessfully")) case .failure(let error): showSnackbar.accept("\(NSLocalizedString("InvalidServer"))\(error.rawString())") } }).disposed(by: rx.disposeBag) return Output( showKeyboard: showKeyboard.asDriver(onErrorDriveWith: .empty()), notice: notice, urlText: urlText.asDriver(onErrorDriveWith: .empty()), showSnackbar: showSnackbar.asDriver(onErrorDriveWith: .empty()), pop: pop.asDriver(onErrorDriveWith: .empty()) ) } }