ConferenceRouteDefine.swift 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. //
  2. // ConferenceRouteDefine.swift
  3. // TUIRoomKit
  4. //
  5. // Created by aby on 2024/6/21.
  6. //
  7. import Foundation
  8. import RTCRoomEngine
  9. import Factory
  10. enum ConferenceRoute {
  11. case none
  12. case schedule
  13. case main(conferenceParams: ConferenceParamType)
  14. case selectMember(memberSelectParams: MemberSelectParams?)
  15. case selectedMember(showDeleteButton: Bool, selectedMembers: [UserInfo])
  16. case timeZone
  17. case scheduleDetails(conferenceInfo: ConferenceInfo)
  18. case modifySchedule(conferenceInfo: ConferenceInfo)
  19. case popup(view: UIView)
  20. case alert(state: AlertState)
  21. case invitation(roomInfo: RoomInfo, invitation: TUIInvitation)
  22. func hideNavigationBar() -> Bool {
  23. switch self {
  24. case .main, .selectMember, .timeZone, .invitation:
  25. return true
  26. default:
  27. return false
  28. }
  29. }
  30. init(viewController: UIViewController) {
  31. switch viewController {
  32. case is ConferenceMainViewController:
  33. let vc = viewController as? ConferenceMainViewController
  34. if let startParams = vc?.startConferenceParams {
  35. self = .main(conferenceParams: ConferenceParamType(startParams: startParams))
  36. } else if let joinParams = vc?.joinConferenceParams {
  37. self = .main(conferenceParams: ConferenceParamType(joinParams: joinParams))
  38. } else {
  39. self = .none
  40. }
  41. case is ScheduleConferenceViewController:
  42. self = .schedule
  43. case _ as ContactViewProtocol:
  44. self = .selectMember(memberSelectParams: nil)
  45. case is SelectedMembersViewController:
  46. let vc = viewController as? SelectedMembersViewController
  47. let showDeleteButton = vc?.showDeleteButton ?? true
  48. let selectedMember = vc?.selectedMember ?? []
  49. self = .selectedMember(showDeleteButton: showDeleteButton, selectedMembers: selectedMember)
  50. case is TimeZoneViewController:
  51. self = .timeZone
  52. case is ScheduleDetailsViewController:
  53. let vc = viewController as? ScheduleDetailsViewController
  54. self = .scheduleDetails(conferenceInfo: vc?.conferenceInfo ?? ConferenceInfo())
  55. case is ModifyScheduleViewController:
  56. let vc = viewController as? ModifyScheduleViewController
  57. self = .modifySchedule(conferenceInfo: vc?.conferenceInfo ?? ConferenceInfo())
  58. case is ConferenceInvitationViewController:
  59. let vc = viewController as? ConferenceInvitationViewController
  60. self = .invitation(roomInfo: vc?.roomInfo ?? RoomInfo(), invitation: vc?.invitation ?? TUIInvitation())
  61. case is PopupViewController:
  62. let vc = viewController as? PopupViewController
  63. self = .popup(view: vc?.contentView ?? viewController.view)
  64. case is UIAlertController:
  65. let vc = viewController as? UIAlertController
  66. let alertState = AlertState(title: vc?.title, message: vc?.message, sureAction: vc?.actions.first, declineAction: vc?.actions.last)
  67. self = .alert(state: alertState)
  68. default:
  69. self = .none
  70. }
  71. }
  72. }
  73. extension ConferenceRoute {
  74. var viewController: UIViewController {
  75. switch self {
  76. case .main(let params):
  77. let vc = ConferenceMainViewController()
  78. if case .startConferecneParams(let startConferenceParams) = params {
  79. vc.setStartConferenceParams(params: startConferenceParams)
  80. } else if case .joinConferenceParams(let joinConferenceParams) = params {
  81. vc.setJoinConferenceParams(params: joinConferenceParams)
  82. }
  83. return vc
  84. case .schedule:
  85. return ScheduleConferenceViewController()
  86. case .selectMember(memberSelectParams: let memberSelectParams):
  87. guard let params = memberSelectParams else {
  88. return UIViewController()
  89. }
  90. let participants = params.participants
  91. guard let vc = getSelectMemberViewController(participants: participants) else {
  92. return UIViewController()
  93. }
  94. vc.delegate = params.delegate
  95. return vc
  96. case .selectedMember(showDeleteButton: let isShow, let selectedMembers):
  97. return SelectedMembersViewController(showDeleteButton: isShow, selectedMembers: selectedMembers)
  98. case .timeZone:
  99. return TimeZoneViewController()
  100. case .scheduleDetails(conferenceInfo: let info):
  101. return ScheduleDetailsViewController(conferenceInfo: info)
  102. case .modifySchedule(conferenceInfo: let info):
  103. return ModifyScheduleViewController(conferenceInfo: info)
  104. case .invitation(roomInfo: let info, invitation: let invitation):
  105. return ConferenceInvitationViewController(roomInfo: info, invitation: invitation)
  106. case .popup(view: let view):
  107. return PopupViewController(contentView: view)
  108. case .alert(state: let alertState):
  109. let alertVC = UIAlertController(title: alertState.title,
  110. message: alertState.message,
  111. preferredStyle: .alert)
  112. if let sureAction = alertState.sureAction {
  113. alertVC.addAction(sureAction)
  114. }
  115. if let declineAction = alertState.declineAction {
  116. alertVC.addAction(declineAction)
  117. }
  118. return alertVC
  119. default:
  120. return UIViewController()
  121. }
  122. }
  123. func getSelectMemberViewController(participants: ConferenceParticipants) -> (ContactViewProtocol & UIViewController)? {
  124. if ConferenceSession.sharedInstance.implementation.hasCustomContacts {
  125. return Container.shared.contactViewController.resolve(participants) as? (ContactViewProtocol & UIViewController)
  126. } else {
  127. return SelectMemberViewController(participants: participants)
  128. }
  129. }
  130. }
  131. extension ConferenceRoute: Equatable {
  132. static func ==(lhs: ConferenceRoute, rhs: ConferenceRoute) -> Bool {
  133. switch (lhs, rhs) {
  134. case (.none, .none),
  135. (.schedule, .schedule),
  136. (.main, .main),
  137. (.selectMember, .selectMember),
  138. (.selectedMember, .selectedMember),
  139. (.timeZone, .timeZone),
  140. (.scheduleDetails, .scheduleDetails),
  141. (.modifySchedule, .modifySchedule),
  142. (.invitation, .invitation):
  143. return true
  144. case let (.popup(l), .popup(r)):
  145. return l == r
  146. case let (.alert(l), .alert(r)):
  147. return l == r
  148. case (.none, _),
  149. (.schedule, _),
  150. (.main, _),
  151. (.selectMember, _),
  152. (.selectedMember, _),
  153. (.timeZone, _),
  154. (.scheduleDetails, _),
  155. (.modifySchedule, _),
  156. (.alert, _),
  157. (.popup, _),
  158. (.invitation, _):
  159. return false
  160. }
  161. }
  162. }
  163. struct AlertState: Equatable {
  164. var title: String?
  165. var message: String?
  166. var sureAction: UIAlertAction?
  167. var declineAction: UIAlertAction?
  168. }
  169. enum ConferenceParamType {
  170. case startConferecneParams(StartConferenceParams)
  171. case joinConferenceParams(JoinConferenceParams)
  172. init(startParams: StartConferenceParams) {
  173. self = .startConferecneParams(startParams)
  174. }
  175. init(joinParams: JoinConferenceParams) {
  176. self = .joinConferenceParams(joinParams)
  177. }
  178. }
  179. #if DEBUG
  180. class PrintRouteInterceptor: Interceptor {
  181. typealias State = ConferenceRouteState
  182. func actionDispatched(action: any Action, oldState: State, newState: State) {
  183. let name = String(describing: type(of: self))
  184. let actionName = String(describing: type(of: action))
  185. print("route action is: \(newState.currentRouteAction)")
  186. switch newState.currentRouteAction {
  187. case .presented(route: let route):
  188. print("route is: \(oldState.currentRoute) to \(route)")
  189. default:
  190. break
  191. }
  192. }
  193. }
  194. #endif