| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- //
- // ConferenceListService.swift
- // TUIRoomKit
- //
- // Created by CY zhao on 2024/6/27.
- //
- import Foundation
- import RTCRoomEngine
- import Combine
- import Factory
- class ConferenceListService: NSObject {
- @WeakLazyInjected(\.conferenceStore) var store: ConferenceStore?
-
- private let listManager = TUIRoomEngine.sharedInstance().getExtension(extensionType: .conferenceListManager) as? TUIConferenceListManager
- typealias ConferencesFetchResult = ([ConferenceInfo], String)
- typealias AttendeesFetchResult = ([UserInfo], String, UInt)
-
- override init() {
- super.init()
- listManager?.addObserver(self)
- }
-
- deinit {
- listManager?.removeObserver(self)
- }
-
- func scheduleConference(conferenceInfo: TUIConferenceInfo) -> AnyPublisher<TUIConferenceInfo, RoomError> {
- return Future<TUIConferenceInfo, RoomError> { [weak self] promise in
- guard let self = self else { return }
- self.listManager?.scheduleConference(conferenceInfo) {
- promise(.success(conferenceInfo))
- } onError: { error, message in
- promise(.failure(RoomError(error: error, message: message)))
- }
- }
- .eraseToAnyPublisher()
- }
-
-
- func cancelConference(conferenceId: String) -> AnyPublisher<Void, RoomError> {
- return Future<Void, RoomError> { [weak self] promise in
- guard let self = self else { return }
- self.listManager?.cancelConference(conferenceId) {
- promise(.success(()))
- } onError: { error, message in
- promise(.failure(RoomError(error: error , message: message)))
- }
- }
- .eraseToAnyPublisher()
- }
-
- func updateConferenceInfo(conferenceInfo: TUIConferenceInfo, modifyFlag: TUIConferenceModifyFlag) -> AnyPublisher<Void, RoomError> {
- return Future<Void, RoomError> { [weak self] promise in
- guard let self = self else { return }
- self.listManager?.updateConferenceInfo(conferenceInfo: conferenceInfo, modifyFlag: modifyFlag) {
- promise(.success(()))
- } onError: { error, message in
- promise(.failure(RoomError(error: error , message: message)))
- }
- }
- .eraseToAnyPublisher()
- }
-
- func fetchConferenceList(status: TUIConferenceStatus, cursor: String, count: Int = 20) -> AnyPublisher<ConferencesFetchResult, RoomError> {
- return Future<ConferencesFetchResult, RoomError> { [weak self] promise in
- guard let self = self else { return }
- self.listManager?.fetchScheduledConferenceList(status: status,
- cursor: cursor,
- count: count) { conferenceList, cursor in
- let list = conferenceList.map { ConferenceInfo(with: $0) }
- promise(.success((list, cursor)))
- } onError: { error, message in
- promise(.failure(RoomError(error: error, message: message)))
- }
- }
- .eraseToAnyPublisher()
- }
-
- func fetchAttendeeList(conferenceId: String, cursor: String, count: Int = 20) -> AnyPublisher<AttendeesFetchResult, RoomError> {
- return Future<AttendeesFetchResult, RoomError> { [weak self] promise in
- guard let self = self else { return }
- self.listManager?.fetchAttendeeList(roomId: conferenceId, cursor: cursor, count: count) { attendeeList, cursor, totalCount in
- let userInfoList = attendeeList.map { UserInfo(userInfo: $0) }
- promise(.success((userInfoList, cursor, totalCount)))
- } onError: { error, message in
- promise(.failure(RoomError(error: error, message: message)))
- }
- }
- .eraseToAnyPublisher()
- }
-
- func addAttendeesByAdmin(conferenceId: String, userIdList: [String]) -> AnyPublisher<Void, RoomError> {
- return Future<Void, RoomError> { [weak self] promise in
- guard let self = self else { return }
- self.listManager?.addAttendeesByAdmin(roomId: conferenceId, userIdList: userIdList) {
- promise(.success(()))
- } onError: { error, message in
- promise(.failure(RoomError(error: error , message: message)))
- }
- }
- .eraseToAnyPublisher()
- }
-
- func removeAttendeesByAdmin(conferenceId: String, userIdList: [String]) -> AnyPublisher<Void, RoomError> {
- return Future<Void, RoomError> { [weak self] promise in
- guard let self = self else { return }
- self.listManager?.removeAttendeesByAdmin(roomId: conferenceId, userIdList: userIdList) {
- promise(.success(()))
- } onError: { error, message in
- promise(.failure(RoomError(error: error , message: message)))
- }
- }
- .eraseToAnyPublisher()
- }
-
- func fetchConferenceInfo(roomId: String) -> AnyPublisher<ConferenceInfo, RoomError> {
- return Future<ConferenceInfo, RoomError> { [weak self] promise in
- guard let self = self else { return }
- EngineManager.shared.fetchRoomInfo(roomId: roomId) { [weak self] roomInfo in
- guard let self = self, let roomInfo = roomInfo else { return }
- let currentList = self.store?.selectCurrent(ConferenceListSelectors.getConferenceList)
- guard var updateConference = currentList?.first(where: { $0.basicInfo.roomId == roomInfo.roomId }) else { return }
- updateConference.basicInfo = RoomInfo(with: roomInfo)
- promise(.success(updateConference))
- } onError: { error, message in
- promise(.failure(RoomError(error: error , message: message)))
- }
- }
- .eraseToAnyPublisher()
- }
- }
- extension ConferenceListService: TUIConferenceListManagerObserver {
- func onConferenceScheduled(conferenceInfo: TUIConferenceInfo) {
- guard let store = self.store else { return }
- let conference = ConferenceInfo(with: conferenceInfo)
- let currentList = store.selectCurrent(ConferenceListSelectors.getConferenceList)
- let contain = currentList.contains { $0.basicInfo.roomId == conference.basicInfo.roomId }
- if !contain {
- store.dispatch(action: ConferenceListActions.insertConference(payload: conference))
- }
- }
-
- func onConferenceCancelled(roomId: String, reason: TUIConferenceCancelReason, operateUser: TUIUserInfo) {
- guard let store = self.store else { return }
- let currentList = store.selectCurrent(ConferenceListSelectors.getConferenceList).map { $0.basicInfo.roomId }
- if currentList.contains(roomId) {
- store.dispatch(action: ConferenceListActions.removeConference(payload: roomId))
- store.dispatch(action: ScheduleResponseActions.onConferenceRemoved(payload: roomId))
- }
- }
-
- func onConferenceInfoChanged(conferenceInfo: TUIConferenceInfo, modifyFlag: TUIConferenceModifyFlag) {
- guard let store = self.store else { return }
- let currentList = store.selectCurrent(ConferenceListSelectors.getConferenceList)
- if let index = currentList.firstIndex(where: { $0.basicInfo.roomId == conferenceInfo.basicRoomInfo.roomId }) {
- var updateConference = currentList[index]
- if modifyFlag.contains(.roomName) {
- updateConference.basicInfo.name = conferenceInfo.basicRoomInfo.name
- }
- if modifyFlag.contains(.scheduleStartTime) || modifyFlag.contains(.scheduleEndTime) {
- updateConference.scheduleStartTime = conferenceInfo.scheduleStartTime
- updateConference.scheduleEndTime = conferenceInfo.scheduleEndTime
- updateConference.durationTime = conferenceInfo.scheduleEndTime - conferenceInfo.scheduleStartTime
- }
- store.dispatch(action: ConferenceListActions.onConferenceUpdated(payload: updateConference))
- }
- }
-
- func onConferenceStatusChanged(roomId: String, status: TUIConferenceStatus) {
- guard let store = self.store else { return }
- let currentList = store.selectCurrent(ConferenceListSelectors.getConferenceList)
- if let index = currentList.firstIndex(where: { $0.basicInfo.roomId == roomId }) {
- var updateConference = currentList[index]
- updateConference.status = status
- store.dispatch(action: ConferenceListActions.onConferenceUpdated(payload: updateConference))
- }
- }
-
- func onConferenceWillStart(conferenceInfo: TUIConferenceInfo) {
-
- }
-
- func onScheduleAttendeesChanged(roomId: String, leftUsers: [TUIUserInfo], joinedUsers: [TUIUserInfo]) {
- }
-
-
- }
|