100 lines
3.3 KiB
Swift
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)")
|
||
|
|
}
|
||
|
|
}
|