LNRoomTopMenuView.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //
  2. // LNRoomTopMenuView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/9.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNRoomTopMenuView: UIView {
  11. private let hostAvatar = UIImageView()
  12. private let roomNameLabel = UILabel()
  13. private let roomIdLabel = UILabel()
  14. private weak var roomSession: LNRoomViewModel?
  15. override init(frame: CGRect) {
  16. super.init(frame: frame)
  17. setupViews()
  18. LNEventDeliver.addObserver(self)
  19. }
  20. func update(_ room: LNRoomViewModel?) {
  21. roomSession = room
  22. if let room {
  23. update(room.roomInfo)
  24. }
  25. }
  26. required init?(coder: NSCoder) {
  27. fatalError("init(coder:) has not been implemented")
  28. }
  29. }
  30. extension LNRoomTopMenuView: LNRoomViewModelNotify {
  31. func onRoomInfoChanged() {
  32. guard let roomInfo = roomSession?.roomInfo else { return }
  33. update(roomInfo)
  34. }
  35. }
  36. extension LNRoomTopMenuView {
  37. private func update(_ roomInfo: LNRoomInfo) {
  38. hostAvatar.sd_setImage(with: URL(string: roomInfo.coverURL))
  39. roomNameLabel.text = roomInfo.liveName
  40. roomIdLabel.text = "ID \(roomInfo.liveID)"
  41. }
  42. private func setupViews() {
  43. let closeButton = UIButton()
  44. closeButton.setImage(.icShutdown, for: .normal)
  45. closeButton.addAction(UIAction(handler: { [weak self] _ in
  46. guard let self else { return }
  47. roomSession?.leaveRoom()
  48. }), for: .touchUpInside)
  49. addSubview(closeButton)
  50. closeButton.snp.makeConstraints { make in
  51. make.centerY.equalToSuperview()
  52. make.trailing.equalToSuperview().offset(-10)
  53. }
  54. let roomInfo = buildRoomInfo()
  55. addSubview(roomInfo)
  56. roomInfo.snp.makeConstraints { make in
  57. make.leading.equalToSuperview().offset(10)
  58. make.verticalEdges.equalToSuperview()
  59. }
  60. }
  61. private func buildRoomInfo() -> UIView {
  62. let container = UIView()
  63. hostAvatar.contentMode = .scaleAspectFill
  64. hostAvatar.layer.cornerRadius = 15
  65. hostAvatar.clipsToBounds = true
  66. container.addSubview(hostAvatar)
  67. hostAvatar.snp.makeConstraints { make in
  68. make.verticalEdges.equalToSuperview()
  69. make.leading.equalToSuperview()
  70. make.width.height.equalTo(30)
  71. }
  72. let textView = UIView()
  73. container.addSubview(textView)
  74. textView.snp.makeConstraints { make in
  75. make.centerY.equalToSuperview()
  76. make.leading.equalTo(hostAvatar.snp.trailing).offset(8)
  77. make.trailing.equalToSuperview()
  78. }
  79. roomNameLabel.font = .heading_h5
  80. roomNameLabel.textColor = .text_1
  81. textView.addSubview(roomNameLabel)
  82. roomNameLabel.snp.makeConstraints { make in
  83. make.horizontalEdges.equalToSuperview()
  84. make.top.equalToSuperview()
  85. }
  86. roomIdLabel.font = .systemFont(ofSize: 8)
  87. roomIdLabel.textColor = .text_1
  88. textView.addSubview(roomIdLabel)
  89. roomIdLabel.snp.makeConstraints { make in
  90. make.leading.equalToSuperview()
  91. make.trailing.lessThanOrEqualToSuperview()
  92. make.bottom.equalToSuperview()
  93. make.top.equalTo(roomNameLabel.snp.bottom).offset(2)
  94. }
  95. return container
  96. }
  97. }