Bark/Controller/NewServerViewController.swift
2025-09-05 11:47:32 +08:00

145 lines
5.1 KiB
Swift

//
// NewServerViewController.swift
// Bark
//
// Created by huangfeng on 2018/6/25.
// Copyright © 2018 Fin. All rights reserved.
//
import Material
import RxCocoa
import RxSwift
import SafariServices
import SnapKit
import UIKit
class NewServerViewController: BaseViewController<NewServerViewModel> {
let scanButton: BKButton = {
let button = BKButton()
button.setImage(UIImage(named: "baseline_qr_code_scanner_black_24pt"), for: .normal)
button.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
button.hitTestSlop = UIEdgeInsets(top: -10, left: -10, bottom: -10, right: -10)
button.tintColor = BKColor.grey.darken3
button.isAccessibilityElement = false
return button
}()
lazy var addressTextField: TextField = {
let textField = TextField()
textField.keyboardType = .URL
textField.placeholder = "ServerAddress".localized
textField.detail = "ServerExample".localized
textField.transition([.scale(0.85), .opacity(0)])
textField.detailLabel.transition([.scale(0.85), .opacity(0)])
textField.textColor = BKColor.grey.darken4
textField.placeholderNormalColor = BKColor.grey.base
textField.detailLabel.textColor = BKColor.grey.base
textField.rightView?.grid.views = [scanButton]
textField.rightViewMode = .whileEditing
return textField
}()
let noticeLabel: UILabel = {
let label = UILabel()
label.text = "DeploymentDocuments".localized
label.textColor = BKColor.blue.base
label.font = UIFont.preferredFont(ofSize: 12)
label.adjustsFontForContentSizeCategory = true
label.transition([.scale(0.85), .opacity(0), .translate(x: 50)])
label.isUserInteractionEnabled = true
label.addGestureRecognizer(UITapGestureRecognizer())
return label
}()
lazy var doneButton: BKButton = {
let doneButton = BKButton()
doneButton.setImage(Icon.check, for: .normal)
doneButton.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
navigationItem.setRightBarButtonItem(item: UIBarButtonItem(customView: doneButton))
doneButton.tintColor = BKColor.grey.darken4
return doneButton
}()
override func makeUI() {
self.navigationItem.largeTitleDisplayMode = .never
navigationItem.title = "AddServer".localized
self.view.layout(addressTextField)
.top(kNavigationHeight + 40).left(10).right(10)
self.view.addSubview(noticeLabel)
noticeLabel.snp.makeConstraints { make in
make.top.equalTo(self.addressTextField.snp.bottom).offset(40)
make.left.equalTo(self.addressTextField)
}
}
override func bindViewModel() {
//
let noticeTap = noticeLabel.gestureRecognizers!.first!.rx
.event
.map { _ in
()
}
.asDriver(onErrorJustReturn: ())
//
let done = doneButton.rx.tap
.map { [weak self] in
self?.addressTextField.text ?? ""
}
.asDriver(onErrorDriveWith: .empty())
//
let viewDidAppear = rx
.methodInvoked(#selector(viewDidAppear(_:)))
.map { _ in () }
.asDriver(onErrorDriveWith: .empty())
//
let scannerDidScan = self.scanButton.rx.tap.flatMapLatest { [weak self] _ -> Observable<String> in
let controller = QRScannerViewController()
self?.navigationController?.present(controller, animated: true, completion: nil)
return controller.scannerDidSuccess
}.asDriver(onErrorDriveWith: .empty())
let output = viewModel.transform(
input: NewServerViewModel.Input(
noticeClick: noticeTap,
done: done,
viewDidAppear: viewDidAppear,
didScan: scannerDidScan
))
//
output.showKeyboard.drive(onNext: { [weak self] show in
if show {
_ = self?.addressTextField.becomeFirstResponder()
} else {
self?.addressTextField.resignFirstResponder()
}
}).disposed(by: rx.disposeBag)
//
output.notice.drive(onNext: { [weak self] url in
self?.navigationController?.present(BarkSFSafariViewController(url: url), animated: true, completion: nil)
}).disposed(by: rx.disposeBag)
// URL
output.urlText
.drive(self.addressTextField.rx.text)
.disposed(by: rx.disposeBag)
// 退
output.pop.drive(onNext: { [weak self] _ in
self?.navigationController?.popViewController(animated: true)
}).disposed(by: rx.disposeBag)
//
output.showSnackbar.drive(onNext: { [weak self] text in
self?.showSnackbar(text: text)
}).disposed(by: rx.disposeBag)
}
}