ExitRoomViewModel.swift 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //
  2. // ExitRoomViewModel.swift
  3. // TUIRoomKit
  4. //
  5. // Created by krabyu on 2023/8/23.
  6. //
  7. import Foundation
  8. protocol ExitRoomViewModelResponder: AnyObject {
  9. func makeToast(message: String)
  10. func dismissView()
  11. }
  12. class ExitRoomViewModel {
  13. var engineManager: EngineManager {
  14. EngineManager.shared
  15. }
  16. var isRoomOwner: Bool {
  17. return engineManager.store.currentUser.userRole == .roomOwner
  18. }
  19. weak var viewResponder: ExitRoomViewModelResponder?
  20. func isShownLeaveRoomButton() -> Bool {
  21. return true
  22. }
  23. func isShownDestroyRoomButton() -> Bool {
  24. return isRoomOwner
  25. }
  26. func isAbleToTransferTheOwner() -> Bool {
  27. return isRoomOwner && getFilterOwnerUserList().count > 0
  28. }
  29. func leaveRoomAction() {
  30. if isRoomOwner {
  31. let filterOwnerList = getFilterOwnerUserList()
  32. if filterOwnerList.count == 1, let userInfo = filterOwnerList.first {
  33. appointMasterAndExitRoom(userId: userInfo.userId)
  34. } else if filterOwnerList.count > 1 {
  35. viewResponder?.dismissView()
  36. RoomRouter.shared.presentPopUpViewController(viewType: .transferMasterViewType, height: 720.scale375Height())
  37. } else {
  38. exitRoom()
  39. }
  40. } else {
  41. exitRoom()
  42. }
  43. }
  44. func exitRoom() {
  45. engineManager.exitRoom()
  46. viewResponder?.dismissView()
  47. EngineEventCenter.shared.notifyUIEvent(key: .TUIRoomKitService_DismissConferenceViewController, param: [:])
  48. }
  49. func destroyRoom() {
  50. engineManager.destroyRoom { [weak self] in
  51. guard let self = self else { return }
  52. self.viewResponder?.dismissView()
  53. EngineEventCenter.shared.notifyUIEvent(key: .TUIRoomKitService_DismissConferenceViewController, param: [:])
  54. } onError: { [weak self] code, message in
  55. guard let self = self else { return }
  56. self.viewResponder?.makeToast(message: message)
  57. EngineEventCenter.shared.notifyUIEvent(key: .TUIRoomKitService_DismissConferenceViewController, param: [:])
  58. }
  59. }
  60. private func getFilterOwnerUserList() -> [UserEntity] {
  61. return engineManager.store.attendeeList.filter({ $0.userRole != .roomOwner })
  62. }
  63. private func appointMasterAndExitRoom(userId: String) {
  64. engineManager.changeUserRole(userId: userId, role: .roomOwner) { [weak self] in
  65. guard let self = self else { return }
  66. self.exitRoom()
  67. } onError: { [weak self] code, message in
  68. guard let self = self else { return }
  69. self.viewResponder?.makeToast(message: message)
  70. }
  71. }
  72. deinit {
  73. debugPrint("deinit \(self)")
  74. }
  75. }