LNOrderRoomJoinMenuView.swift 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. //
  2. // LNOrderRoomJoinMenuView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/9.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. private enum LNRoomJoinMenuState {
  11. case normal
  12. case appling
  13. case reviewing
  14. case onMic
  15. }
  16. class LNOrderRoomJoinMenuView: UIView {
  17. private let joinView = UIStackView()
  18. private let bgImageView = UIImageView()
  19. private let seatIc = UIImageView()
  20. private let titleLabel = UILabel()
  21. private let redCountView = UIView()
  22. private let redCountLabel = UILabel()
  23. private var curState: LNRoomJoinMenuState = .normal {
  24. didSet {
  25. switch curState {
  26. case .normal: toBeOffMic()
  27. case .appling: toBePending()
  28. case .reviewing: toBeRequests()
  29. case .onMic: toBeOnMic()
  30. }
  31. }
  32. }
  33. private weak var roomSession: LNOrderRoomViewModel?
  34. override init(frame: CGRect) {
  35. super.init(frame: frame)
  36. setupViews()
  37. toBeOffMic()
  38. LNEventDeliver.addObserver(self)
  39. }
  40. func update(_ room: LNOrderRoomViewModel?) {
  41. roomSession = room
  42. if let room {
  43. onRoomSeatApplyChanged(session: room, applyCount: room.seatApplyCount)
  44. }
  45. }
  46. required init?(coder: NSCoder) {
  47. fatalError("init(coder:) has not been implemented")
  48. }
  49. }
  50. extension LNOrderRoomJoinMenuView: LNOrderRoomViewModelNotify {
  51. func onRoomSeatsChanged(session: LNRoomSession, changed: [LNRoomSeatItem]) {
  52. guard roomSession == session else { return }
  53. checkState()
  54. }
  55. func onRoomSeatApplyChanged(session: LNRoomSession, applyCount: Int) {
  56. guard roomSession == session else { return }
  57. checkState()
  58. }
  59. func onOrderRoomUserSeatApplyChanged(session: LNOrderRoomViewModel, apply: LNOrderRoomApplyingSeatType) {
  60. guard roomSession == session else { return }
  61. checkState()
  62. }
  63. private func checkState() {
  64. guard let roomSession else { return }
  65. redCountView.isHidden = true
  66. if roomSession.mySeatInfo == nil { // 还没上麦
  67. if roomSession.waitingForSeat != .none {
  68. curState = .appling
  69. redCountView.isHidden = roomSession.seatApplyCount == 0
  70. } else {
  71. curState = .normal
  72. }
  73. } else { // 在麦上
  74. if roomSession.mySeatInfo?.index == LNOrderRoomSeatNum.host.rawValue {
  75. curState = .reviewing
  76. redCountView.isHidden = roomSession.seatApplyCount == 0
  77. } else {
  78. curState = .onMic
  79. }
  80. }
  81. redCountLabel.text = "\(roomSession.seatApplyCount)"
  82. }
  83. }
  84. extension LNOrderRoomJoinMenuView {
  85. private func setupViews() {
  86. LNOrderRoomGuideView.joinView = self
  87. backgroundColor = .fill.withAlphaComponent(0.15)
  88. layer.cornerRadius = 15
  89. onTap { [weak self] in
  90. guard let self else { return }
  91. guard let roomSession else { return }
  92. switch curState {
  93. case .normal:
  94. let panel = LNOrderRoomApplySeatPanel()
  95. panel.update(roomSession)
  96. panel.popup(self)
  97. case .appling:
  98. let panel = LNOrderRoomApplySeatListPanel()
  99. panel.update(roomSession)
  100. panel.popup(self)
  101. break
  102. case .reviewing:
  103. let panel = LNOrderRoomManageSeatListPanel()
  104. panel.update(roomSession)
  105. panel.popup(self)
  106. break
  107. case .onMic:
  108. roomSession.leaveSeat { _ in }
  109. break
  110. }
  111. }
  112. snp.makeConstraints { make in
  113. make.width.greaterThanOrEqualTo(69)
  114. }
  115. bgImageView.image = .primary_8
  116. bgImageView.layer.cornerRadius = 15
  117. bgImageView.clipsToBounds = true
  118. addSubview(bgImageView)
  119. bgImageView.snp.makeConstraints { make in
  120. make.edges.equalToSuperview()
  121. }
  122. joinView.isUserInteractionEnabled = false
  123. joinView.spacing = 4
  124. addSubview(joinView)
  125. joinView.snp.makeConstraints { make in
  126. make.centerX.equalToSuperview()
  127. make.leading.greaterThanOrEqualToSuperview().offset(12)
  128. make.centerY.equalToSuperview()
  129. }
  130. seatIc.image = .icSeat
  131. joinView.addArrangedSubview(seatIc)
  132. seatIc.snp.makeConstraints { make in
  133. make.width.height.equalTo(16)
  134. }
  135. titleLabel.font = .heading_h5
  136. titleLabel.textColor = .text_1
  137. joinView.addArrangedSubview(titleLabel)
  138. redCountView.backgroundColor = .fill_6
  139. redCountView.layer.cornerRadius = 7
  140. addSubview(redCountView)
  141. redCountView.snp.makeConstraints { make in
  142. make.trailing.equalToSuperview()
  143. make.centerY.equalTo(snp.top)
  144. make.width.greaterThanOrEqualTo(15)
  145. }
  146. redCountLabel.font = .body_xs
  147. redCountLabel.textColor = .text_1
  148. redCountLabel.textAlignment = .center
  149. redCountView.addSubview(redCountLabel)
  150. redCountLabel.snp.makeConstraints { make in
  151. make.horizontalEdges.equalToSuperview().inset(4)
  152. make.verticalEdges.equalToSuperview()
  153. }
  154. }
  155. private func toBeOffMic() {
  156. bgImageView.isHidden = false
  157. seatIc.isHidden = false
  158. titleLabel.text = .init(key: "A00322")
  159. }
  160. private func toBePending() {
  161. bgImageView.isHidden = true
  162. seatIc.isHidden = true
  163. titleLabel.text = .init(key: "A00323")
  164. }
  165. private func toBeRequests() {
  166. bgImageView.isHidden = true
  167. seatIc.isHidden = true
  168. titleLabel.text = .init(key: "A00324")
  169. }
  170. private func toBeOnMic() {
  171. bgImageView.isHidden = true
  172. seatIc.isHidden = true
  173. titleLabel.text = .init(key: "A00386")
  174. }
  175. }