NewServerViewModel.swift 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //
  2. // NewServerViewModel.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2020/11/18.
  6. // Copyright © 2020 Fin. All rights reserved.
  7. //
  8. import Foundation
  9. import Moya
  10. import RxCocoa
  11. import RxSwift
  12. import SwiftyJSON
  13. class NewServerViewModel: ViewModel, ViewModelType {
  14. struct Input {
  15. var noticeClick: Driver<Void>
  16. var done: Driver<String>
  17. var viewDidAppear: Driver<Void>
  18. var didScan: Driver<String>
  19. }
  20. struct Output {
  21. var showKeyboard: Driver<Bool>
  22. var notice: Driver<URL>
  23. var urlText: Driver<String>
  24. var showSnackbar: Driver<String>
  25. var pop: Driver<String>
  26. }
  27. private var url: String = ""
  28. let pop = PublishRelay<String>()
  29. func transform(input: Input) -> Output {
  30. let showKeyboard = PublishRelay<Bool>()
  31. let urlText = PublishRelay<String>()
  32. let showSnackbar = PublishRelay<String>()
  33. let notice = input.noticeClick
  34. .map { URL(string: NSLocalizedString("deployUrl"))! }
  35. .asDriver()
  36. input.viewDidAppear
  37. .map { "https://" }
  38. .asObservable()
  39. .take(1)
  40. .subscribe(onNext: { text in
  41. showKeyboard.accept(true)
  42. urlText.accept(text)
  43. }).disposed(by: rx.disposeBag)
  44. input.didScan.compactMap { text in
  45. URL(string: text)
  46. }.drive(onNext: { url in
  47. urlText.accept(url.absoluteString)
  48. }).disposed(by: rx.disposeBag)
  49. input.done
  50. .asObservable()
  51. .flatMapLatest { [weak self] url -> Observable<Result<JSON, ApiError>> in
  52. showKeyboard.accept(false)
  53. if let _ = URL(string: url) {
  54. guard let strongSelf = self else { return .empty() }
  55. strongSelf.url = url
  56. return BarkApi.provider
  57. .request(.ping(baseURL: url))
  58. .filterResponseError()
  59. }
  60. else {
  61. showSnackbar.accept(NSLocalizedString("InvalidURL"))
  62. return .empty()
  63. }
  64. }
  65. .subscribe(onNext: { [weak self] response in
  66. guard let strongSelf = self else { return }
  67. switch response {
  68. case .success:
  69. let server = Server(address: strongSelf.url, key: "")
  70. ServerManager.shared.addServer(server: server)
  71. ServerManager.shared.setCurrentServer(serverId: server.id)
  72. ServerManager.shared.syncAllServers()
  73. strongSelf.pop.accept(strongSelf.url)
  74. showSnackbar.accept(NSLocalizedString("AddedSuccessfully"))
  75. case .failure(let error):
  76. showSnackbar.accept("\(NSLocalizedString("InvalidServer"))\(error.rawString())")
  77. }
  78. }).disposed(by: rx.disposeBag)
  79. return Output(
  80. showKeyboard: showKeyboard.asDriver(onErrorDriveWith: .empty()),
  81. notice: notice,
  82. urlText: urlText.asDriver(onErrorDriveWith: .empty()),
  83. showSnackbar: showSnackbar.asDriver(onErrorDriveWith: .empty()),
  84. pop: pop.asDriver(onErrorDriveWith: .empty())
  85. )
  86. }
  87. }