LNRoomSeatApplyListCell.swift 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. //
  2. // LNRoomSeatApplyListCell.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/13.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNRoomSeatApplyListCell: UITableViewCell {
  11. private let indexLabel = UILabel()
  12. private let avatarView = UIImageView()
  13. private let nameLabel = UILabel()
  14. private let genderView = UIImageView()
  15. private let timeLabel = UILabel()
  16. private let acceptButton = UIButton()
  17. private weak var roomSession: LNRoomViewModel?
  18. private var curItem: LNRoomSeatApplyItem?
  19. override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
  20. super.init(style: style, reuseIdentifier: reuseIdentifier)
  21. setupViews()
  22. }
  23. func update(room: LNRoomViewModel?, item: LNRoomSeatApplyItem, index: Int) {
  24. indexLabel.text = "\(index)"
  25. avatarView.showAvatar(item.avatar)
  26. nameLabel.text = item.name
  27. timeLabel.text = item.relativeTimeText
  28. genderView.image = switch item.gender {
  29. case .unknow: nil
  30. case .male: .icGenderMale
  31. case .female: .icGenderFemale
  32. }
  33. genderView.isHidden = item.gender == .unknow
  34. roomSession = room
  35. curItem = item
  36. updateAcceptButton()
  37. }
  38. required init?(coder: NSCoder) {
  39. fatalError("init(coder:) has not been implemented")
  40. }
  41. }
  42. private extension LNRoomSeatApplyListCell {
  43. func updateAcceptButton() {
  44. if curItem?.hasAccept == true {
  45. acceptButton.setBackgroundImage(nil, for: .normal)
  46. acceptButton.setTitleColor(.fill_7, for: .normal)
  47. acceptButton.titleLabel?.font = .body_xs
  48. } else {
  49. acceptButton.setBackgroundImage(.primary_8, for: .normal)
  50. acceptButton.setTitleColor(.text_1, for: .normal)
  51. acceptButton.titleLabel?.font = .heading_h5
  52. }
  53. }
  54. func setupViews() {
  55. backgroundColor = .clear
  56. contentView.backgroundColor = .clear
  57. selectionStyle = .none
  58. contentView.snp.makeConstraints { make in
  59. make.height.equalTo(63)
  60. }
  61. indexLabel.font = .heading_h3
  62. indexLabel.textColor = UIColor.text_2.withAlphaComponent(0.7)
  63. indexLabel.textAlignment = .center
  64. contentView.addSubview(indexLabel)
  65. indexLabel.snp.makeConstraints { make in
  66. make.leading.equalToSuperview()
  67. make.centerY.equalToSuperview()
  68. make.width.equalTo(10)
  69. }
  70. avatarView.layer.cornerRadius = 16
  71. avatarView.layer.borderWidth = 0.5
  72. avatarView.layer.borderColor = UIColor.fill.cgColor
  73. avatarView.clipsToBounds = true
  74. avatarView.contentMode = .scaleAspectFill
  75. contentView.addSubview(avatarView)
  76. avatarView.snp.makeConstraints { make in
  77. make.leading.equalTo(indexLabel.snp.trailing).offset(12)
  78. make.centerY.equalToSuperview()
  79. make.width.height.equalTo(32)
  80. }
  81. acceptButton.backgroundColor = .white.withAlphaComponent(0.2)
  82. acceptButton.setBackgroundImage(.primary_8, for: .normal)
  83. acceptButton.setTitle(.init(key: "A00083"), for: .normal)
  84. acceptButton.setTitleColor(.text_1, for: .normal)
  85. acceptButton.titleLabel?.font = .heading_h5
  86. acceptButton.layer.cornerRadius = 11
  87. acceptButton.clipsToBounds = true
  88. acceptButton.contentEdgeInsets = .init(top: 0, left: 7, bottom: 0, right: 7)
  89. acceptButton.addAction(UIAction(handler: { [weak self] _ in
  90. guard let self else { return }
  91. guard let curItem else { return }
  92. roomSession?.acceptSeatApply(uid: curItem.userNo) { [weak self] success in
  93. guard let self else { return }
  94. guard success else { return }
  95. curItem.hasAccept = true
  96. updateAcceptButton()
  97. }
  98. }), for: .touchUpInside)
  99. contentView.addSubview(acceptButton)
  100. acceptButton.snp.makeConstraints { make in
  101. make.trailing.equalToSuperview()
  102. make.centerY.equalToSuperview()
  103. make.width.greaterThanOrEqualTo(56)
  104. make.height.equalTo(22)
  105. }
  106. let infoView = UIView()
  107. contentView.addSubview(infoView)
  108. infoView.snp.makeConstraints { make in
  109. make.leading.equalTo(avatarView.snp.trailing).offset(12)
  110. make.trailing.lessThanOrEqualTo(acceptButton.snp.leading).offset(-12)
  111. make.centerY.equalToSuperview()
  112. }
  113. let nameRow = UIView()
  114. infoView.addSubview(nameRow)
  115. nameRow.snp.makeConstraints { make in
  116. make.top.leading.trailing.equalToSuperview()
  117. }
  118. nameLabel.font = .heading_h4
  119. nameLabel.textColor = .text_1
  120. nameRow.addSubview(nameLabel)
  121. nameLabel.snp.makeConstraints { make in
  122. make.leading.top.bottom.equalToSuperview()
  123. }
  124. genderView.contentMode = .scaleAspectFit
  125. nameRow.addSubview(genderView)
  126. genderView.snp.makeConstraints { make in
  127. make.leading.equalTo(nameLabel.snp.trailing).offset(2)
  128. make.centerY.equalTo(nameLabel)
  129. make.trailing.lessThanOrEqualToSuperview()
  130. make.width.height.equalTo(14)
  131. }
  132. timeLabel.font = .body_s
  133. timeLabel.textColor = .text_2
  134. infoView.addSubview(timeLabel)
  135. timeLabel.snp.makeConstraints { make in
  136. make.leading.equalToSuperview()
  137. make.top.equalTo(nameRow.snp.bottom).offset(4)
  138. make.bottom.equalToSuperview()
  139. make.trailing.lessThanOrEqualToSuperview()
  140. }
  141. let separator = UIView()
  142. separator.backgroundColor = .fill.withAlphaComponent(0.08)
  143. contentView.addSubview(separator)
  144. separator.snp.makeConstraints { make in
  145. make.leading.equalTo(avatarView.snp.leading)
  146. make.trailing.equalToSuperview()
  147. make.bottom.equalToSuperview()
  148. make.height.equalTo(0.5)
  149. }
  150. }
  151. }