LNRoomProfileCardPanel.swift 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. //
  2. // LNRoomProfileCardPanel.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/16.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNRoomProfileCardPanel: LNPopupView {
  11. private let reportButton = UIButton(type: .system)
  12. private let avatarView = UIImageView()
  13. private let nameLabel = UILabel()
  14. private let genderView = LNGenderView()
  15. private let userIdLabel = UILabel()
  16. private let skillSection = LNRoomProfileSkillView()
  17. private let actionsSection = LNRoomProfileBottomMenu()
  18. private var curDetail: LNUserProfileVO?
  19. override init(frame: CGRect) {
  20. super.init(frame: frame)
  21. setupViews()
  22. }
  23. func load(_ uid: String) {
  24. reportButton.isHidden = uid.isMyUid
  25. skillSection.isHidden = true
  26. actionsSection.update(uid)
  27. LNProfileManager.shared.getUserProfileDetail(uid: uid) { [weak self] detail in
  28. guard let self else { return }
  29. guard let detail else {
  30. dismiss()
  31. return
  32. }
  33. avatarView.sd_setImage(with: URL(string: detail.avatar))
  34. nameLabel.text = detail.nickname
  35. genderView.update(detail.gender, detail.age)
  36. userIdLabel.text = "ID \(detail.userNo)"
  37. skillSection.isHidden = uid.isMyUid || detail.skills.isEmpty
  38. skillSection.update(detail, detail.skills)
  39. curDetail = detail
  40. }
  41. }
  42. func toBeExample() {
  43. avatarView.sd_setImage(with: URL(string: myUserInfo.avatar))
  44. nameLabel.text = "Super Beautiful Girl"
  45. genderView.update(.female, 18)
  46. userIdLabel.text = "ID 12345678"
  47. var skills: [LNGameMateSkillVO] = []
  48. for type in LNGameMateManager.shared.curGameTypes {
  49. for skill in type.children {
  50. let item = LNGameMateSkillVO()
  51. item.icon = skill.icon
  52. item.name = skill.name
  53. item.cover = skill.icon
  54. item.price = 1
  55. item.unit = "Match"
  56. skills.append(item)
  57. if skills.count >= 3 {
  58. break
  59. }
  60. }
  61. if skills.count >= 3 {
  62. break
  63. }
  64. }
  65. skillSection.update(myUserInfo, skills)
  66. }
  67. required init?(coder: NSCoder) {
  68. fatalError("init(coder:) has not been implemented")
  69. }
  70. }
  71. private extension LNRoomProfileCardPanel {
  72. func setupViews() {
  73. container.backgroundColor = .fill_7
  74. let topMenu = buildTopMenu()
  75. container.addSubview(topMenu)
  76. topMenu.snp.makeConstraints { make in
  77. make.top.equalToSuperview()
  78. make.horizontalEdges.equalToSuperview()
  79. }
  80. avatarView.layer.cornerRadius = 38
  81. avatarView.layer.borderWidth = 1
  82. avatarView.layer.borderColor = UIColor.fill.cgColor
  83. avatarView.backgroundColor = .fill_7
  84. avatarView.clipsToBounds = true
  85. avatarView.contentMode = .scaleAspectFill
  86. avatarView.onTap { [weak self] in
  87. guard let self else { return }
  88. guard let curDetail else { return }
  89. dismiss()
  90. pushToProfile(uid: curDetail.userNo)
  91. }
  92. container.addSubview(avatarView)
  93. avatarView.snp.makeConstraints { make in
  94. make.top.equalToSuperview().offset(-17)
  95. make.centerX.equalToSuperview()
  96. make.width.height.equalTo(76)
  97. }
  98. let stackView = UIStackView()
  99. stackView.axis = .vertical
  100. stackView.distribution = .fill
  101. container.addSubview(stackView)
  102. stackView.snp.makeConstraints { make in
  103. make.horizontalEdges.equalToSuperview()
  104. make.top.equalTo(avatarView.snp.bottom).offset(17)
  105. make.bottom.equalToSuperview().offset(commonBottomInset)
  106. }
  107. stackView.addArrangedSubview(buildUserInfo())
  108. stackView.addArrangedSubview(buildSkillSection())
  109. stackView.addArrangedSubview(buildActionSection())
  110. }
  111. func buildTopMenu() -> UIView {
  112. let container = UIView()
  113. container.snp.makeConstraints { make in
  114. make.height.equalTo(56)
  115. }
  116. reportButton.tintColor = UIColor.text_2.withAlphaComponent(0.6)
  117. reportButton.setImage(.icWarning, for: .normal)
  118. reportButton.addAction(UIAction(handler: { [weak self] _ in
  119. guard let self else { return }
  120. guard let curDetail else { return }
  121. dismiss()
  122. pushToReport(uid: curDetail.userNo)
  123. }), for: .touchUpInside)
  124. container.addSubview(reportButton)
  125. reportButton.snp.makeConstraints { make in
  126. make.leading.equalToSuperview().offset(16)
  127. make.top.equalToSuperview().offset(16)
  128. make.width.height.equalTo(24)
  129. }
  130. return container
  131. }
  132. func buildUserInfo() -> UIView {
  133. let container = UIView()
  134. let nameView = UIView()
  135. container.addSubview(nameView)
  136. nameView.snp.makeConstraints { make in
  137. make.centerX.equalToSuperview()
  138. make.leading.greaterThanOrEqualToSuperview().offset(16)
  139. make.top.equalToSuperview().offset(3)
  140. }
  141. nameLabel.font = .heading_h2
  142. nameLabel.textColor = .text_1
  143. nameView.addSubview(nameLabel)
  144. nameLabel.snp.makeConstraints { make in
  145. make.leading.equalToSuperview()
  146. make.verticalEdges.equalToSuperview()
  147. }
  148. nameView.addSubview(genderView)
  149. genderView.snp.makeConstraints { make in
  150. make.centerY.equalToSuperview()
  151. make.leading.equalTo(nameLabel.snp.trailing).offset(4)
  152. make.trailing.equalToSuperview()
  153. }
  154. userIdLabel.font = .body_s
  155. userIdLabel.textColor = UIColor.text_1.withAlphaComponent(0.5)
  156. userIdLabel.textAlignment = .center
  157. container.addSubview(userIdLabel)
  158. userIdLabel.snp.makeConstraints { make in
  159. make.top.equalTo(nameView.snp.bottom).offset(4)
  160. make.centerX.equalToSuperview()
  161. make.bottom.equalToSuperview().offset(-10)
  162. }
  163. return container
  164. }
  165. func buildSkillSection() -> UIView {
  166. skillSection.panel = self
  167. return skillSection
  168. }
  169. func buildActionSection() -> UIView {
  170. actionsSection.panel = self
  171. return actionsSection
  172. }
  173. }