
- 新增设置功能模块,包含用户信息管理和设置选项。 - 实现动态视图,展示用户动态内容。 - 更新HomeView以支持设置页面的展示和动态视图的切换。 - 添加底部导航栏,增强用户体验。 - 更新相关视图和组件,确保一致的UI风格和交互体验。
90 lines
2.7 KiB
Swift
90 lines
2.7 KiB
Swift
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<Self> {
|
|
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")
|
|
} |