Files
suixinkan_uikit/suixinkan/Features/Home/Services/HomeRouteHandler.swift
T
lujiuyinandCursor 005349f8e6 模块化 AppStore 并完善素材管理与个人空间设置。
将会话、权限、位置、收款与排队存储拆分为独立模块,同步更新各 ViewModel 与单元测试,并补充素材管理 UI 与个人空间设置交互。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-13 11:01:08 +08:00

146 lines
6.5 KiB
Swift

//
// HomeRouteHandler.swift
// suixinkan
//
import UIKit
/// 首页菜单路由,将 permission URI 映射到已有页面或提示。
enum HomeRouteHandler {
/// 处理菜单点击。
@MainActor
static func open(
uri: String,
from viewController: UIViewController,
storeItem: StoreItem?,
onCommonMenusChanged: (() -> Void)? = nil
) {
if uri == "pilot_controller" {
showDeveloping(from: viewController)
return
}
if uri != "pilot_controller", uri != "wallet", AppStore.shared.session.currentScenicId <= 0 {
showToast("请先选择景区", from: viewController)
return
}
switch uri {
case "more_functions":
let controller = AllFunctionsViewController()
controller.onDidCustomize = onCommonMenusChanged
viewController.navigationController?.pushViewController(controller, animated: true)
case "verification_order":
selectTab(.orders, from: viewController)
case "photographer_stats":
selectTab(.statistics, from: viewController)
case "system_settings":
viewController.navigationController?.pushViewController(SettingViewController(), animated: true)
case "message_center":
viewController.navigationController?.pushViewController(MessageCenterViewController(), animated: true)
case "space_settings":
viewController.navigationController?.pushViewController(ProfileSpaceSettingsViewController(), animated: true)
case "cloud_management":
viewController.navigationController?.pushViewController(CloudDriveListViewController(), animated: true)
case "pilot_cert":
let controller = RealNameAuthViewController()
viewController.navigationController?.pushViewController(controller, animated: true)
case "operating-area":
handleOperatingArea(from: viewController, storeItem: storeItem)
case "cooperation_order":
if !hasCooperationOrderPermission() {
showToast("暂无合作订单权限", from: viewController)
return
}
viewController.navigationController?.pushViewController(CooperationOrderListViewController(), animated: true)
case "location_report":
viewController.navigationController?.pushViewController(LocationReportViewController(), animated: true)
case "report_photographer":
viewController.navigationController?.pushViewController(WildPhotographerReportHomeViewController(), animated: true)
case "registration_invitation", "photographer_invite":
viewController.navigationController?.pushViewController(PhotographerInviteViewController(), animated: true)
case "invite_record":
viewController.navigationController?.pushViewController(InviteRecordViewController(), animated: true)
case "/scenic-queue":
viewController.navigationController?.pushViewController(ScenicQueueViewController(), animated: true)
case "task_management", "task_management_editor":
viewController.navigationController?.pushViewController(TaskAddViewController(), animated: true)
case "travel_album":
viewController.navigationController?.pushViewController(TravelAlbumEntryViewController(), animated: true)
case "sample_management":
viewController.navigationController?.pushViewController(SampleListViewController(), animated: true)
case "asset_management":
viewController.navigationController?.pushViewController(MaterialListViewController(), animated: true)
case "checkin_points":
viewController.navigationController?.pushViewController(PunchPointListViewController(), animated: true)
case "live_stream_management":
viewController.navigationController?.pushViewController(LiveManageViewController(), animated: true)
case "live_album":
viewController.navigationController?.pushViewController(LiveAlbumListViewController(), animated: true)
case "wallet":
viewController.navigationController?.pushViewController(WalletViewController(), animated: true)
default:
showDeveloping(from: viewController)
}
}
@MainActor
private static func handleOperatingArea(from viewController: UIViewController, storeItem: StoreItem?) {
guard let role = AppStore.shared.session.currentAppRole else {
showToast("当前账号暂不支持运营区域", from: viewController)
return
}
switch role {
case .storeAdmin:
guard let storeItem, storeItem.id > 0 else {
showToast("请先选择店铺", from: viewController)
return
}
showDeveloping(from: viewController)
case .scenicAdmin:
guard AppStore.shared.session.currentScenicId > 0 else {
showToast("请先选择景区", from: viewController)
return
}
showDeveloping(from: viewController)
default:
showToast("当前账号暂不支持运营区域", from: viewController)
}
}
private static func hasCooperationOrderPermission() -> Bool {
let permissions = AppStore.shared.permissions.permissionItems()
return permissions.contains { $0.uri == "cooperation_order" }
|| permissions.contains(where: { containsCooperationOrder(in: $0) })
}
private static func containsCooperationOrder(in item: HomePermissionItem) -> Bool {
item.uri == "cooperation_order"
}
@MainActor
private static func selectTab(_ tab: AppTab, from viewController: UIViewController) {
guard let tabBar = viewController.tabBarController as? MainTabBarController else { return }
tabBar.selectTab(tab)
}
@MainActor
private static func showDeveloping(from viewController: UIViewController) {
showToast("功能开发中", from: viewController)
}
@MainActor
private static func showToast(_ message: String, from viewController: UIViewController) {
if let base = viewController as? BaseViewController {
base.showToast(message)
return
}
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
viewController.present(alert, animated: true)
DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
alert.dismiss(animated: true)
}
}
}