LNRoomProfileCardPanel.swift 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. extension LNRoomProfileCardPanel: LNRoomProfileBottomMenuDelete {
  72. func onRoomProfileBottomMenuRequestToDismiss() {
  73. dismiss()
  74. }
  75. }
  76. private extension LNRoomProfileCardPanel {
  77. func setupViews() {
  78. container.backgroundColor = .fill_7
  79. let topMenu = buildTopMenu()
  80. container.addSubview(topMenu)
  81. topMenu.snp.makeConstraints { make in
  82. make.top.equalToSuperview()
  83. make.horizontalEdges.equalToSuperview()
  84. }
  85. avatarView.layer.cornerRadius = 38
  86. avatarView.layer.borderWidth = 1
  87. avatarView.layer.borderColor = UIColor.fill.cgColor
  88. avatarView.backgroundColor = .fill_7
  89. avatarView.clipsToBounds = true
  90. avatarView.contentMode = .scaleAspectFill
  91. avatarView.onTap { [weak self] in
  92. guard let self else { return }
  93. guard let curDetail else { return }
  94. dismiss()
  95. pushToProfile(uid: curDetail.userNo)
  96. }
  97. container.addSubview(avatarView)
  98. avatarView.snp.makeConstraints { make in
  99. make.top.equalToSuperview().offset(-17)
  100. make.centerX.equalToSuperview()
  101. make.width.height.equalTo(76)
  102. }
  103. let stackView = UIStackView()
  104. stackView.axis = .vertical
  105. stackView.distribution = .fill
  106. container.addSubview(stackView)
  107. stackView.snp.makeConstraints { make in
  108. make.horizontalEdges.equalToSuperview()
  109. make.top.equalTo(avatarView.snp.bottom).offset(17)
  110. make.bottom.equalToSuperview().offset(commonBottomInset)
  111. }
  112. stackView.addArrangedSubview(buildUserInfo())
  113. stackView.addArrangedSubview(buildSkillSection())
  114. stackView.addArrangedSubview(buildActionSection())
  115. }
  116. func buildTopMenu() -> UIView {
  117. let container = UIView()
  118. container.snp.makeConstraints { make in
  119. make.height.equalTo(56)
  120. }
  121. reportButton.tintColor = UIColor.text_2.withAlphaComponent(0.6)
  122. reportButton.setImage(UIImage(systemName: "exclamationmark.triangle"), for: .normal)
  123. reportButton.addAction(UIAction(handler: { [weak self] _ in
  124. guard let self else { return }
  125. guard let curDetail else { return }
  126. dismiss()
  127. pushToReport(uid: curDetail.userNo)
  128. }), for: .touchUpInside)
  129. container.addSubview(reportButton)
  130. reportButton.snp.makeConstraints { make in
  131. make.leading.equalToSuperview().offset(16)
  132. make.top.equalToSuperview().offset(16)
  133. make.width.height.equalTo(24)
  134. }
  135. return container
  136. }
  137. func buildUserInfo() -> UIView {
  138. let container = UIView()
  139. let nameView = UIView()
  140. container.addSubview(nameView)
  141. nameView.snp.makeConstraints { make in
  142. make.centerX.equalToSuperview()
  143. make.leading.greaterThanOrEqualToSuperview().offset(16)
  144. make.top.equalToSuperview().offset(3)
  145. }
  146. nameLabel.font = .heading_h2
  147. nameLabel.textColor = .text_1
  148. nameView.addSubview(nameLabel)
  149. nameLabel.snp.makeConstraints { make in
  150. make.leading.equalToSuperview()
  151. make.verticalEdges.equalToSuperview()
  152. }
  153. nameView.addSubview(genderView)
  154. genderView.snp.makeConstraints { make in
  155. make.centerY.equalToSuperview()
  156. make.leading.equalTo(nameLabel.snp.trailing).offset(4)
  157. make.trailing.equalToSuperview()
  158. }
  159. userIdLabel.font = .body_s
  160. userIdLabel.textColor = UIColor.text_1.withAlphaComponent(0.5)
  161. userIdLabel.textAlignment = .center
  162. container.addSubview(userIdLabel)
  163. userIdLabel.snp.makeConstraints { make in
  164. make.top.equalTo(nameView.snp.bottom).offset(4)
  165. make.centerX.equalToSuperview()
  166. make.bottom.equalToSuperview().offset(-10)
  167. }
  168. return container
  169. }
  170. func buildSkillSection() -> UIView {
  171. return skillSection
  172. }
  173. func buildActionSection() -> UIView {
  174. actionsSection.delegate = self
  175. return actionsSection
  176. }
  177. }