RoomMessageViewModel.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //
  2. // RoomMessageViewModel.swift
  3. // TUIRoomKit
  4. //
  5. // Created by janejntang on 2023/5/10.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. import Foundation
  9. import RTCRoomEngine
  10. import TUICore
  11. import TIMCommon
  12. protocol RoomMessageViewResponder: NSObject {
  13. func updateStackView()
  14. func updateRoomStatus()
  15. func updateEnteredRoom()
  16. func updateExitRoom()
  17. }
  18. class RoomMessageViewModel: NSObject {
  19. var message: RoomMessageModel
  20. private var engineManager: EngineManager {
  21. EngineManager.shared
  22. }
  23. lazy var userId: String = {
  24. return TUILogin.getUserID() ?? EngineManager.shared.store.currentUser.userId
  25. }()
  26. var messageManager: RoomMessageManager {
  27. RoomMessageManager.shared
  28. }
  29. let roomManager = RoomManager.shared
  30. weak var viewResponder: RoomMessageViewResponder?
  31. init(message: RoomMessageModel) {
  32. self.message = message
  33. super.init()
  34. roomManager.roomObserver.addListener(listener: self)
  35. }
  36. deinit {
  37. roomManager.roomObserver.removeListener(listener: self)
  38. debugPrint("deinit \(self)")
  39. }
  40. func changeMessage(message: RoomMessageModel) {
  41. self.message = message
  42. viewResponder?.updateStackView()
  43. viewResponder?.updateRoomStatus()
  44. }
  45. func enterRoomAction() {
  46. guard BusinessSceneUtil.canJoinRoom() else { return }
  47. if roomManager.isEnteredOtherRoom(roomId: message.roomId) {
  48. roomManager.exitOrDestroyPreviousRoom { [weak self] in
  49. guard let self = self else { return }
  50. self.enterRoom()
  51. } onError: { [weak self] code, message in
  52. debugPrint("exitRoom,code:\(code),message:\(message)")
  53. guard let self = self else { return }
  54. self.enterRoom()
  55. }
  56. } else {
  57. enterRoom()
  58. }
  59. }
  60. private func enterRoom() {
  61. if !engineManager.store.isEnteredRoom {
  62. roomManager.enterRoom(roomId: message.roomId) {_ in
  63. let vc = ConferenceMainViewController()
  64. RoomRouter.shared.push(viewController: vc)
  65. } onError: { [weak self] code, errorMessage in
  66. if let self = self, code == .roomIdNotExist {
  67. self.messageManager.resendRoomMessage(message: self.message, dic: ["roomState": RoomMessageModel.RoomState.destroyed.rawValue])
  68. }
  69. RoomRouter.makeToast(toast: code.description ?? errorMessage)
  70. }
  71. } else {
  72. EngineEventCenter.shared.notifyUIEvent(key: .TUIRoomKitService_ShowRoomMainView, param: [:])
  73. }
  74. }
  75. func inviteUserAction() {
  76. guard message.groupId.count > 0 else { return }
  77. let inviter = TUILoginUserInfo()
  78. inviter.userId = userId
  79. inviter.userName = TUILogin.getNickName() ?? ""
  80. inviter.avatarUrl = TUILogin.getFaceUrl() ?? ""
  81. InviteToJoinRoomManager.startInviteToJoinRoom(message: message, inviter: inviter)
  82. }
  83. }
  84. extension RoomMessageViewModel: RoomObserverListener {
  85. func onRoomEnter(messageId: String, code: Int, message: String) {
  86. if code == 0, messageId == self.message.messageId {
  87. viewResponder?.updateEnteredRoom()
  88. }
  89. }
  90. func onRoomExit(messageId: String) {
  91. if messageId == self.message.messageId {
  92. viewResponder?.updateExitRoom()
  93. }
  94. }
  95. }