LNUserSearchItemCell.swift 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. //
  2. // LNUserSearchItemCell.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/12/12.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNUserSearchItemCell: UITableViewCell {
  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(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  20. super.init(style: style, reuseIdentifier: reuseIdentifier)
  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 LNUserSearchItemCell: 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 LNUserSearchItemCell {
  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. contentView.addSubview(avatar)
  66. avatar.snp.makeConstraints { make in
  67. make.width.height.equalTo(40)
  68. make.leading.equalToSuperview().offset(2)
  69. make.verticalEdges.equalToSuperview().inset(10)
  70. }
  71. contentView.addSubview(onlineView)
  72. onlineView.snp.makeConstraints { make in
  73. make.edges.equalTo(avatar).inset(-2)
  74. }
  75. let follow = buildFollow()
  76. contentView.addSubview(follow)
  77. follow.snp.makeConstraints { make in
  78. make.centerY.equalToSuperview()
  79. make.trailing.equalToSuperview().offset(-2)
  80. }
  81. let infoView = buildInfoView()
  82. contentView.addSubview(infoView)
  83. infoView.snp.makeConstraints { make in
  84. make.leading.equalTo(avatar.snp.trailing).offset(12)
  85. make.centerY.equalToSuperview()
  86. make.trailing.equalTo(follow.snp.leading).offset(-12)
  87. }
  88. onTap { [weak self] in
  89. guard let self else { return }
  90. guard let curItem else { return }
  91. pushToProfile(uid: curItem.userNo)
  92. }
  93. }
  94. private func buildInfoView() -> UIView {
  95. let container = UIView()
  96. let nameView = buildNameView()
  97. container.addSubview(nameView)
  98. nameView.snp.makeConstraints { make in
  99. make.leading.top.equalToSuperview()
  100. make.trailing.equalToSuperview()
  101. }
  102. let descView = buildDescView()
  103. container.addSubview(descView)
  104. descView.snp.makeConstraints { make in
  105. make.leading.trailing.equalToSuperview()
  106. make.bottom.equalToSuperview()
  107. make.top.equalTo(nameView.snp.bottom).offset(4)
  108. }
  109. return container
  110. }
  111. private func buildNameView() -> UIView {
  112. let container = UIView()
  113. nameLabel.font = .heading_h4
  114. nameLabel.textColor = .text_5
  115. container.addSubview(nameLabel)
  116. nameLabel.snp.makeConstraints { make in
  117. make.leading.equalToSuperview()
  118. make.verticalEdges.equalToSuperview()
  119. }
  120. container.addSubview(genderView)
  121. genderView.snp.makeConstraints { make in
  122. make.leading.equalTo(nameLabel.snp.trailing).offset(4)
  123. make.centerY.equalToSuperview()
  124. make.trailing.lessThanOrEqualToSuperview()
  125. }
  126. return container
  127. }
  128. private func buildDescView() -> UIView {
  129. let container = UIView()
  130. idLabel.font = .body_xs
  131. idLabel.textColor = .text_3
  132. container.addSubview(idLabel)
  133. idLabel.snp.makeConstraints { make in
  134. make.leading.equalToSuperview()
  135. make.verticalEdges.equalToSuperview()
  136. }
  137. fansCountLabel.font = .body_xs
  138. fansCountLabel.textColor = .text_3
  139. container.addSubview(fansCountLabel)
  140. fansCountLabel.snp.makeConstraints { make in
  141. make.centerY.equalToSuperview()
  142. make.leading.equalTo(idLabel.snp.trailing).offset(7)
  143. make.trailing.lessThanOrEqualToSuperview()
  144. }
  145. return container
  146. }
  147. private func buildFollow() -> UIView {
  148. followButton.layer.cornerRadius = 11
  149. followButton.clipsToBounds = true
  150. followButton.backgroundColor = .fill_2
  151. followButton.titleLabel?.font = .heading_h5
  152. followButton.setBackgroundImage(.primary_7, for: .normal)
  153. followButton.setTitle(.init(key: "A00225"), for: .normal)
  154. followButton.addAction(UIAction(handler: { [weak self] _ in
  155. guard let self else { return }
  156. guard let uid = curItem?.userNo else { return }
  157. LNRelationManager.shared.operateFollow(uid: uid, follow: true, handler: nil)
  158. }), for: .touchUpInside)
  159. followButton.snp.makeConstraints { make in
  160. make.width.equalTo(56)
  161. make.height.equalTo(22)
  162. }
  163. return followButton
  164. }
  165. }