LNSkillUserInfoView.swift 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. //
  2. // LNSkillUserInfoView.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/15.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNSkillUserInfoView: UIView {
  11. private let userNameLabel = UILabel()
  12. private let genderView = LNGenderView()
  13. private let idLabel = UILabel()
  14. private let locationLabel = UILabel()
  15. private let languageLabel = UILabel()
  16. private let scoreLabel = UILabel()
  17. private let orderCountLabel = UILabel()
  18. private var curDetail: LNGameMateSkillDetailVO?
  19. override init(frame: CGRect) {
  20. super.init(frame: frame)
  21. setupViews()
  22. }
  23. func update(_ detail: LNGameMateSkillDetailVO) {
  24. userNameLabel.text = detail.nickname
  25. genderView.update(detail.gender, detail.age)
  26. scoreLabel.text = "\(detail.star)"
  27. orderCountLabel.text = "\(detail.orderCount)"
  28. locationLabel.text = "\(detail.distance)km"
  29. idLabel.text = "ID \(detail.userNo)"
  30. languageLabel.text = detail.languageNames.joined(separator: " / ")
  31. curDetail = detail
  32. }
  33. required init?(coder: NSCoder) {
  34. fatalError("init(coder:) has not been implemented")
  35. }
  36. }
  37. extension LNSkillUserInfoView {
  38. private func setupViews() {
  39. let star = buildStarView()
  40. addSubview(star)
  41. star.snp.makeConstraints { make in
  42. make.trailing.equalToSuperview().offset(-16)
  43. make.bottom.equalToSuperview().offset(-8)
  44. }
  45. let userView = buildUserInfo()
  46. addSubview(userView)
  47. userView.snp.makeConstraints { make in
  48. make.leading.equalToSuperview().offset(16)
  49. make.verticalEdges.equalToSuperview()
  50. make.trailing.lessThanOrEqualTo(star.snp.leading).offset(-10)
  51. }
  52. }
  53. private func buildUserInfo() -> UIView {
  54. let userView = UIStackView()
  55. userView.axis = .vertical
  56. userView.spacing = 2
  57. userView.alignment = .leading
  58. let nameView = UIView()
  59. userView.addArrangedSubview(nameView)
  60. userNameLabel.font = .heading_h2
  61. userNameLabel.textColor = .text_1
  62. nameView.addSubview(userNameLabel)
  63. userNameLabel.snp.makeConstraints { make in
  64. make.leading.equalToSuperview()
  65. make.verticalEdges.equalToSuperview()
  66. }
  67. nameView.addSubview(genderView)
  68. genderView.snp.makeConstraints { make in
  69. make.centerY.equalTo(userNameLabel)
  70. make.leading.equalTo(userNameLabel.snp.trailing).offset(4)
  71. make.trailing.lessThanOrEqualToSuperview()
  72. }
  73. let idView = UIView()
  74. userView.addArrangedSubview(idView)
  75. let locationIc = UIImageView()
  76. locationIc.image = .init(named: "ic_location")?.withRenderingMode(.alwaysTemplate)
  77. locationIc.tintColor = .text_2
  78. idView.addSubview(locationIc)
  79. locationIc.snp.makeConstraints { make in
  80. make.leading.equalToSuperview()
  81. make.verticalEdges.equalToSuperview()
  82. make.width.height.equalTo(16)
  83. }
  84. locationLabel.font = .body_s
  85. locationLabel.textColor = .text_2
  86. idView.addSubview(locationLabel)
  87. locationLabel.snp.makeConstraints { make in
  88. make.centerY.equalToSuperview()
  89. make.leading.equalTo(locationIc.snp.trailing).offset(4)
  90. }
  91. idLabel.font = .body_s
  92. idLabel.textColor = .text_2
  93. idView.addSubview(idLabel)
  94. idLabel.snp.makeConstraints { make in
  95. make.leading.equalTo(locationLabel.snp.trailing).offset(13)
  96. make.centerY.equalToSuperview()
  97. }
  98. let copyButton = UIButton()
  99. copyButton.setImage(.init(named: "ic_copy_right"), for: .normal)
  100. copyButton.addAction(UIAction(handler: { [weak self] _ in
  101. guard let self else { return }
  102. guard let curDetail else { return }
  103. let pasteboard = UIPasteboard.general
  104. pasteboard.string = curDetail.userNo
  105. showToast(.init(key: "A00047"))
  106. }), for: .touchUpInside)
  107. idView.addSubview(copyButton)
  108. copyButton.snp.makeConstraints { make in
  109. make.centerY.equalToSuperview()
  110. make.leading.equalTo(idLabel.snp.trailing).offset(4)
  111. make.trailing.equalToSuperview()
  112. make.width.height.equalTo(16)
  113. }
  114. let languageView = UIView()
  115. userView.addArrangedSubview(languageView)
  116. let languageIc = UIImageView()
  117. languageIc.image = .init(named: "ic_language")?.withRenderingMode(.alwaysTemplate)
  118. languageIc.tintColor = .text_2
  119. languageView.addSubview(languageIc)
  120. languageIc.snp.makeConstraints { make in
  121. make.leading.verticalEdges.equalToSuperview()
  122. }
  123. languageLabel.font = .body_s
  124. languageLabel.textColor = .text_2
  125. languageView.addSubview(languageLabel)
  126. languageLabel.snp.makeConstraints { make in
  127. make.centerY.equalToSuperview()
  128. make.trailing.lessThanOrEqualToSuperview()
  129. make.leading.equalTo(languageIc.snp.trailing).offset(4)
  130. }
  131. return userView
  132. }
  133. private func buildStarView() -> UIView {
  134. let container = UIView()
  135. scoreLabel.font = .heading_h2
  136. scoreLabel.textColor = .text_1
  137. container.addSubview(scoreLabel)
  138. scoreLabel.snp.makeConstraints { make in
  139. make.top.equalToSuperview()
  140. make.trailing.equalToSuperview()
  141. }
  142. let star = LNStarScoreView()
  143. star.icSize = 18
  144. star.score = 1.0
  145. container.addSubview(star)
  146. star.snp.makeConstraints { make in
  147. make.leading.equalToSuperview()
  148. make.centerY.equalTo(scoreLabel)
  149. make.trailing.equalTo(scoreLabel.snp.leading).offset(-4)
  150. }
  151. let orderLabel = UILabel()
  152. orderLabel.text = .init(key: "A00041")
  153. orderLabel.font = .body_xs
  154. orderLabel.textColor = .text_1
  155. container.addSubview(orderLabel)
  156. orderLabel.snp.makeConstraints { make in
  157. make.leading.equalToSuperview()
  158. make.bottom.equalToSuperview()
  159. make.top.equalTo(scoreLabel.snp.bottom)
  160. }
  161. orderCountLabel.font = .heading_h5
  162. orderCountLabel.textColor = .text_1
  163. orderCountLabel.textAlignment = .center
  164. container.addSubview(orderCountLabel)
  165. orderCountLabel.snp.makeConstraints { make in
  166. make.leading.equalTo(orderLabel.snp.trailing)
  167. make.centerY.equalTo(orderLabel)
  168. }
  169. return container
  170. }
  171. }