LNSkillFieldBaseEditView.swift 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. //
  2. // LNSkillFieldBaseEditView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/1/21.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. protocol LNSkillFieldBaseEditViewDelegate: AnyObject {
  11. func onSkillFieldBaseEditViewInputChanged(view: LNSkillFieldBaseEditView)
  12. }
  13. class LNSkillFieldBaseEditView: LNJoinUsInputFieldGroupView {
  14. private(set) var field: LNSkillEditField?
  15. var needReview: Bool = false
  16. weak var delegate: LNSkillFieldBaseEditViewDelegate?
  17. func update(_ field: LNSkillEditField) {
  18. titleLabel.text = field.fieldName
  19. descLabel.text = field.fieldDesc
  20. descLabel.isHidden = field.fieldDesc.isEmpty
  21. if let example = field.example, !example.value.isEmpty {
  22. showExample {
  23. switch example.type {
  24. case .photo:
  25. let panel = LNJoinUsPhotoExamplePanel()
  26. panel.update(example)
  27. panel.popup()
  28. case .voice:
  29. let panel = LNJoinUsVoiceExamplePanel()
  30. panel.update(example)
  31. panel.popup()
  32. }
  33. }
  34. }
  35. self.field = field
  36. }
  37. func hasInput() -> Bool {
  38. guard let field else { return false }
  39. if !field.validate.required {
  40. return true
  41. }
  42. return field.value != nil
  43. }
  44. func checkAvailable() -> Bool {
  45. guard let field else { return false }
  46. if !field.validate.required {
  47. return true
  48. }
  49. let isMatchLimit = if field.array {
  50. checkArrayAvailable()
  51. } else {
  52. checkValueAvailable()
  53. }
  54. return isMatchLimit
  55. }
  56. private func checkArrayAvailable() -> Bool {
  57. guard let field else { return false }
  58. if !field.validate.required {
  59. return true
  60. }
  61. guard let limit = field.validate.arraySize else {
  62. if field.value == nil {
  63. showToast(.init(key: "B00064", field.fieldName))
  64. return false
  65. } else {
  66. return true
  67. }
  68. }
  69. let count = if let texts = field.value as? [String] {
  70. texts.count
  71. } else if let numbers = field.value as? [Int] {
  72. numbers.count
  73. } else if let numbers = field.value as? [Double] {
  74. numbers.count
  75. } else {
  76. 0
  77. }
  78. if count < limit.min {
  79. showToast(.init(key: "B00059", limit.min, field.fieldName))
  80. return false
  81. } else if count > limit.max {
  82. return false
  83. } else {
  84. return true
  85. }
  86. }
  87. private func checkValueAvailable() -> Bool {
  88. guard let field else { return false }
  89. if !field.validate.required {
  90. return true
  91. }
  92. switch field.type {
  93. case .singleLineText, .multiLineText:
  94. guard let text = field.value as? String else {
  95. showToast(.init(key: "B00065", field.fieldName))
  96. return false
  97. }
  98. guard let size = field.validate.size else {
  99. return true
  100. }
  101. if text.count < size.min {
  102. showToast(.init(key: "B00066", field.fieldName, size.min))
  103. return false
  104. } else if text.count > size.max {
  105. return false
  106. } else {
  107. return true
  108. }
  109. case .singleSelection:
  110. if field.value == nil {
  111. showToast(.init(key: "B00064", field.fieldName))
  112. return false
  113. } else {
  114. return true
  115. }
  116. case .multiSelection:
  117. if (field.value as? [String])?.isEmpty != false {
  118. showToast(.init(key: "B00064", field.fieldName))
  119. return false
  120. } else {
  121. return true
  122. }
  123. case .number:
  124. guard let limit = field.validate.numLimit else {
  125. if field.value == nil {
  126. showToast(.init(key: "B00065", field.fieldName))
  127. return false
  128. } else {
  129. return true
  130. }
  131. }
  132. if let number = field.value as? Int {
  133. if Double(number) < limit.min {
  134. showToast(.init(key: "B00067", field.fieldName, limit.min.toDisplay))
  135. return false
  136. } else if Double(number) > limit.max {
  137. showToast(.init(key: "B00068", field.fieldName, limit.max.toDisplay))
  138. return false
  139. } else {
  140. return true
  141. }
  142. } else if let number = field.value as? Double {
  143. if number < limit.min {
  144. showToast(.init(key: "B00067", field.fieldName, limit.min.toDisplay))
  145. return false
  146. } else if number > limit.max {
  147. showToast(.init(key: "B00068", field.fieldName, limit.max.toDisplay))
  148. return false
  149. } else {
  150. return true
  151. }
  152. } else {
  153. return false
  154. }
  155. case .photo:
  156. if (field.value as? [String])?.isEmpty != false {
  157. showToast(.init(key: "B00069", field.fieldName))
  158. return false
  159. } else {
  160. return true
  161. }
  162. case .voice:
  163. guard (field.value as? String)?.isEmpty == false else {
  164. showToast(.init(key: "B00070", field.fieldName))
  165. return false
  166. }
  167. guard let limit = field.validate.numLimit else {
  168. return true
  169. }
  170. if Double(field.duration) < limit.min {
  171. showToast(.init(key: "B00009", limit.max))
  172. return false
  173. // } else if Double(field.duration) > limit.max {
  174. // return false
  175. } else {
  176. return true
  177. }
  178. case .unknown:
  179. return false
  180. }
  181. }
  182. }