Files
featherVoice/TUIKit/TUIRoomKit/Source/Common/Route/ConferenceRouteDefine.swift
2025-08-08 10:49:36 +08:00

211 lines
8.6 KiB
Swift

//
// ConferenceRouteDefine.swift
// TUIRoomKit
//
// Created by aby on 2024/6/21.
//
import Foundation
import RTCRoomEngine
import Factory
enum ConferenceRoute {
case none
case schedule(memberSelectFactory: MemberSelectionFactory?)
case main(conferenceParams: ConferenceParamType)
case selectMember(memberSelectParams: MemberSelectParams?)
case selectedMember(showDeleteButton: Bool, selectedMembers: [UserInfo])
case timeZone
case scheduleDetails(conferenceInfo: ConferenceInfo)
case modifySchedule(conferenceInfo: ConferenceInfo)
case popup(view: UIView)
case alert(state: AlertState)
case invitation(roomInfo: TUIRoomInfo, invitation: TUIInvitation)
func hideNavigationBar() -> Bool {
switch self {
case .main, .selectMember, .timeZone, .invitation:
return true
default:
return false
}
}
init(viewController: UIViewController) {
switch viewController {
case is ConferenceMainViewController:
let vc = viewController as? ConferenceMainViewController
if let startParams = vc?.startConferenceParams {
self = .main(conferenceParams: ConferenceParamType(startParams: startParams))
} else if let joinParams = vc?.joinConferenceParams {
self = .main(conferenceParams: ConferenceParamType(joinParams: joinParams))
} else {
self = .none
}
case is ScheduleConferenceViewController:
guard let vc = viewController as? ScheduleConferenceViewController else {
self = .none
break
}
self = .schedule(memberSelectFactory: vc.memberSelectionFactory)
case _ as ContactViewProtocol:
self = .selectMember(memberSelectParams: nil)
case is SelectedMembersViewController:
let vc = viewController as? SelectedMembersViewController
let showDeleteButton = vc?.showDeleteButton ?? true
let selectedMember = vc?.selectedMember ?? []
self = .selectedMember(showDeleteButton: showDeleteButton, selectedMembers: selectedMember)
case is TimeZoneViewController:
self = .timeZone
case is ScheduleDetailsViewController:
let vc = viewController as? ScheduleDetailsViewController
self = .scheduleDetails(conferenceInfo: vc?.conferenceInfo ?? ConferenceInfo())
case is ModifyScheduleViewController:
let vc = viewController as? ModifyScheduleViewController
self = .modifySchedule(conferenceInfo: vc?.conferenceInfo ?? ConferenceInfo())
case is ConferenceInvitationViewController:
let vc = viewController as? ConferenceInvitationViewController
self = .invitation(roomInfo: vc?.roomInfo ?? TUIRoomInfo(), invitation: vc?.invitation ?? TUIInvitation())
case is PopupViewController:
let vc = viewController as? PopupViewController
self = .popup(view: vc?.contentView ?? viewController.view)
case is UIAlertController:
let vc = viewController as? UIAlertController
let alertState = AlertState(title: vc?.title, message: vc?.message, sureAction: vc?.actions.first, declineAction: vc?.actions.last)
self = .alert(state: alertState)
default:
self = .none
}
}
}
extension ConferenceRoute {
var viewController: UIViewController {
switch self {
case .main(let params):
let vc = ConferenceMainViewController()
if case .startConferecneParams(let startConferenceParams) = params {
vc.setStartConferenceParams(params: startConferenceParams)
} else if case .joinConferenceParams(let joinConferenceParams) = params {
vc.setJoinConferenceParams(params: joinConferenceParams)
}
return vc
case .schedule(memberSelectFactory: let factory):
return ScheduleConferenceViewController(memberSelectFactory: factory)
case .selectMember(memberSelectParams: let memberSelectParams):
guard let params = memberSelectParams else {
return UIViewController()
}
let participants = params.participants
guard let vc = getSelectMemberViewController(participants: participants) else {
return UIViewController()
}
vc.delegate = params.delegate
return vc
case .selectedMember(showDeleteButton: let isShow, let selectedMembers):
return SelectedMembersViewController(showDeleteButton: isShow, selectedMembers: selectedMembers)
case .timeZone:
return TimeZoneViewController()
case .scheduleDetails(conferenceInfo: let info):
return ScheduleDetailsViewController(conferenceInfo: info)
case .modifySchedule(conferenceInfo: let info):
return ModifyScheduleViewController(conferenceInfo: info)
case .invitation(roomInfo: let info, invitation: let invitation):
return ConferenceInvitationViewController(roomInfo: info, invitation: invitation)
case .popup(view: let view):
return PopupViewController(contentView: view)
case .alert(state: let alertState):
let alertVC = UIAlertController(title: alertState.title,
message: alertState.message,
preferredStyle: .alert)
if let sureAction = alertState.sureAction {
alertVC.addAction(sureAction)
}
if let declineAction = alertState.declineAction {
alertVC.addAction(declineAction)
}
return alertVC
default:
return UIViewController()
}
}
func getSelectMemberViewController(participants: ConferenceParticipants) -> (ContactViewProtocol & UIViewController)? {
guard let vc = Container.shared.contactViewController(participants) as? (ContactViewProtocol & UIViewController) else {
return nil
}
return vc
}
}
extension ConferenceRoute: Equatable {
static func ==(lhs: ConferenceRoute, rhs: ConferenceRoute) -> Bool {
switch (lhs, rhs) {
case (.none, .none),
(.schedule, .schedule),
(.main, .main),
(.selectMember, .selectMember),
(.selectedMember, .selectedMember),
(.timeZone, .timeZone),
(.scheduleDetails, .scheduleDetails),
(.modifySchedule, .modifySchedule),
(.invitation, .invitation):
return true
case let (.popup(l), .popup(r)):
return l == r
case let (.alert(l), .alert(r)):
return l == r
case (.none, _),
(.schedule, _),
(.main, _),
(.selectMember, _),
(.selectedMember, _),
(.timeZone, _),
(.scheduleDetails, _),
(.modifySchedule, _),
(.alert, _),
(.popup, _),
(.invitation, _):
return false
}
}
}
struct AlertState: Equatable {
var title: String?
var message: String?
var sureAction: UIAlertAction?
var declineAction: UIAlertAction?
}
enum ConferenceParamType {
case startConferecneParams(StartConferenceParams)
case joinConferenceParams(JoinConferenceParams)
init(startParams: StartConferenceParams) {
self = .startConferecneParams(startParams)
}
init(joinParams: JoinConferenceParams) {
self = .joinConferenceParams(joinParams)
}
}
#if DEBUG
class PrintRouteInterceptor: Interceptor {
typealias State = ConferenceRouteState
func actionDispatched(action: any Action, oldState: State, newState: State) {
let name = String(describing: type(of: self))
let actionName = String(describing: type(of: action))
print("route action is: \(newState.currentRouteAction)")
switch newState.currentRouteAction {
case .presented(route: let route):
print("route is: \(oldState.currentRoute) to \(route)")
default:
break
}
}
}
#endif