LNCreateRoomPanel.swift 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. //
  2. // LNCreateRoomPanel.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/3/9.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNCreateRoomPanel: LNPopupView {
  11. private let cover = LNImageUploadView()
  12. private let coverLabel = UILabel()
  13. private let nameLabel = UILabel()
  14. private let nameCountLabel = UILabel()
  15. private var curName: String = "" {
  16. didSet {
  17. if !curName.isEmpty {
  18. nameLabel.textColor = .text_5
  19. nameLabel.text = curName
  20. nameCountLabel.text = "\(curName.count)/\(LNRoomManager.RoomNameMaxInput)"
  21. } else {
  22. nameLabel.textColor = .text_2
  23. nameLabel.text = .init(key: "A00316")
  24. nameCountLabel.text = "0/\(LNRoomManager.RoomNameMaxInput)"
  25. }
  26. checkCreate()
  27. }
  28. }
  29. private let muteSwitch = UISwitch()
  30. private let createButton = UIButton()
  31. override init(frame: CGRect) {
  32. super.init(frame: frame)
  33. setupViews()
  34. LNRoomManager.shared.fetchMyRoomInfo { [weak self] roomInfo in
  35. guard let self else { return }
  36. guard let roomInfo else { return }
  37. cover.loadImage(url: roomInfo.coverURL)
  38. curName = roomInfo.liveName
  39. }
  40. }
  41. required init?(coder: NSCoder) {
  42. fatalError("init(coder:) has not been implemented")
  43. }
  44. }
  45. extension LNCreateRoomPanel: LNImageUploadViewDelegate {
  46. func onImageUploadView(view: LNImageUploadView, didUploadImage url: String) {
  47. coverLabel.text = .init(key: "A00321")
  48. checkCreate()
  49. }
  50. }
  51. extension LNCreateRoomPanel {
  52. private func checkCreate() {
  53. createButton.isEnabled = !curName.isEmpty && cover.imageUrl?.isEmpty == false
  54. }
  55. private func setupViews() {
  56. let header = buildHeader()
  57. container.addSubview(header)
  58. header.snp.makeConstraints { make in
  59. make.horizontalEdges.equalToSuperview()
  60. make.top.equalToSuperview()
  61. }
  62. let stackView = UIStackView()
  63. stackView.axis = .vertical
  64. stackView.spacing = 16
  65. container.addSubview(stackView)
  66. stackView.snp.makeConstraints { make in
  67. make.top.equalTo(header.snp.bottom)
  68. make.horizontalEdges.equalToSuperview().inset(16)
  69. make.bottom.equalToSuperview().offset(commonBottomInset)
  70. }
  71. stackView.addArrangedSubview(buildCover())
  72. stackView.addArrangedSubview(buildTextInfo())
  73. stackView.addArrangedSubview(buildSettings())
  74. createButton.setBackgroundImage(.primary_8, for: .normal)
  75. createButton.setImage(.icRoomCreate, for: .normal)
  76. createButton.setTitle(.init(key: "A00313"), for: .normal)
  77. createButton.layer.cornerRadius = 23.5
  78. createButton.clipsToBounds = true
  79. createButton.titleLabel?.font = .heading_h3
  80. createButton.titleEdgeInsets = .init(top: 0, left: 4, bottom: 0, right: 0)
  81. createButton.addAction(UIAction(handler: { [weak self] _ in
  82. guard let self else { return }
  83. LNRoomManager.shared.createRoom(roomName: curName, cover: cover.imageUrl ?? "")
  84. { [weak self] id in
  85. guard let self else { return }
  86. guard let id else { return }
  87. dismiss()
  88. pushToRoom(id)
  89. }
  90. }), for: .touchUpInside)
  91. stackView.addArrangedSubview(createButton)
  92. createButton.snp.makeConstraints { make in
  93. make.height.equalTo(47)
  94. }
  95. }
  96. private func buildHeader() -> UIView {
  97. let container = UIView()
  98. container.snp.makeConstraints { make in
  99. make.height.equalTo(52)
  100. }
  101. let titleLabel = UILabel()
  102. titleLabel.text = .init(key: "A00314")
  103. titleLabel.font = .heading_h3
  104. titleLabel.textColor = .text_5
  105. container.addSubview(titleLabel)
  106. titleLabel.snp.makeConstraints { make in
  107. make.center.equalToSuperview()
  108. }
  109. return container
  110. }
  111. private func buildCover() -> UIView {
  112. let container = UIView()
  113. let holder = UIView()
  114. holder.backgroundColor = .fill_2
  115. holder.layer.cornerRadius = 12
  116. holder.clipsToBounds = true
  117. holder.onTap { [weak self] in
  118. guard let self else { return }
  119. LNBottomSheetMenu.showImageSelectMenu { [weak self] image, _ in
  120. guard let self else { return }
  121. if let image {
  122. cover.uploadImage(image: image)
  123. }
  124. }
  125. }
  126. container.addSubview(holder)
  127. holder.snp.makeConstraints { make in
  128. make.centerX.equalToSuperview()
  129. make.verticalEdges.equalToSuperview()
  130. make.width.height.equalTo(105)
  131. }
  132. let config = UIImage.SymbolConfiguration(pointSize: 17)
  133. let plus = UIImageView()
  134. plus.image = .init(systemName: "plus", withConfiguration: config)
  135. plus.tintColor = .text_3
  136. holder.addSubview(plus)
  137. plus.snp.makeConstraints { make in
  138. make.center.equalToSuperview()
  139. }
  140. cover.delegate = self
  141. cover.showClearButton = false
  142. holder.addSubview(cover)
  143. cover.snp.makeConstraints { make in
  144. make.edges.equalToSuperview()
  145. }
  146. let bottom = UIView()
  147. bottom.backgroundColor = .black.withAlphaComponent(0.3)
  148. holder.addSubview(bottom)
  149. bottom.snp.makeConstraints { make in
  150. make.horizontalEdges.equalToSuperview()
  151. make.bottom.equalToSuperview()
  152. make.height.equalTo(22)
  153. }
  154. coverLabel.text = .init(key: "A00319")
  155. coverLabel.font = .body_s
  156. coverLabel.textColor = .text_1
  157. bottom.addSubview(coverLabel)
  158. coverLabel.snp.makeConstraints { make in
  159. make.center.equalToSuperview()
  160. }
  161. return container
  162. }
  163. private func buildTextInfo() -> UIView {
  164. let container = UIView()
  165. let titleLabel = UILabel()
  166. titleLabel.font = .heading_h5
  167. titleLabel.textColor = .text_4
  168. titleLabel.text = .init(key: "A00315")
  169. container.addSubview(titleLabel)
  170. titleLabel.snp.makeConstraints { make in
  171. make.leading.equalToSuperview()
  172. make.top.equalToSuperview()
  173. }
  174. nameCountLabel.font = .body_s
  175. nameCountLabel.textColor = .text_4
  176. container.addSubview(nameCountLabel)
  177. nameCountLabel.snp.makeConstraints { make in
  178. make.centerY.equalTo(titleLabel)
  179. make.trailing.equalToSuperview()
  180. }
  181. let holder = UIView()
  182. holder.layer.cornerRadius = 8
  183. holder.backgroundColor = .fill_1
  184. holder.onTap { [weak self] in
  185. guard let self else { return }
  186. let panel = LNRoomNameInputPanel()
  187. panel.handler = { [weak self] name in
  188. guard let self else { return }
  189. curName = name
  190. }
  191. panel.update(curName)
  192. panel.popup()
  193. }
  194. container.addSubview(holder)
  195. holder.snp.makeConstraints { make in
  196. make.horizontalEdges.equalToSuperview()
  197. make.top.equalTo(titleLabel.snp.bottom).offset(8)
  198. make.bottom.equalToSuperview()
  199. make.height.equalTo(46)
  200. }
  201. nameLabel.text = .init(key: "A00316")
  202. nameLabel.font = .heading_h4
  203. nameLabel.textColor = .text_2
  204. holder.addSubview(nameLabel)
  205. nameLabel.snp.makeConstraints { make in
  206. make.horizontalEdges.equalToSuperview().inset(12)
  207. make.centerY.equalToSuperview()
  208. }
  209. return container
  210. }
  211. private func buildSettings() -> UIView {
  212. let container = UIView()
  213. let titleLabel = UILabel()
  214. titleLabel.font = .heading_h4
  215. titleLabel.textColor = .text_5
  216. titleLabel.text = .init(key: "A00317")
  217. container.addSubview(titleLabel)
  218. titleLabel.snp.makeConstraints { make in
  219. make.leading.equalToSuperview()
  220. make.centerY.equalToSuperview()
  221. }
  222. let scaleX: CGFloat = 40.0 / 51.0
  223. let scaleY: CGFloat = 24.5 / 31.0
  224. muteSwitch.onTintColor = .primary_5
  225. muteSwitch.transform = CGAffineTransform(scaleX: scaleX, y: scaleY)
  226. container.addSubview(muteSwitch)
  227. muteSwitch.snp.makeConstraints { make in
  228. make.verticalEdges.equalToSuperview()
  229. make.trailing.equalToSuperview()
  230. make.leading.greaterThanOrEqualTo(titleLabel.snp.trailing).offset(12)
  231. }
  232. return container
  233. }
  234. }