提交
This commit is contained in:
163
TUIKit/TUIRoomKit/Source/View/ViewModel/RoomInfoViewModel.swift
Normal file
163
TUIKit/TUIRoomKit/Source/View/ViewModel/RoomInfoViewModel.swift
Normal file
@@ -0,0 +1,163 @@
|
||||
//
|
||||
// RoomInfoViewModel.swift
|
||||
// TUIRoomKit
|
||||
//
|
||||
// Created by janejntang on 2023/1/3.
|
||||
// Copyright © 2022 Tencent. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import RTCRoomEngine
|
||||
|
||||
enum CopyType {
|
||||
case copyRoomIdType
|
||||
case copyRoomLinkType
|
||||
case copyRoomPassword
|
||||
}
|
||||
|
||||
protocol RoomInfoResponder : NSObjectProtocol {
|
||||
func showCopyToast(copyType: CopyType?)
|
||||
func updateNameLabel(_ text: String)
|
||||
}
|
||||
|
||||
class RoomInfoViewModel: NSObject {
|
||||
private(set) var messageItems: [ListCellItemData] = []
|
||||
var store: RoomStore {
|
||||
EngineManager.shared.store
|
||||
}
|
||||
var roomInfo: TUIRoomInfo {
|
||||
store.roomInfo
|
||||
}
|
||||
lazy var title = {
|
||||
roomInfo.name
|
||||
}()
|
||||
weak var viewResponder: RoomInfoResponder?
|
||||
var roomLink: String? {
|
||||
guard let bundleId = Bundle.main.bundleIdentifier else { return nil }
|
||||
if bundleId == "com.tencent.tuiroom.apiexample" || bundleId == "com.tencent.fx.rtmpdemo" {
|
||||
return "https://web.sdk.qcloud.com/trtc/webrtc/test/tuiroom-inner/index.html#/" + "room?roomId=" + roomInfo.roomId
|
||||
} else if bundleId == "com.tencent.mrtc" {
|
||||
return "https://web.sdk.qcloud.com/component/tuiroom/index.html#/" + "room?roomId=" + roomInfo.roomId
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
private lazy var conferenceDetails = {
|
||||
title
|
||||
}()
|
||||
override init() {
|
||||
super.init()
|
||||
subscribeEngine()
|
||||
createSourceData()
|
||||
}
|
||||
|
||||
private func subscribeEngine() {
|
||||
EngineEventCenter.shared.subscribeEngine(event: .onConferenceInfoChanged, observer: self)
|
||||
}
|
||||
|
||||
private func unsubscribeUIEvent() {
|
||||
EngineEventCenter.shared.unsubscribeEngine(event: .onConferenceInfoChanged, observer: self)
|
||||
}
|
||||
|
||||
func createListCellItemData(titleText: String, messageText: String,
|
||||
hasButton: Bool, copyType: CopyType?) -> ListCellItemData {
|
||||
let item = ListCellItemData()
|
||||
item.titleText = titleText
|
||||
item.messageText = messageText
|
||||
item.hasRightButton = hasButton
|
||||
if item.hasRightButton {
|
||||
let buttonData = ButtonItemData()
|
||||
buttonData.normalIcon = "room_copy"
|
||||
buttonData.normalTitle = .copyText
|
||||
buttonData.cornerRadius = 4
|
||||
buttonData.titleFont = UIFont(name: "PingFangSC-Regular", size: 12)
|
||||
buttonData.titleColor = UIColor(0xB2BBD1)
|
||||
buttonData.backgroundColor = UIColor(0x6B758A).withAlphaComponent(0.7)
|
||||
buttonData.resourceBundle = tuiRoomKitBundle()
|
||||
buttonData.action = { [weak self] sender in
|
||||
guard let self = self, let button = sender as? UIButton else { return }
|
||||
self.copyAction(sender: button, text: item.messageText,copyType: copyType)
|
||||
}
|
||||
item.buttonData = buttonData
|
||||
}
|
||||
conferenceDetails = conferenceDetails + "\n\(titleText) : \(messageText)"
|
||||
return item
|
||||
}
|
||||
|
||||
func createSourceData() {
|
||||
var userName = roomInfo.ownerId
|
||||
if let userModel = store.attendeeList.first(where: { $0.userId == roomInfo.ownerId}) {
|
||||
userName = userModel.userName
|
||||
}
|
||||
let roomHostItem = createListCellItemData(titleText: .roomHostText, messageText: userName, hasButton: false, copyType: nil)
|
||||
messageItems.append(roomHostItem)
|
||||
let roomTypeItem = createListCellItemData(titleText: .roomTypeText, messageText: roomInfo.isSeatEnabled ? .raiseHandSpeakText: .freedomSpeakText, hasButton: false, copyType: nil)
|
||||
messageItems.append(roomTypeItem)
|
||||
let roomIdItem = createListCellItemData(titleText: .roomIdText, messageText: roomInfo.roomId, hasButton: true, copyType: .copyRoomIdType)
|
||||
messageItems.append(roomIdItem)
|
||||
if roomInfo.password.count > 0 {
|
||||
let passwordItem = createListCellItemData(titleText: .conferencePasswordText, messageText: roomInfo.password, hasButton: true, copyType: .copyRoomPassword)
|
||||
messageItems.append(passwordItem)
|
||||
}
|
||||
if let roomLink = roomLink {
|
||||
let roomLinkItem = createListCellItemData(titleText: .roomLinkText, messageText: roomLink, hasButton: true, copyType: .copyRoomLinkType)
|
||||
messageItems.append(roomLinkItem)
|
||||
}
|
||||
}
|
||||
|
||||
func copyAction(sender: UIButton, text: String, copyType: CopyType?){
|
||||
UIPasteboard.general.string = text
|
||||
viewResponder?.showCopyToast(copyType: copyType)
|
||||
}
|
||||
|
||||
func codeAction(sender: UIButton) {
|
||||
RoomRouter.shared.presentPopUpViewController(viewType: .QRCodeViewType, height: 720.scale375Height())
|
||||
}
|
||||
|
||||
func copyConferenceDetails() {
|
||||
UIPasteboard.general.string = conferenceDetails
|
||||
}
|
||||
|
||||
deinit {
|
||||
unsubscribeUIEvent()
|
||||
debugPrint("deinit \(self)")
|
||||
}
|
||||
}
|
||||
|
||||
extension RoomInfoViewModel: RoomEngineEventResponder {
|
||||
func onEngineEvent(name: EngineEventCenter.RoomEngineEvent, param: [String : Any]?) {
|
||||
switch name {
|
||||
case .onConferenceInfoChanged:
|
||||
guard let conferenceInfo = param?["conferenceInfo"] as? TUIConferenceInfo else { return }
|
||||
guard let modifyFlag = param?["modifyFlag"] as? TUIConferenceModifyFlag else { return }
|
||||
guard modifyFlag.contains(.roomName) else { return }
|
||||
viewResponder?.updateNameLabel(conferenceInfo.basicRoomInfo.name)
|
||||
default: break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private extension String {
|
||||
static var freedomSpeakText: String {
|
||||
localized("Free Speech Conference")
|
||||
}
|
||||
static var raiseHandSpeakText: String {
|
||||
localized("On-stage Speaking Conference")
|
||||
}
|
||||
static var roomHostText: String {
|
||||
localized("Host")
|
||||
}
|
||||
static var roomTypeText: String {
|
||||
localized("Conference Type")
|
||||
}
|
||||
static var roomIdText: String {
|
||||
localized("ConferenceID")
|
||||
}
|
||||
static var roomLinkText: String {
|
||||
localized("Link")
|
||||
}
|
||||
static var copyText: String {
|
||||
localized("Copy")
|
||||
}
|
||||
static let conferencePasswordText = localized("Conference password")
|
||||
}
|
||||
Reference in New Issue
Block a user