LNCreateRoomPanel.swift 8.9 KB

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