Visual_Novel_iOS/crush/Crush/Src/Utils/Router/AppRouter.swift

165 lines
5.8 KiB
Swift

//
// AppRouter.swift
// Crush
//
// Created by Leon on 2025/7/12.
//
import Foundation
@objcMembers class AppRouter: NSObject {
static let shared = AppRouter()
var isBlockBackRootVc: Bool = false
static func goBackRootController(jumpIndex: TabBarItemIndex = .home, block: (() -> Void)? = nil) {
guard let window = UIWindow.applicationKey else {
assert(false)
block?()
return
}
guard let rootVC = window.rootViewController else {
assert(false)
block?()
return
}
//
// if AppRouter.shared.isBlockBackRootVc {
// block?()
// return
// }
AppRouter.shared.isBlockBackRootVc = true
var presentedController: UIViewController?
if rootVC is UITabBarController {
if let vc = (rootVC as? TabBarController)?.selectedViewController {
presentedController = vc
}
}
var presentedControllers = [UIViewController]()
while presentedController?.presentedViewController != nil {
if let vc = rootVC.presentedViewController {
presentedControllers.append(vc)
presentedController = vc
}
}
if presentedControllers.count > 0 {
dismissControllers(presentedControllers: presentedControllers, index: presentedControllers.count - 1) {
popToRootController(from: rootVC) {
guard let vc = rootVC as? TabBarController else {
AppRouter.shared.isBlockBackRootVc = false
return
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
vc.setSelected(index: jumpIndex)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
block?()
AppRouter.shared.isBlockBackRootVc = false
}
}
}
}
} else {
popToRootController(from: presentedController ?? rootVC, animated: false) {
guard let vc = rootVC as? TabBarController else {
AppRouter.shared.isBlockBackRootVc = false
return
}
// DispatchQueue.main.asyncAfter(deadline: .now() + 0) { // 0.25
vc.setSelected(index: jumpIndex)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
block?()
AppRouter.shared.isBlockBackRootVc = false
}
// }
}
}
}
static func dismissControllers(presentedControllers: [UIViewController], index: Int, completion: @escaping (() -> Void)) {
if index < 0 {
completion()
} else {
guard let vc = presentedControllers[safe: index] else { return }
vc.dismiss(animated: false) {
dismissControllers(presentedControllers: presentedControllers, index: index - 1, completion: completion)
}
}
}
static func popToRootController(from vc: UIViewController, animated: Bool? = true, completion: @escaping (() -> Void)) {
if vc is UINavigationController {
if let navc = vc as? UINavigationController {
navc.popToRootViewController(animated: animated ?? true)
completion()
}
}
if let navc = vc.navigationController {
navc.popToRootViewController(animated: animated ?? true)
completion()
}
}
}
extension AppRouter{
static func goCreateEditAIRole(aiId: Int? = nil, aiEditInfo: AIUserModel? = nil) {
if AppDictManager.shared.aiDict == nil{
Hud.showIndicator()
AppDictManager.shared.loadAIDict { ok in
Hud.hideIndicator()
if ok{
AppRouter.goCreateEditAIRole(aiId: aiId)
}
}
return
}
if let id = aiId, id > 0{ //
if aiEditInfo == nil{ //
Hud.showIndicator()
AIRoleProvider.request(.aiInfoMineGet(id: id), modelType: AIUserModel.self) { result in
Hud.hideIndicator()
switch result {
case .success(let success):
if let editInfo = success{
AppRouter.goCreateEditAIRole(aiId: id, aiEditInfo: editInfo)
}
case .failure:
break
}
}
return
}
}
let vc = RoleClassificationSelectController()
vc.viewModel.editAIInfo = aiEditInfo
let navc = CLNavigationController(rootViewController: vc)
UIWindow.getTopViewController()?.present(navc, animated: true)
}
static func goAIRoleHome(aiId: Int?){
guard let id = aiId else {return}
let vc = RoleHomePagerController()
vc.aiId = id
UIWindow.getTopNavigationController()?.pushViewController(vc, animated: true)
}
// , alert
static func alertCreateAlbumsToRoleHome(aiId: Int?){
let alert = Alert(title: "Create Album", text: "Go to your personal homepage to create albums for your characters, attract interlocutors and increase revenue.")
let action1 = AlertAction(title: "Go", actionStyle: .confirm) {
AppRouter.goAIRoleHome(aiId: aiId)
}
let action2 = AlertAction(title: "Not now", actionStyle: .cancel)
alert.addAction(action1)
alert.addAction(action2)
alert.show()
}
}