// // AppFeatureServices.swift // suixinkan // // Created by Codex on 2026/6/29. // import Foundation @MainActor /// 订单模块依赖门面,集中提供订单页面常用 API、上下文和导航反馈能力。 struct OrdersFeatureServices { private let services: AppServices /// 初始化订单模块依赖门面。 init(services: AppServices) { self.services = services } var api: OrdersAPI { services.ordersAPI } var currentScenicId: Int? { services.currentScenicId } var currentStoreId: Int? { services.accountContext.currentStore?.id } var currentRoleId: Int? { services.permissionContext.currentRole?.id } var navigator: AppNavigator { services.appNavigator } var toastCenter: ToastCenter { services.toastCenter } var globalLoading: GlobalLoadingCenter { services.globalLoading } } @MainActor /// 个人中心与认证模块依赖门面,集中提供账号资料、登录协调和退出登录能力。 struct ProfileFeatureServices { private let services: AppServices /// 初始化个人中心模块依赖门面。 init(services: AppServices) { self.services = services } var authAPI: AuthAPI { services.authAPI } var profileAPI: ProfileAPI { services.profileAPI } var accountContextAPI: AccountContextAPI { services.accountContextAPI } var uploader: OSSUploadService { services.ossUploadService } var appSession: AppSession { services.appSession } var accountContext: AccountContext { services.accountContext } var permissionContext: PermissionContext { services.permissionContext } var scenicSpotContext: ScenicSpotContext { services.scenicSpotContext } var authSessionCoordinator: AuthSessionCoordinator { services.authSessionCoordinator } var currentScenicId: Int? { services.currentScenicId } var navigator: AppNavigator { services.appNavigator } var toastCenter: ToastCenter { services.toastCenter } var globalLoading: GlobalLoadingCenter { services.globalLoading } /// 执行完整退出登录,并停止跨登录态的排队运行时。 func logout() { authSessionCoordinator.logout( appSession: appSession, accountContext: accountContext, permissionContext: permissionContext, scenicSpotContext: scenicSpotContext, appNavigator: navigator, toastCenter: toastCenter ) services.scenicQueueRuntime.stop() } } @MainActor /// 首页模块依赖门面,集中提供首页菜单、账号权限上下文和首页导航能力。 struct HomeFeatureServices { private let services: AppServices /// 初始化首页模块依赖门面。 init(services: AppServices) { self.services = services } var accountContext: AccountContext { services.accountContext } var permissionContext: PermissionContext { services.permissionContext } var commonMenuStore: HomeCommonMenuStore { HomeCommonMenuStore() } var navigator: AppNavigator { services.appNavigator } var toastCenter: ToastCenter { services.toastCenter } } @MainActor /// 资产模块依赖门面,集中提供素材云盘 API、上传服务、景区上下文和传输状态仓库。 struct AssetsFeatureServices { private let services: AppServices /// 初始化资产模块依赖门面。 init(services: AppServices) { self.services = services } var api: AssetsAPI { services.assetsAPI } var uploader: OSSUploadService { services.ossUploadService } var currentScenicId: Int? { services.currentScenicId } var transferStore: CloudTransferStore { CloudTransferStore.shared } var toastCenter: ToastCenter { services.toastCenter } var globalLoading: GlobalLoadingCenter { services.globalLoading } } @MainActor /// 排队模块依赖门面,集中提供排队 API、账号景区上下文、景点上下文和排队运行时。 struct QueueFeatureServices { private let services: AppServices /// 初始化排队模块依赖门面。 init(services: AppServices) { self.services = services } var api: ScenicQueueAPI { services.scenicQueueAPI } var currentScenicId: Int? { services.currentScenicId } var userId: String? { services.userId } var scenicSpotContext: ScenicSpotContext { services.scenicSpotContext } var runtime: ScenicQueueRuntime { ScenicQueueRuntime.shared } var toastCenter: ToastCenter { services.toastCenter } var globalLoading: GlobalLoadingCenter { services.globalLoading } /// 使用当前账号和景区上下文刷新 App 级排队运行时。 func updateRuntime(scenePhase: AppScenePhase) { runtime.update( api: api, userId: userId, scenicId: currentScenicId, scenePhase: scenePhase ) } } @MainActor /// `AppServices` 的模块依赖门面访问器,供新代码按功能域读取依赖。 extension AppServices { var ordersFeatureServices: OrdersFeatureServices { OrdersFeatureServices(services: self) } var profileFeatureServices: ProfileFeatureServices { ProfileFeatureServices(services: self) } var homeFeatureServices: HomeFeatureServices { HomeFeatureServices(services: self) } var assetsFeatureServices: AssetsFeatureServices { AssetsFeatureServices(services: self) } var queueFeatureServices: QueueFeatureServices { QueueFeatureServices(services: self) } }