ConferenceInvitationEffects.swift 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. //
  2. // ConferenceInvitationEffects.swift
  3. // TUIRoomKit
  4. //
  5. // Created by jeremiawang on 2024/8/12.
  6. //
  7. import Foundation
  8. import RTCRoomEngine
  9. import Combine
  10. import Factory
  11. class ConferenceInvitationEffects: Effects {
  12. typealias Environment = ServiceCenter
  13. let inviteUsers = Effect<Environment>.dispatchingOne { actions, environment in
  14. actions.wasCreated(from: ConferenceInvitationActions.inviteUsers)
  15. .flatMap { action in
  16. environment.conferenceInvitationService.inviteUsers(roomId: action.payload.0, userIdList: action.payload.1)
  17. .map { _ in
  18. ConferenceInvitationActions.onInviteSuccess()
  19. }
  20. .catch { error -> Just<Action> in
  21. Just(ErrorActions.throwError(payload: error))
  22. }
  23. }
  24. .eraseToAnyPublisher()
  25. }
  26. let accept = Effect<Environment>.dispatchingOne { actions, environment in
  27. actions.wasCreated(from: ConferenceInvitationActions.accept)
  28. .flatMap { action in
  29. environment.conferenceInvitationService.accept(roomId: action.payload)
  30. .map { roomId in
  31. ConferenceInvitationActions.onAcceptSuccess(payload: roomId)
  32. }
  33. .catch { error -> Just<Action> in
  34. environment.store?.dispatch(action: InvitationViewActions.dismissInvitationView())
  35. environment.store?.dispatch(action: InvitationObserverActions.stopCallingBellAndVibration())
  36. return Just(ErrorActions.throwError(payload: error))
  37. }
  38. }
  39. .eraseToAnyPublisher()
  40. }
  41. let reject = Effect<Environment>.dispatchingOne { actions, environment in
  42. actions.wasCreated(from: ConferenceInvitationActions.reject)
  43. .flatMap { action in
  44. environment.conferenceInvitationService.reject(roomId: action.payload.0, reason: action.payload.1)
  45. .map { _ in
  46. ConferenceInvitationActions.onRejectSuccess()
  47. }
  48. .catch { error -> Just<Action> in
  49. Just(ErrorActions.throwError(payload: error))
  50. }
  51. }
  52. .eraseToAnyPublisher()
  53. }
  54. let getInvitationList = Effect<Environment>.dispatchingOne { actions, environment in
  55. actions.wasCreated(from: ConferenceInvitationActions.getInvitationList)
  56. .flatMap { action in
  57. environment.conferenceInvitationService.getInvitationList(roomId: action.payload.0, cursor: action.payload.1)
  58. .map { invitations, cursor in
  59. var invitationList = action.payload.2
  60. let newList = invitationList + invitations
  61. if cursor.isEmpty {
  62. return ConferenceInvitationActions.onGetInvitationSuccess(payload: (action.payload.0, newList))
  63. } else {
  64. return ConferenceInvitationActions.getInvitationList(payload: (action.payload.0, cursor, newList))
  65. }
  66. }
  67. .catch { error -> Just<Action> in
  68. Just(ErrorActions.throwError(payload: error))
  69. }
  70. }
  71. .eraseToAnyPublisher()
  72. }
  73. let fetchAttendees = Effect<Environment>.dispatchingOne { actions, environment in
  74. actions.wasCreated(from: ConferenceInvitationActions.fetchAttendees)
  75. .flatMap { action in
  76. environment.conferenceListService.fetchAttendeeList(conferenceId: action.payload.0, cursor: action.payload.1)
  77. .map { userInfoList, cursor, totalCount in
  78. var attendeesList = action.payload.2
  79. attendeesList.append(contentsOf: userInfoList)
  80. if cursor.isEmpty {
  81. return ConferenceInvitationActions.onFetchAttendeesSuccess(payload: attendeesList)
  82. } else {
  83. return ConferenceInvitationActions.fetchAttendees(payload:(action.payload.0, cursor, attendeesList))
  84. }
  85. }
  86. .catch { error -> Just<Action> in
  87. Just(ErrorActions.throwError(payload: error))
  88. }
  89. }
  90. .eraseToAnyPublisher()
  91. }
  92. let onAcceptSuccess = Effect<Environment>.nonDispatching { actions, environment in
  93. actions
  94. .wasCreated(from: ConferenceInvitationActions.onAcceptSuccess)
  95. .sink { action in
  96. let roomId = action.payload
  97. InvitationObserverService.shared.dismissInvitationWindow()
  98. let joinParams = JoinConferenceParams(roomId: roomId)
  99. joinParams.isOpenMicrophone = true
  100. joinParams.isOpenCamera = false
  101. joinParams.isOpenSpeaker = true
  102. let vc = ConferenceMainViewController()
  103. vc.setJoinConferenceParams(params: joinParams)
  104. DispatchQueue.main.async {
  105. RoomRouter.shared.push(viewController: vc)
  106. }
  107. environment.store?.dispatch(action: InvitationViewActions.dismissInvitationView())
  108. environment.store?.dispatch(action: InvitationObserverActions.stopCallingBellAndVibration())
  109. }
  110. }
  111. let onReceiveInvitation = Effect<Environment>.nonDispatching { actions, environment in
  112. actions
  113. .wasCreated(from: ConferenceInvitationActions.onReceiveInvitation)
  114. .sink { action in
  115. let roomInfo = action.payload.0
  116. let invitation = action.payload.1
  117. let isEnteredRoom = environment.store?.selectCurrent(RoomSelectors.getIsEnteredRoom)
  118. let isNotBeingInviting = environment.store?.selectCurrent(ViewSelectors.getDismissInvitationFlag)
  119. if isEnteredRoom == true {
  120. environment.store?.dispatch(action: ConferenceInvitationActions.reject(payload: (roomInfo.roomId, .inOtherConference)))
  121. } else if isNotBeingInviting == false {
  122. environment.store?.dispatch(action: ConferenceInvitationActions.reject(payload: (roomInfo.roomId, .rejectToEnter)))
  123. } else {
  124. InvitationObserverService.shared.showInvitationWindow(roomInfo: RoomInfo(with: roomInfo), invitation: invitation)
  125. environment.store?.dispatch(action: InvitationObserverActions.playCallingBellAndVibration())
  126. }
  127. }
  128. }
  129. let onGetInvitationSuccess = Effect<Environment>.nonDispatching { actions, environment in
  130. actions
  131. .wasCreated(from: ConferenceInvitationActions.onGetInvitationSuccess)
  132. .sink { action in
  133. let roomId = action.payload.0
  134. let invitations = action.payload.1
  135. environment.store?.dispatch(action: ConferenceInvitationActions.updateInvitationList(payload: invitations))
  136. environment.store?.dispatch(action: ConferenceInvitationActions.fetchAttendees(payload: (roomId, "", [])))
  137. }
  138. }
  139. let onFetchAttendeesSuccess = Effect<Environment>.nonDispatching { actions, environment in
  140. actions
  141. .wasCreated(from: ConferenceInvitationActions.onFetchAttendeesSuccess)
  142. .sink { action in
  143. let attendeeList = action.payload
  144. var filteredList: [UserInfo] = []
  145. if let allUsers = environment.store?.selectCurrent(UserSelectors.getAllUsers) {
  146. filteredList = attendeeList.filter { user in
  147. !allUsers.contains { existedUser in
  148. user.userId == existedUser.userId
  149. }
  150. }
  151. }
  152. let resultList = filteredList.map{ TUIInvitation(userInfo: $0) }
  153. environment.store?.dispatch(action: ConferenceInvitationActions.updateInvitationList(payload: resultList))
  154. }
  155. }
  156. }