LNRoomHostSeatView.swift 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. //
  2. // LNRoomHostSeatView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/9.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNRoomHostSeatView: UIView, LNRoomSeatViewProtocol {
  11. private let seatNum: Int = 0
  12. private let nameLabel = UILabel()
  13. private let emptyIc = UIImageView()
  14. private let userView = UIView()
  15. private let userAvatar = UIImageView()
  16. private let muteIc = UIImageView()
  17. private let speakingView = LNRoomSeatSpeakingView()
  18. private weak var roomSession: LNRoomViewModel?
  19. private var curSeat: LNRoomSeatItem? {
  20. roomSession?.seatsInfo.first { $0.index == seatNum }
  21. }
  22. private var isSpeaking: Bool {
  23. roomSession?.speakingUser.contains(curSeat?.uid ?? "") == true
  24. }
  25. override init(frame: CGRect) {
  26. super.init(frame: frame)
  27. setupViews()
  28. LNEventDeliver.addObserver(self)
  29. }
  30. func update(_ room: LNRoomViewModel?) {
  31. roomSession = room
  32. onRoomSeatsChanged()
  33. speakingView.update(seatNum, room: room)
  34. }
  35. required init?(coder: NSCoder) {
  36. fatalError("init(coder:) has not been implemented")
  37. }
  38. }
  39. extension LNRoomHostSeatView: LNRoomViewModelNotify {
  40. func onRoomSeatsChanged() {
  41. if let curSeat {
  42. muteIc.isHidden = !curSeat.isMute
  43. userView.isHidden = false
  44. userAvatar.sd_setImage(with: URL(string: curSeat.avatar))
  45. nameLabel.text = curSeat.nickname.isEmpty ? " " : curSeat.nickname
  46. } else {
  47. muteIc.isHidden = true
  48. userView.isHidden = true
  49. nameLabel.text = .init(key: "A00328")
  50. }
  51. }
  52. }
  53. extension LNRoomHostSeatView {
  54. private func setupViews() {
  55. onTap { [weak self] in
  56. guard let self else { return }
  57. guard let roomSession,
  58. let curSeat else { return }
  59. handlerClick(roomSession, curSeat)
  60. }
  61. snp.makeConstraints { make in
  62. make.width.equalTo(76)
  63. make.height.equalTo(68)
  64. }
  65. let empty = buildEmpty()
  66. addSubview(empty)
  67. empty.snp.makeConstraints { make in
  68. make.centerX.equalToSuperview()
  69. make.top.equalToSuperview()
  70. }
  71. let userView = buildUserView()
  72. addSubview(userView)
  73. userView.snp.makeConstraints { make in
  74. make.centerX.equalToSuperview()
  75. make.top.equalToSuperview()
  76. }
  77. let bottom = buildBottom()
  78. addSubview(bottom)
  79. bottom.snp.makeConstraints { make in
  80. make.centerX.equalToSuperview()
  81. make.bottom.equalToSuperview()
  82. make.leading.greaterThanOrEqualToSuperview()
  83. }
  84. }
  85. private func buildEmpty() -> UIView {
  86. emptyIc.image = .icSeatNormal
  87. return emptyIc
  88. }
  89. private func buildUserView() -> UIView {
  90. userView.isHidden = true
  91. userView.snp.makeConstraints { make in
  92. make.width.height.equalTo(46)
  93. }
  94. userView.addSubview(speakingView)
  95. speakingView.snp.makeConstraints { make in
  96. make.edges.equalToSuperview()
  97. }
  98. let gradientBg = UIImageView()
  99. gradientBg.layer.cornerRadius = 23
  100. gradientBg.image = .primary_7
  101. gradientBg.clipsToBounds = true
  102. userView.addSubview(gradientBg)
  103. gradientBg.snp.makeConstraints { make in
  104. make.edges.equalToSuperview()
  105. }
  106. userAvatar.layer.cornerRadius = 22
  107. userAvatar.clipsToBounds = true
  108. userView.addSubview(userAvatar)
  109. userAvatar.snp.makeConstraints { make in
  110. make.center.equalToSuperview()
  111. make.width.height.equalTo(44)
  112. }
  113. muteIc.layer.cornerRadius = 6.3
  114. muteIc.backgroundColor = .black.withAlphaComponent(0.7)
  115. muteIc.image = .icMicOn
  116. userView.addSubview(muteIc)
  117. muteIc.snp.makeConstraints { make in
  118. make.trailing.equalToSuperview()
  119. make.bottom.equalToSuperview()
  120. make.width.height.equalTo(12.6)
  121. }
  122. return userView
  123. }
  124. private func buildBottom() -> UIView {
  125. let container = UIView()
  126. let hostIc = UIImageView(image: .icMicRoomHost)
  127. container.addSubview(hostIc)
  128. hostIc.snp.makeConstraints { make in
  129. make.leading.equalToSuperview()
  130. make.centerY.equalToSuperview()
  131. }
  132. nameLabel.text = .init(key: "A00328")
  133. nameLabel.font = .body_xs
  134. nameLabel.textColor = .text_1
  135. nameLabel.textAlignment = .center
  136. container.addSubview(nameLabel)
  137. nameLabel.snp.makeConstraints { make in
  138. make.leading.equalTo(hostIc.snp.trailing).offset(2)
  139. make.trailing.equalToSuperview()
  140. make.verticalEdges.equalToSuperview()
  141. }
  142. return container
  143. }
  144. }