LNSkillUserInfoView.swift 6.1 KB

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