| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- //
- // LNRoomPlaymateSeatView.swift
- // Gami
- //
- // Created by OneeChan on 2026/3/9.
- //
- import Foundation
- import UIKit
- import SnapKit
- class LNRoomPlaymateSeatView: UIView, LNRoomSeatViewProtocol {
- private let seatNum: Int
- private let nameLabel = UILabel()
- private let emptyIc = UIImageView()
-
- private let userView = UIView()
- private let userAvatar = UIImageView()
- private let muteIc = UIImageView()
- private let speakingView = LNRoomSeatSpeakingView()
-
- private weak var roomSession: LNRoomViewModel?
- private var curSeat: LNRoomSeatItem? {
- roomSession?.seatsInfo.first { $0.index == seatNum }
- }
- private var isSpeaking: Bool {
- roomSession?.speakingUser.contains(curSeat?.uid ?? "") == true
- }
-
- init(seatNum: Int) {
- self.seatNum = seatNum
- super.init(frame: .zero)
-
- setupViews()
- LNEventDeliver.addObserver(self)
- }
-
- func update(_ room: LNRoomViewModel?) {
- roomSession = room
- onRoomSeatsChanged()
- speakingView.update(seatNum, room: room)
- }
-
- required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- }
- extension LNRoomPlaymateSeatView: LNRoomViewModelNotify {
- func onRoomSeatsChanged() {
- guard let curSeat else { return }
-
- if curSeat.isLocked {
- userView.isHidden = true
- emptyIc.image = .icSeatLock
- } else if curSeat.uid.isEmpty {
- userView.isHidden = true
- emptyIc.image = .icSeatNormal
- nameLabel.text = .init(key: "A00326", seatNum + 1)
- } else {
- userView.isHidden = false
- userAvatar.sd_setImage(with: URL(string: curSeat.avatar))
- nameLabel.text = curSeat.nickname
- }
-
- muteIc.isHidden = !curSeat.isMute
- }
-
- func onRoomSpeakingUsersChanged() {
- guard let curSeat else {
- speakingView.isHidden = true
- return
- }
- speakingView.isHidden = roomSession?.speakingUser.contains(where: { $0 == curSeat.uid }) != false
- }
- }
- extension LNRoomPlaymateSeatView {
- private func setupViews() {
- onTap { [weak self] in
- guard let self else { return }
- guard let roomSession,
- let curSeat else { return }
- handlerClick(roomSession, curSeat)
- }
- snp.makeConstraints { make in
- make.width.equalTo(76)
- make.height.equalTo(68)
- }
-
- let empty = buildEmpty()
- addSubview(empty)
- empty.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.top.equalToSuperview()
- }
-
- let userView = buildUserView()
- addSubview(userView)
- userView.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.top.equalToSuperview()
- }
-
- nameLabel.text = .init(key: "A00326", seatNum + 1)
- nameLabel.font = .body_xs
- nameLabel.textColor = .text_1
- nameLabel.textAlignment = .center
- addSubview(nameLabel)
- nameLabel.snp.makeConstraints { make in
- make.horizontalEdges.equalToSuperview()
- make.bottom.equalToSuperview()
- }
- }
-
- private func buildEmpty() -> UIView {
- emptyIc.image = .icSeatNormal
-
- return emptyIc
- }
-
- private func buildUserView() -> UIView {
- userView.isHidden = true
- userView.snp.makeConstraints { make in
- make.width.height.equalTo(46)
- }
-
- userView.addSubview(speakingView)
- speakingView.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- let gradientBg = UIImageView()
- gradientBg.layer.cornerRadius = 23
- gradientBg.image = .primary_7
- gradientBg.clipsToBounds = true
- userView.addSubview(gradientBg)
- gradientBg.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- userAvatar.layer.cornerRadius = 22
- userAvatar.clipsToBounds = true
- userView.addSubview(userAvatar)
- userAvatar.snp.makeConstraints { make in
- make.center.equalToSuperview()
- make.width.height.equalTo(44)
- }
-
- muteIc.image = .icMicOn
- userView.addSubview(muteIc)
- muteIc.snp.makeConstraints { make in
- make.trailing.equalToSuperview()
- make.bottom.equalToSuperview()
- make.width.height.equalTo(12.6)
- }
-
- return userView
- }
- }
|