CryptoSettingController.swift 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. //
  2. // CryptoSettingController.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2022/11/10.
  6. // Copyright © 2022 Fin. All rights reserved.
  7. //
  8. import RxSwift
  9. import UIKit
  10. class CryptoSettingController: BaseViewController<CryptoSettingViewModel> {
  11. let algorithmFeild = DropBoxView(values: ["AES128", "AES192", "AES256"])
  12. let modeFeild = DropBoxView(values: ["CBC", "ECB", "GCM"])
  13. let paddingField = DropBoxView(values: ["pkcs7"])
  14. let keyTextField: BorderTextField = {
  15. let textField = BorderTextField(title: "Key")
  16. textField.font = UIFont.systemFont(ofSize: 14)
  17. textField.placeholder = String(format: NSLocalizedString("enterKey"), 16)
  18. return textField
  19. }()
  20. let ivTextField: BorderTextField = {
  21. let textField = BorderTextField(title: "IV")
  22. textField.font = UIFont.systemFont(ofSize: 14)
  23. textField.placeholder = String(format: NSLocalizedString("enterIv"), 16) // todo: update iv length
  24. return textField
  25. }()
  26. let doneButton: BKButton = {
  27. let btn = BKButton()
  28. btn.setTitle(NSLocalizedString("done"), for: .normal)
  29. btn.setTitleColor(BKColor.lightBlue.darken3, for: .normal)
  30. btn.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
  31. btn.fontSize = 14
  32. return btn
  33. }()
  34. let copyButton: UIButton = {
  35. let btn = GradientButton()
  36. btn.setTitle(NSLocalizedString("copyExample"), for: .normal)
  37. btn.setTitleColor(UIColor.white, for: .normal)
  38. btn.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: .medium)
  39. btn.layer.cornerRadius = 8
  40. btn.clipsToBounds = true
  41. btn.applyGradient(
  42. withColours: [
  43. UIColor(r255: 36, g255: 51, b255: 236),
  44. UIColor(r255: 70, g255: 44, b255: 233),
  45. ],
  46. gradientOrientation: .horizontal
  47. )
  48. return btn
  49. }()
  50. let scrollView = UIScrollView()
  51. override func viewDidAppear(_ animated: Bool) {
  52. super.viewDidAppear(animated)
  53. }
  54. override func makeUI() {
  55. self.title = NSLocalizedString("encryptionSettings")
  56. self.navigationItem.setRightBarButtonItem(item: UIBarButtonItem(customView: doneButton))
  57. self.view.addSubview(scrollView)
  58. scrollView.snp.makeConstraints { make in
  59. make.edges.equalToSuperview()
  60. }
  61. func getTitleLabel(title: String) -> UILabel {
  62. let label = UILabel()
  63. label.font = UIFont.systemFont(ofSize: 14)
  64. label.textColor = BKColor.grey.darken4
  65. label.text = title
  66. return label
  67. }
  68. let algorithmLabel = getTitleLabel(title: NSLocalizedString("algorithm"))
  69. let modeLabel = getTitleLabel(title: NSLocalizedString("mode"))
  70. let paddingLabel = getTitleLabel(title: "Padding")
  71. let keyLabel = getTitleLabel(title: "Key")
  72. let ivLabel = getTitleLabel(title: "Iv")
  73. self.scrollView.addSubview(algorithmLabel)
  74. self.scrollView.addSubview(algorithmFeild)
  75. self.scrollView.addSubview(modeLabel)
  76. self.scrollView.addSubview(modeFeild)
  77. self.scrollView.addSubview(paddingLabel)
  78. self.scrollView.addSubview(paddingField)
  79. self.scrollView.addSubview(keyLabel)
  80. self.scrollView.addSubview(keyTextField)
  81. self.scrollView.addSubview(ivLabel)
  82. self.scrollView.addSubview(ivTextField)
  83. self.scrollView.addSubview(copyButton)
  84. self.view.backgroundColor = UIColor.white
  85. algorithmLabel.snp.makeConstraints { make in
  86. make.top.equalTo(24)
  87. make.left.equalTo(24)
  88. }
  89. algorithmFeild.snp.makeConstraints { make in
  90. make.top.equalTo(algorithmLabel.snp.bottom).offset(5)
  91. make.left.equalTo(20)
  92. make.right.equalTo(-20)
  93. make.height.equalTo(45)
  94. make.width.equalToSuperview().offset(-40)
  95. }
  96. modeLabel.snp.makeConstraints { make in
  97. make.top.equalTo(algorithmFeild.snp.bottom).offset(20)
  98. make.left.equalTo(algorithmLabel)
  99. }
  100. modeFeild.snp.makeConstraints { make in
  101. make.left.right.height.equalTo(algorithmFeild)
  102. make.top.equalTo(modeLabel.snp.bottom).offset(5)
  103. }
  104. paddingLabel.snp.makeConstraints { make in
  105. make.top.equalTo(modeFeild.snp.bottom).offset(20)
  106. make.left.equalTo(algorithmLabel)
  107. }
  108. paddingField.snp.makeConstraints { make in
  109. make.left.right.height.equalTo(modeFeild)
  110. make.top.equalTo(paddingLabel.snp.bottom).offset(5)
  111. }
  112. keyLabel.snp.makeConstraints { make in
  113. make.top.equalTo(paddingField.snp.bottom).offset(20)
  114. make.left.equalTo(algorithmLabel)
  115. }
  116. keyTextField.snp.makeConstraints { make in
  117. make.left.right.height.equalTo(paddingField)
  118. make.top.equalTo(keyLabel.snp.bottom).offset(5)
  119. }
  120. ivLabel.snp.makeConstraints { make in
  121. make.top.equalTo(keyTextField.snp.bottom).offset(20)
  122. make.left.equalTo(algorithmLabel)
  123. }
  124. ivTextField.snp.makeConstraints { make in
  125. make.left.right.height.equalTo(keyTextField)
  126. make.top.equalTo(ivLabel.snp.bottom).offset(5)
  127. }
  128. copyButton.snp.makeConstraints { make in
  129. make.left.equalTo(ivTextField)
  130. make.right.equalTo(ivTextField)
  131. make.height.equalTo(42)
  132. make.top.equalTo(ivTextField.snp.bottom).offset(25)
  133. make.bottom.equalToSuperview().offset(-20)
  134. }
  135. self.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(resign)))
  136. }
  137. @objc func resign() {
  138. self.view.endEditing(true)
  139. }
  140. override func viewDidLoad() {
  141. super.viewDidLoad()
  142. self.view.backgroundColor = BKColor.white
  143. }
  144. override func bindViewModel() {
  145. func getFieldValues() -> CryptoSettingFields {
  146. return CryptoSettingFields(
  147. algorithm: self.algorithmFeild.currentValue!,
  148. mode: self.modeFeild.currentValue!,
  149. padding: self.paddingField.currentValue!,
  150. key: self.keyTextField.text,
  151. iv: self.ivTextField.text
  152. )
  153. }
  154. let output = viewModel.transform(input: CryptoSettingViewModel.Input(
  155. algorithmChanged: self.algorithmFeild
  156. .rx
  157. .currentValueChanged
  158. .compactMap { $0 }
  159. .asDriver(onErrorDriveWith: .empty()),
  160. copyScript: copyButton
  161. .rx
  162. .tap
  163. .map { getFieldValues() }
  164. .asDriver(onErrorDriveWith: .empty()),
  165. done: doneButton
  166. .rx
  167. .tap
  168. .map { getFieldValues() }
  169. .asDriver(onErrorDriveWith: .empty())
  170. ))
  171. output.initial.drive(onNext: { [weak self] val in
  172. self?.algorithmFeild.values = val.algorithmList.map { $0.rawValue }
  173. self?.modeFeild.values = val.modeList
  174. self?.paddingField.values = val.paddingList
  175. if let fields = val.initialFields {
  176. self?.algorithmFeild.currentValue = fields.algorithm
  177. self?.modeFeild.currentValue = fields.mode
  178. self?.paddingField.currentValue = fields.padding
  179. self?.keyTextField.text = fields.key
  180. self?.ivTextField.text = fields.iv
  181. }
  182. }).disposed(by: rx.disposeBag)
  183. output.modeListChanged
  184. .drive(self.modeFeild.rx.values)
  185. .disposed(by: rx.disposeBag)
  186. output.paddingListChanged
  187. .drive(self.paddingField.rx.values)
  188. .disposed(by: rx.disposeBag)
  189. output.keyLengthChanged.drive(onNext: { [weak self] keyLength in
  190. self?.keyTextField.placeholder = String(format: NSLocalizedString("enterKey"), keyLength)
  191. }).disposed(by: rx.disposeBag)
  192. output.showSnackbar.drive(onNext: { text in
  193. HUDError(text)
  194. }).disposed(by: rx.disposeBag)
  195. output.done.drive(onNext: { [weak self] in
  196. self?.navigationController?.dismiss(animated: true)
  197. }).disposed(by: rx.disposeBag)
  198. output.copy.drive(onNext: { text in
  199. UIPasteboard.general.string = text
  200. HUDSuccess(NSLocalizedString("Copy"))
  201. }).disposed(by: rx.disposeBag)
  202. }
  203. }