Implement permission-driven home tab aligned with Android.
Load role-permission on first visit to drive menus, role-based layout, store card, and location reporting with account-scoped persistence and unit tests. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
108
suixinkan/Features/Home/Services/HomeRouteHandler.swift
Normal file
108
suixinkan/Features/Home/Services/HomeRouteHandler.swift
Normal file
@ -0,0 +1,108 @@
|
||||
//
|
||||
// HomeRouteHandler.swift
|
||||
// suixinkan
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
/// 首页菜单路由,将 permission URI 映射到已有页面或提示。
|
||||
enum HomeRouteHandler {
|
||||
|
||||
/// 处理菜单点击。
|
||||
@MainActor
|
||||
static func open(
|
||||
uri: String,
|
||||
from viewController: UIViewController,
|
||||
storeItem: StoreItem?
|
||||
) {
|
||||
if uri == "pilot_controller" || uri == "more_functions" {
|
||||
showDeveloping(from: viewController)
|
||||
return
|
||||
}
|
||||
|
||||
if uri != "pilot_controller", AppStore.shared.currentScenicId <= 0 {
|
||||
showToast("请先选择景区", from: viewController)
|
||||
return
|
||||
}
|
||||
|
||||
switch uri {
|
||||
case "verification_order":
|
||||
selectTab(.orders, from: viewController)
|
||||
case "photographer_stats":
|
||||
selectTab(.statistics, from: viewController)
|
||||
case "system_settings", "space_settings":
|
||||
selectTab(.profile, from: viewController)
|
||||
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
|
||||
}
|
||||
showDeveloping(from: viewController)
|
||||
default:
|
||||
showDeveloping(from: viewController)
|
||||
}
|
||||
}
|
||||
|
||||
@MainActor
|
||||
private static func handleOperatingArea(from viewController: UIViewController, storeItem: StoreItem?) {
|
||||
guard let role = AppStore.shared.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.currentScenicId > 0 else {
|
||||
showToast("请先选择景区", from: viewController)
|
||||
return
|
||||
}
|
||||
showDeveloping(from: viewController)
|
||||
default:
|
||||
showToast("当前账号暂不支持运营区域", from: viewController)
|
||||
}
|
||||
}
|
||||
|
||||
private static func hasCooperationOrderPermission() -> Bool {
|
||||
let permissions = AppStore.shared.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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user