LNRoomInviteSeatCell.swift 5.6 KB

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