ConferenceListService.swift 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. //
  2. // ConferenceListService.swift
  3. // TUIRoomKit
  4. //
  5. // Created by CY zhao on 2024/6/27.
  6. //
  7. import Foundation
  8. import RTCRoomEngine
  9. import Combine
  10. import Factory
  11. class ConferenceListService: NSObject {
  12. @WeakLazyInjected(\.conferenceStore) var store: ConferenceStore?
  13. private let listManager = TUIRoomEngine.sharedInstance().getExtension(extensionType: .conferenceListManager) as? TUIConferenceListManager
  14. typealias ConferencesFetchResult = ([ConferenceInfo], String)
  15. typealias AttendeesFetchResult = ([UserInfo], String, UInt)
  16. override init() {
  17. super.init()
  18. listManager?.addObserver(self)
  19. }
  20. deinit {
  21. listManager?.removeObserver(self)
  22. }
  23. func scheduleConference(conferenceInfo: TUIConferenceInfo) -> AnyPublisher<TUIConferenceInfo, RoomError> {
  24. return Future<TUIConferenceInfo, RoomError> { [weak self] promise in
  25. guard let self = self else { return }
  26. self.listManager?.scheduleConference(conferenceInfo) {
  27. promise(.success(conferenceInfo))
  28. } onError: { error, message in
  29. promise(.failure(RoomError(error: error, message: message)))
  30. }
  31. }
  32. .eraseToAnyPublisher()
  33. }
  34. func cancelConference(conferenceId: String) -> AnyPublisher<Void, RoomError> {
  35. return Future<Void, RoomError> { [weak self] promise in
  36. guard let self = self else { return }
  37. self.listManager?.cancelConference(conferenceId) {
  38. promise(.success(()))
  39. } onError: { error, message in
  40. promise(.failure(RoomError(error: error , message: message)))
  41. }
  42. }
  43. .eraseToAnyPublisher()
  44. }
  45. func updateConferenceInfo(conferenceInfo: TUIConferenceInfo, modifyFlag: TUIConferenceModifyFlag) -> AnyPublisher<Void, RoomError> {
  46. return Future<Void, RoomError> { [weak self] promise in
  47. guard let self = self else { return }
  48. self.listManager?.updateConferenceInfo(conferenceInfo: conferenceInfo, modifyFlag: modifyFlag) {
  49. promise(.success(()))
  50. } onError: { error, message in
  51. promise(.failure(RoomError(error: error , message: message)))
  52. }
  53. }
  54. .eraseToAnyPublisher()
  55. }
  56. func fetchConferenceList(status: TUIConferenceStatus, cursor: String, count: Int = 20) -> AnyPublisher<ConferencesFetchResult, RoomError> {
  57. return Future<ConferencesFetchResult, RoomError> { [weak self] promise in
  58. guard let self = self else { return }
  59. self.listManager?.fetchScheduledConferenceList(status: status,
  60. cursor: cursor,
  61. count: count) { conferenceList, cursor in
  62. let list = conferenceList.map { ConferenceInfo(with: $0) }
  63. promise(.success((list, cursor)))
  64. } onError: { error, message in
  65. promise(.failure(RoomError(error: error, message: message)))
  66. }
  67. }
  68. .eraseToAnyPublisher()
  69. }
  70. func fetchAttendeeList(conferenceId: String, cursor: String, count: Int = 20) -> AnyPublisher<AttendeesFetchResult, RoomError> {
  71. return Future<AttendeesFetchResult, RoomError> { [weak self] promise in
  72. guard let self = self else { return }
  73. self.listManager?.fetchAttendeeList(roomId: conferenceId, cursor: cursor, count: count) { attendeeList, cursor, totalCount in
  74. let userInfoList = attendeeList.map { UserInfo(userInfo: $0) }
  75. promise(.success((userInfoList, cursor, totalCount)))
  76. } onError: { error, message in
  77. promise(.failure(RoomError(error: error, message: message)))
  78. }
  79. }
  80. .eraseToAnyPublisher()
  81. }
  82. func addAttendeesByAdmin(conferenceId: String, userIdList: [String]) -> AnyPublisher<Void, RoomError> {
  83. return Future<Void, RoomError> { [weak self] promise in
  84. guard let self = self else { return }
  85. self.listManager?.addAttendeesByAdmin(roomId: conferenceId, userIdList: userIdList) {
  86. promise(.success(()))
  87. } onError: { error, message in
  88. promise(.failure(RoomError(error: error , message: message)))
  89. }
  90. }
  91. .eraseToAnyPublisher()
  92. }
  93. func removeAttendeesByAdmin(conferenceId: String, userIdList: [String]) -> AnyPublisher<Void, RoomError> {
  94. return Future<Void, RoomError> { [weak self] promise in
  95. guard let self = self else { return }
  96. self.listManager?.removeAttendeesByAdmin(roomId: conferenceId, userIdList: userIdList) {
  97. promise(.success(()))
  98. } onError: { error, message in
  99. promise(.failure(RoomError(error: error , message: message)))
  100. }
  101. }
  102. .eraseToAnyPublisher()
  103. }
  104. func fetchConferenceInfo(roomId: String) -> AnyPublisher<ConferenceInfo, RoomError> {
  105. return Future<ConferenceInfo, RoomError> { [weak self] promise in
  106. guard let self = self else { return }
  107. EngineManager.shared.fetchRoomInfo(roomId: roomId) { [weak self] roomInfo in
  108. guard let self = self, let roomInfo = roomInfo else { return }
  109. let currentList = self.store?.selectCurrent(ConferenceListSelectors.getConferenceList)
  110. guard var updateConference = currentList?.first(where: { $0.basicInfo.roomId == roomInfo.roomId }) else { return }
  111. updateConference.basicInfo = RoomInfo(with: roomInfo)
  112. promise(.success(updateConference))
  113. } onError: { error, message in
  114. promise(.failure(RoomError(error: error , message: message)))
  115. }
  116. }
  117. .eraseToAnyPublisher()
  118. }
  119. }
  120. extension ConferenceListService: TUIConferenceListManagerObserver {
  121. func onConferenceScheduled(conferenceInfo: TUIConferenceInfo) {
  122. guard let store = self.store else { return }
  123. let conference = ConferenceInfo(with: conferenceInfo)
  124. let currentList = store.selectCurrent(ConferenceListSelectors.getConferenceList)
  125. let contain = currentList.contains { $0.basicInfo.roomId == conference.basicInfo.roomId }
  126. if !contain {
  127. store.dispatch(action: ConferenceListActions.insertConference(payload: conference))
  128. }
  129. }
  130. func onConferenceCancelled(roomId: String, reason: TUIConferenceCancelReason, operateUser: TUIUserInfo) {
  131. guard let store = self.store else { return }
  132. let currentList = store.selectCurrent(ConferenceListSelectors.getConferenceList).map { $0.basicInfo.roomId }
  133. if currentList.contains(roomId) {
  134. store.dispatch(action: ConferenceListActions.removeConference(payload: roomId))
  135. store.dispatch(action: ScheduleResponseActions.onConferenceRemoved(payload: roomId))
  136. }
  137. }
  138. func onConferenceInfoChanged(conferenceInfo: TUIConferenceInfo, modifyFlag: TUIConferenceModifyFlag) {
  139. guard let store = self.store else { return }
  140. let currentList = store.selectCurrent(ConferenceListSelectors.getConferenceList)
  141. if let index = currentList.firstIndex(where: { $0.basicInfo.roomId == conferenceInfo.basicRoomInfo.roomId }) {
  142. var updateConference = currentList[index]
  143. if modifyFlag.contains(.roomName) {
  144. updateConference.basicInfo.name = conferenceInfo.basicRoomInfo.name
  145. }
  146. if modifyFlag.contains(.scheduleStartTime) || modifyFlag.contains(.scheduleEndTime) {
  147. updateConference.scheduleStartTime = conferenceInfo.scheduleStartTime
  148. updateConference.scheduleEndTime = conferenceInfo.scheduleEndTime
  149. updateConference.durationTime = conferenceInfo.scheduleEndTime - conferenceInfo.scheduleStartTime
  150. }
  151. store.dispatch(action: ConferenceListActions.onConferenceUpdated(payload: updateConference))
  152. }
  153. }
  154. func onConferenceStatusChanged(roomId: String, status: TUIConferenceStatus) {
  155. guard let store = self.store else { return }
  156. let currentList = store.selectCurrent(ConferenceListSelectors.getConferenceList)
  157. if let index = currentList.firstIndex(where: { $0.basicInfo.roomId == roomId }) {
  158. var updateConference = currentList[index]
  159. updateConference.status = status
  160. store.dispatch(action: ConferenceListActions.onConferenceUpdated(payload: updateConference))
  161. }
  162. }
  163. func onConferenceWillStart(conferenceInfo: TUIConferenceInfo) {
  164. }
  165. func onScheduleAttendeesChanged(roomId: String, leftUsers: [TUIUserInfo], joinedUsers: [TUIUserInfo]) {
  166. }
  167. }