RoomInfoViewModel.swift 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. //
  2. // RoomInfoViewModel.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2023/1/3.
  6. // Copyright © 2022 Tencent. All rights reserved.
  7. //
  8. import Foundation
  9. import RTCRoomEngine
  10. enum CopyType {
  11. case copyRoomIdType
  12. case copyRoomLinkType
  13. case copyRoomPassword
  14. }
  15. protocol RoomInfoResponder : NSObjectProtocol {
  16. func showCopyToast(copyType: CopyType?)
  17. func updateConferenceNameLabel(_ text: String)
  18. func updateHostName(_ text: String)
  19. }
  20. class RoomInfoViewModel: NSObject {
  21. private(set) var messageItems: [ListCellItemData] = []
  22. var store: RoomStore {
  23. EngineManager.shared.store
  24. }
  25. var roomInfo: TUIRoomInfo {
  26. store.roomInfo
  27. }
  28. lazy var title = {
  29. roomInfo.name
  30. }()
  31. weak var viewResponder: RoomInfoResponder?
  32. var roomLink: String? {
  33. guard let bundleId = Bundle.main.bundleIdentifier else { return nil }
  34. if bundleId == "com.tencent.tuiroom.apiexample" || bundleId == "com.tencent.fx.rtmpdemo" {
  35. return "https://web.sdk.qcloud.com/trtc/webrtc/test/tuiroom-inner/index.html#/" + "room?roomId=" + roomInfo.roomId
  36. } else if bundleId == "com.tencent.mrtc" {
  37. return "https://web.sdk.qcloud.com/component/tuiroom/index.html#/" + "room?roomId=" + roomInfo.roomId
  38. } else {
  39. return nil
  40. }
  41. }
  42. private lazy var conferenceDetails = {
  43. title
  44. }()
  45. override init() {
  46. super.init()
  47. subscribeEngine()
  48. createSourceData()
  49. }
  50. private func subscribeEngine() {
  51. EngineEventCenter.shared.subscribeEngine(event: .onConferenceInfoChanged, observer: self)
  52. EngineEventCenter.shared.subscribeEngine(event: .onUserInfoChanged, observer: self)
  53. }
  54. private func unsubscribeUIEvent() {
  55. EngineEventCenter.shared.unsubscribeEngine(event: .onConferenceInfoChanged, observer: self)
  56. EngineEventCenter.shared.unsubscribeEngine(event: .onUserInfoChanged, observer: self)
  57. }
  58. func createListCellItemData(titleText: String, messageText: String,
  59. hasButton: Bool, copyType: CopyType?) -> ListCellItemData {
  60. let item = ListCellItemData()
  61. item.titleText = titleText
  62. item.messageText = messageText
  63. item.hasRightButton = hasButton
  64. if item.hasRightButton {
  65. let buttonData = ButtonItemData()
  66. buttonData.normalIcon = "room_copy"
  67. buttonData.normalTitle = .copyText
  68. buttonData.cornerRadius = 4
  69. buttonData.titleFont = UIFont(name: "PingFangSC-Regular", size: 12)
  70. buttonData.titleColor = UIColor(0xB2BBD1)
  71. buttonData.backgroundColor = UIColor(0x6B758A).withAlphaComponent(0.7)
  72. buttonData.resourceBundle = tuiRoomKitBundle()
  73. buttonData.action = { [weak self] sender in
  74. guard let self = self, let button = sender as? UIButton else { return }
  75. self.copyAction(sender: button, text: item.messageText,copyType: copyType)
  76. }
  77. item.buttonData = buttonData
  78. }
  79. conferenceDetails = conferenceDetails + "\n\(titleText) : \(messageText)"
  80. return item
  81. }
  82. func createSourceData() {
  83. var userName = roomInfo.ownerId
  84. if let userModel = store.attendeeList.first(where: { $0.userId == roomInfo.ownerId}) {
  85. userName = userModel.userName
  86. }
  87. var roomHostItem = createListCellItemData(titleText: .roomHostText, messageText: userName, hasButton: false, copyType: nil)
  88. roomHostItem.type = .hostNameType
  89. messageItems.append(roomHostItem)
  90. let roomTypeItem = createListCellItemData(titleText: .roomTypeText, messageText: roomInfo.isSeatEnabled ? .raiseHandSpeakText: .freedomSpeakText, hasButton: false, copyType: nil)
  91. messageItems.append(roomTypeItem)
  92. let roomIdItem = createListCellItemData(titleText: .roomIdText, messageText: roomInfo.roomId, hasButton: true, copyType: .copyRoomIdType)
  93. messageItems.append(roomIdItem)
  94. if roomInfo.password.count > 0 {
  95. let passwordItem = createListCellItemData(titleText: .conferencePasswordText, messageText: roomInfo.password, hasButton: true, copyType: .copyRoomPassword)
  96. messageItems.append(passwordItem)
  97. }
  98. if let roomLink = roomLink {
  99. let roomLinkItem = createListCellItemData(titleText: .roomLinkText, messageText: roomLink, hasButton: true, copyType: .copyRoomLinkType)
  100. messageItems.append(roomLinkItem)
  101. }
  102. }
  103. func copyAction(sender: UIButton, text: String, copyType: CopyType?){
  104. UIPasteboard.general.string = text
  105. viewResponder?.showCopyToast(copyType: copyType)
  106. }
  107. func codeAction(sender: UIButton) {
  108. RoomRouter.shared.presentPopUpViewController(viewType: .QRCodeViewType, height: 720.scale375Height())
  109. }
  110. func copyConferenceDetails() {
  111. UIPasteboard.general.string = conferenceDetails
  112. }
  113. deinit {
  114. unsubscribeUIEvent()
  115. debugPrint("deinit \(self)")
  116. }
  117. }
  118. extension RoomInfoViewModel: RoomEngineEventResponder {
  119. func onEngineEvent(name: EngineEventCenter.RoomEngineEvent, param: [String : Any]?) {
  120. switch name {
  121. case .onConferenceInfoChanged:
  122. guard let conferenceInfo = param?["conferenceInfo"] as? TUIConferenceInfo else { return }
  123. guard let modifyFlag = param?["modifyFlag"] as? TUIConferenceModifyFlag else { return }
  124. guard modifyFlag.contains(.roomName) else { return }
  125. viewResponder?.updateConferenceNameLabel(conferenceInfo.basicRoomInfo.name)
  126. case .onUserInfoChanged:
  127. guard let userInfo = param?["userInfo"] as? TUIUserInfo else { return }
  128. guard let modifyFlag = param?["modifyFlag"] as? TUIUserInfoModifyFlag else { return }
  129. guard userInfo.userId == roomInfo.ownerId else { return }
  130. guard modifyFlag.contains(.nameCard) else { return }
  131. viewResponder?.updateHostName(userInfo.nameCard)
  132. default: break
  133. }
  134. }
  135. }
  136. private extension String {
  137. static var freedomSpeakText: String {
  138. localized("Free Speech Conference")
  139. }
  140. static var raiseHandSpeakText: String {
  141. localized("On-stage Speaking Conference")
  142. }
  143. static var roomHostText: String {
  144. localized("Host")
  145. }
  146. static var roomTypeText: String {
  147. localized("Conference Type")
  148. }
  149. static var roomIdText: String {
  150. localized("ConferenceID")
  151. }
  152. static var roomLinkText: String {
  153. localized("Link")
  154. }
  155. static var copyText: String {
  156. localized("Copy")
  157. }
  158. static let conferencePasswordText = localized("Conference password")
  159. }