| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- //
- // LNRoomJoinMenuView.swift
- // Gami
- //
- // Created by OneeChan on 2026/3/9.
- //
- import Foundation
- import UIKit
- import SnapKit
- private enum LNRoomJoinMenuState {
- case normal
- case appling
- case reviewing
- }
- class LNRoomJoinMenuView: UIView {
- private let joinView = UIStackView()
- private let bgImageView = UIImageView()
- private let seatIc = UIImageView()
- private let titleLabel = UILabel()
- private let redCountView = UIView()
- private let redCountLabel = UILabel()
-
- private var curState: LNRoomJoinMenuState = .normal {
- didSet {
- switch curState {
- case .normal:
- toBeOffMic()
- case .appling:
- toBePending()
- case .reviewing:
- toBeRequests()
- }
- }
- }
-
- private weak var roomSession: LNRoomViewModel?
-
- override init(frame: CGRect) {
- super.init(frame: frame)
-
- setupViews()
- toBeOffMic()
-
- LNEventDeliver.addObserver(self)
- }
-
- func update(_ room: LNRoomViewModel?) {
- roomSession = room
-
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- }
- extension LNRoomJoinMenuView: LNRoomViewModelNotify {
- func onRoomSeatApplyChanged() {
- guard let roomSession else { return }
- let applies = roomSession.curSeatApplications
-
- if applies.contains(where: { $0.userNo == myUid }) {
- curState = .appling
- } else {
- curState = .normal
- }
-
- if applies.isEmpty {
- redCountView.isHidden = true
- } else {
- redCountLabel.text = "\(applies.count)"
- }
- }
- }
- extension LNRoomJoinMenuView {
- private func setupViews() {
- backgroundColor = .fill.withAlphaComponent(0.15)
- layer.cornerRadius = 15
- onTap { [weak self] in
- guard let self else { return }
- guard let roomSession else { return }
- switch curState {
- case .normal:
- let panel = LNRoomApplySeatPanel()
- panel.update(roomSession)
- panel.popup()
- case .appling:
- break
- case .reviewing:
- let panel = LNRoomSeatApplyListPanel()
- panel.update(roomSession)
- panel.popup()
- break
- }
- }
- snp.makeConstraints { make in
- make.width.greaterThanOrEqualTo(69)
- }
-
- bgImageView.image = .primary_8
- bgImageView.layer.cornerRadius = 15
- bgImageView.clipsToBounds = true
- addSubview(bgImageView)
- bgImageView.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- joinView.isUserInteractionEnabled = false
- joinView.spacing = 4
- addSubview(joinView)
- joinView.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.leading.greaterThanOrEqualToSuperview().offset(12)
- make.centerY.equalToSuperview()
- }
-
- seatIc.image = .icSeat
- joinView.addArrangedSubview(seatIc)
- seatIc.snp.makeConstraints { make in
- make.width.height.equalTo(16)
- }
-
- titleLabel.font = .heading_h5
- titleLabel.textColor = .text_1
- joinView.addArrangedSubview(titleLabel)
-
- redCountView.backgroundColor = .fill_6
- redCountView.layer.cornerRadius = 7
- addSubview(redCountView)
- redCountView.snp.makeConstraints { make in
- make.trailing.equalToSuperview()
- make.centerY.equalTo(snp.top)
- make.width.greaterThanOrEqualTo(15)
- }
-
- redCountLabel.text = "9"
- redCountLabel.font = .body_xs
- redCountLabel.textColor = .text_1
- redCountView.addSubview(redCountLabel)
- redCountLabel.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview().inset(4)
- make.verticalEdges.equalToSuperview()
- }
- }
-
- private func toBeOffMic() {
- redCountView.isHidden = true
-
- bgImageView.isHidden = false
- seatIc.isHidden = false
- titleLabel.text = .init(key: "A00322")
- }
-
- private func toBePending() {
- redCountView.isHidden = false
-
- bgImageView.isHidden = true
- seatIc.isHidden = true
- titleLabel.text = .init(key: "A00323")
- }
-
- private func toBeRequests() {
- redCountView.isHidden = false
-
- bgImageView.isHidden = true
- seatIc.isHidden = true
- titleLabel.text = .init(key: "A00324")
- }
- }
|