LNUserSearchUserCardView.swift 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. //
  2. // LNUserSearchUserCardView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/19.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNUserSearchUserCardView: UIView {
  11. private let avatar = UIImageView()
  12. private let onlineView = LNOnlineView()
  13. private let nameLabel = UILabel()
  14. private let genderView = LNGenderView()
  15. private let idLabel = UILabel()
  16. private let fansCountLabel = UILabel()
  17. private let followButton = UIButton()
  18. private var curItem: LNGameMateSearchResultVO?
  19. override init(frame: CGRect) {
  20. super.init(frame: frame)
  21. setupViews()
  22. LNEventDeliver.addObserver(self)
  23. }
  24. func update(_ item: LNGameMateSearchResultVO) {
  25. avatar.showAvatar(item.avatar)
  26. onlineView.isHidden = !item.online
  27. nameLabel.text = item.nickname
  28. genderView.update(item.gender, item.age)
  29. idLabel.text = "ID \(item.userNo)"
  30. fansCountLabel.text = .init(key: "A00243", item.fansCount)
  31. followButton.isHidden = item.userNo.isMyUid
  32. curItem = item
  33. updateFollowButton()
  34. }
  35. required init?(coder: NSCoder) {
  36. fatalError("init(coder:) has not been implemented")
  37. }
  38. }
  39. extension LNUserSearchUserCardView: LNRelationManagerNotify {
  40. func onUserRelationChanged(uid: String, relation: LNUserRelationShip) {
  41. guard uid == curItem?.userNo else { return }
  42. curItem?.follow = relation.contains(.followed)
  43. updateFollowButton()
  44. }
  45. }
  46. extension LNUserSearchUserCardView {
  47. private func updateFollowButton() {
  48. if curItem?.follow == true {
  49. followButton.isEnabled = false
  50. followButton.setBackgroundImage(nil, for: .normal)
  51. followButton.setTitle(.init(key: "A00235"), for: .normal)
  52. followButton.titleLabel?.font = .body_xs
  53. followButton.setTitleColor(.text_2, for: .normal)
  54. } else {
  55. followButton.isEnabled = true
  56. followButton.setBackgroundImage(.primary_7, for: .normal)
  57. followButton.setTitle(.init(key: "A00225"), for: .normal)
  58. followButton.titleLabel?.font = .heading_h5
  59. followButton.setTitleColor(.text_1, for: .normal)
  60. }
  61. }
  62. private func setupViews() {
  63. avatar.layer.cornerRadius = 20
  64. avatar.clipsToBounds = true
  65. addSubview(avatar)
  66. avatar.snp.makeConstraints { make in
  67. make.width.height.equalTo(40)
  68. make.leading.equalToSuperview().offset(18)
  69. make.top.equalToSuperview().offset(2)
  70. make.bottom.equalToSuperview().offset(-22).priority(.medium)
  71. }
  72. addSubview(onlineView)
  73. onlineView.snp.makeConstraints { make in
  74. make.edges.equalTo(avatar).inset(-2)
  75. }
  76. let follow = buildFollow()
  77. addSubview(follow)
  78. follow.snp.makeConstraints { make in
  79. make.centerY.equalTo(avatar)
  80. make.trailing.equalToSuperview().offset(-16)
  81. }
  82. let infoView = buildInfoView()
  83. addSubview(infoView)
  84. infoView.snp.makeConstraints { make in
  85. make.leading.equalTo(avatar.snp.trailing).offset(12)
  86. make.centerY.equalTo(avatar)
  87. make.trailing.equalTo(follow.snp.leading).offset(-12)
  88. }
  89. onTap { [weak self] in
  90. guard let self else { return }
  91. guard let curItem else { return }
  92. pushToProfile(uid: curItem.userNo)
  93. }
  94. }
  95. private func buildInfoView() -> UIView {
  96. let container = UIView()
  97. let nameView = buildNameView()
  98. container.addSubview(nameView)
  99. nameView.snp.makeConstraints { make in
  100. make.leading.top.equalToSuperview()
  101. make.trailing.equalToSuperview()
  102. }
  103. let descView = buildDescView()
  104. container.addSubview(descView)
  105. descView.snp.makeConstraints { make in
  106. make.leading.trailing.equalToSuperview()
  107. make.bottom.equalToSuperview()
  108. make.top.equalTo(nameView.snp.bottom).offset(4)
  109. }
  110. return container
  111. }
  112. private func buildNameView() -> UIView {
  113. let container = UIView()
  114. nameLabel.font = .heading_h4
  115. nameLabel.textColor = .text_5
  116. container.addSubview(nameLabel)
  117. nameLabel.snp.makeConstraints { make in
  118. make.leading.equalToSuperview()
  119. make.verticalEdges.equalToSuperview()
  120. }
  121. container.addSubview(genderView)
  122. genderView.snp.makeConstraints { make in
  123. make.leading.equalTo(nameLabel.snp.trailing).offset(4)
  124. make.centerY.equalToSuperview()
  125. make.trailing.lessThanOrEqualToSuperview()
  126. }
  127. return container
  128. }
  129. private func buildDescView() -> UIView {
  130. let container = UIView()
  131. idLabel.font = .body_xs
  132. idLabel.textColor = .text_3
  133. container.addSubview(idLabel)
  134. idLabel.snp.makeConstraints { make in
  135. make.leading.equalToSuperview()
  136. make.verticalEdges.equalToSuperview()
  137. }
  138. fansCountLabel.font = .body_xs
  139. fansCountLabel.textColor = .text_3
  140. container.addSubview(fansCountLabel)
  141. fansCountLabel.snp.makeConstraints { make in
  142. make.centerY.equalToSuperview()
  143. make.leading.equalTo(idLabel.snp.trailing).offset(7)
  144. make.trailing.lessThanOrEqualToSuperview()
  145. }
  146. return container
  147. }
  148. private func buildFollow() -> UIView {
  149. followButton.layer.cornerRadius = 11
  150. followButton.clipsToBounds = true
  151. followButton.backgroundColor = .fill_2
  152. followButton.titleLabel?.font = .heading_h5
  153. followButton.setBackgroundImage(.primary_7, for: .normal)
  154. followButton.setTitle(.init(key: "A00225"), for: .normal)
  155. followButton.addAction(UIAction(handler: { [weak self] _ in
  156. guard let self else { return }
  157. guard let uid = curItem?.userNo else { return }
  158. LNRelationManager.shared.operateFollow(uid: uid, follow: true, handler: nil)
  159. }), for: .touchUpInside)
  160. followButton.snp.makeConstraints { make in
  161. make.width.equalTo(56)
  162. make.height.equalTo(22)
  163. }
  164. return followButton
  165. }
  166. }