Files
midi_ios/TUIKit/TUIRoomKit/Source/View/ViewModel/ExitRoomViewModel.swift
2025-08-14 10:07:49 +08:00

100 lines
3.3 KiB
Swift

//
// ExitRoomViewModel.swift
// TUIRoomKit
//
// Created by krabyu on 2023/8/23.
//
import Foundation
protocol ExitRoomViewModelResponder: AnyObject {
func makeToast(message: String)
func dismissView()
}
class ExitRoomViewModel {
var engineManager: EngineManager {
EngineManager.shared
}
var isRoomOwner: Bool {
engineManager.store.currentUser.userId == engineManager.store.roomInfo.ownerId
}
weak var viewResponder: ExitRoomViewModelResponder?
func isShownLeaveRoomButton() -> Bool {
if isRoomOwner {
return getFilterRoomOwnerNumber() > 0
} else {
return true
}
}
func isShownDestroyRoomButton() -> Bool {
return isRoomOwner
}
func leaveRoomAction() {
if isRoomOwner {
if getFilterRoomOwnerNumber() == 1, let userInfo = getNextRoomOwner() {
appointMasterAndExitRoom(userId: userInfo.userId)
} else if getFilterRoomOwnerNumber() > 1 {
viewResponder?.dismissView()
RoomRouter.shared.presentPopUpViewController(viewType: .transferMasterViewType, height: 720.scale375Height())
} else {
destroyRoom()
}
} else {
exitRoom()
}
}
func exitRoom() {
engineManager.exitRoom { [weak self] in
guard let self = self else { return }
self.viewResponder?.dismissView()
EngineEventCenter.shared.notifyUIEvent(key: .TUIRoomKitService_DismissConferenceViewController, param: [:])
} onError: { [weak self] code, message in
guard let self = self else { return }
self.viewResponder?.makeToast(message: message)
EngineEventCenter.shared.notifyUIEvent(key: .TUIRoomKitService_DismissConferenceViewController, param: [:])
}
}
func destroyRoom() {
engineManager.destroyRoom { [weak self] in
guard let self = self else { return }
self.viewResponder?.dismissView()
EngineEventCenter.shared.notifyUIEvent(key: .TUIRoomKitService_DismissConferenceViewController, param: [:])
} onError: { [weak self] code, message in
guard let self = self else { return }
self.viewResponder?.makeToast(message: message)
EngineEventCenter.shared.notifyUIEvent(key: .TUIRoomKitService_DismissConferenceViewController, param: [:])
}
}
private func getNextRoomOwner() -> UserEntity? {
let userInfoArray = engineManager.store.attendeeList.filter({ $0.userId != engineManager.store.roomInfo.ownerId })
return userInfoArray.first
}
private func getFilterRoomOwnerNumber() -> Int {
let array = engineManager.store.attendeeList.filter({ $0.userId != engineManager.store.roomInfo.ownerId })
return array.count
}
private func appointMasterAndExitRoom(userId: String) {
engineManager.changeUserRole(userId: userId, role: .roomOwner) { [weak self] in
guard let self = self else { return }
self.exitRoom()
} onError: { [weak self] code, message in
guard let self = self else { return }
self.viewResponder?.makeToast(message: message)
}
}
deinit {
debugPrint("deinit \(self)")
}
}