import Foundation import ComposableArchitecture @Reducer struct HomeFeature { @ObservableState struct State: Equatable { var isInitialized = false var userInfo: UserInfo? var accountModel: AccountModel? var error: String? // 设置页面相关状态 var isSettingPresented = false var settingState = SettingFeature.State() } enum Action: Equatable { case onAppear case loadUserInfo case userInfoLoaded(UserInfo?) case loadAccountModel case accountModelLoaded(AccountModel?) case logoutTapped case logout // 设置页面相关actions case settingDismissed case setting(SettingFeature.Action) } var body: some ReducerOf { Scope(state: \.settingState, action: \.setting) { SettingFeature() } Reduce { state, action in switch action { case .onAppear: state.isInitialized = true return .concatenate( .send(.loadUserInfo), .send(.loadAccountModel) ) case .loadUserInfo: // 从本地存储加载用户信息 let userInfo = UserInfoManager.getUserInfo() return .send(.userInfoLoaded(userInfo)) case let .userInfoLoaded(userInfo): state.userInfo = userInfo return .none case .loadAccountModel: // 从本地存储加载账户信息 let accountModel = UserInfoManager.getAccountModel() return .send(.accountModelLoaded(accountModel)) case let .accountModelLoaded(accountModel): state.accountModel = accountModel return .none case .logoutTapped: return .send(.logout) case .logout: // 清除所有认证数据 UserInfoManager.clearAllAuthenticationData() // 发送通知返回登录页面 NotificationCenter.default.post(name: .homeLogout, object: nil) return .none case .settingDismissed: state.isSettingPresented = false return .none case .setting: // 由子reducer处理 return .none } } } } // MARK: - Notification Extension extension Notification.Name { static let homeLogout = Notification.Name("homeLogout") }