LNSkillFieldsEditView.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //
  2. // LNSkillFieldsEditView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/1/25.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNSkillFieldsEditView: UIView {
  11. private let stackView = UIStackView()
  12. private let titleLabel = UILabel()
  13. private var fieldViews: [LNSkillFieldBaseEditView] = []
  14. weak var delegate: LNSkillFieldBaseEditViewDelegate?
  15. var hasAllInput: Bool {
  16. fieldViews.first { !$0.hasInput() } == nil
  17. }
  18. var checkAvailable: Bool {
  19. fieldViews.first { !$0.checkAvailable() } == nil
  20. }
  21. var needReview: Bool {
  22. fieldViews.first { $0.needReview } != nil
  23. }
  24. override init(frame: CGRect) {
  25. super.init(frame: frame)
  26. setupViews()
  27. }
  28. func update(_ name: String, fields: [LNSkillEditField]) {
  29. stackView.arrangedSubviews.forEach {
  30. stackView.removeArrangedSubview($0)
  31. $0.removeFromSuperview()
  32. }
  33. titleLabel.text = name
  34. for field in fields {
  35. let view: LNSkillFieldBaseEditView? =
  36. if field.fieldCode == LNSkillEditStaticFieldCode.fieldUnitPrice.rawValue {
  37. LNSkillFieldPriceEditView()
  38. } else {
  39. switch field.type {
  40. case .singleLineText, .number:
  41. LNSkillFieldSingleLineEditView()
  42. case .multiLineText:
  43. LNSkillFieldMultiLineEditView()
  44. case .singleSelection, .multiSelection:
  45. LNSkillFieldSelectionEditView()
  46. case .voice:
  47. LNSkillFieldVoiceEditView()
  48. case .photo:
  49. LNSkillFieldPhotoEditView()
  50. default:
  51. nil
  52. }
  53. }
  54. if let view {
  55. view.delegate = self
  56. view.update(field)
  57. stackView.addArrangedSubview(view)
  58. fieldViews.append(view)
  59. }
  60. }
  61. }
  62. required init?(coder: NSCoder) {
  63. fatalError("init(coder:) has not been implemented")
  64. }
  65. }
  66. extension LNSkillFieldsEditView: LNSkillFieldBaseEditViewDelegate {
  67. func onSkillFieldBaseEditViewInputChanged(view: LNSkillFieldBaseEditView) {
  68. delegate?.onSkillFieldBaseEditViewInputChanged(view: view)
  69. }
  70. }
  71. extension LNSkillFieldsEditView {
  72. private func setupViews() {
  73. layer.cornerRadius = 12
  74. layer.backgroundColor = .fill
  75. let header = buildHeader()
  76. addSubview(header)
  77. header.snp.makeConstraints { make in
  78. make.horizontalEdges.equalToSuperview()
  79. make.top.equalToSuperview()
  80. }
  81. stackView.axis = .vertical
  82. stackView.spacing = 20
  83. addSubview(stackView)
  84. stackView.snp.makeConstraints { make in
  85. make.horizontalEdges.equalToSuperview().inset(16)
  86. make.top.equalTo(header.snp.bottom).offset(10)
  87. make.bottom.equalToSuperview().offset(-10)
  88. }
  89. }
  90. private func buildHeader() -> UIView {
  91. let container = UIView()
  92. container.snp.makeConstraints { make in
  93. make.height.equalTo(46)
  94. }
  95. titleLabel.font = .heading_h2
  96. titleLabel.textColor = .text_5
  97. container.addSubview(titleLabel)
  98. titleLabel.snp.makeConstraints { make in
  99. make.horizontalEdges.equalToSuperview().inset(16)
  100. make.centerY.equalToSuperview()
  101. }
  102. let line = UIView()
  103. line.backgroundColor = .fill_2
  104. container.addSubview(line)
  105. line.snp.makeConstraints { make in
  106. make.horizontalEdges.equalToSuperview().offset(16)
  107. make.bottom.equalToSuperview()
  108. make.height.equalTo(1)
  109. }
  110. return container
  111. }
  112. }