
- 在APIEndpoints.swift中新增getUserInfo端点以支持获取用户信息。 - 在APIModels.swift中实现获取用户信息请求和响应模型,处理用户信息的请求与解析。 - 在UserInfoManager中新增方法以从服务器获取用户信息,并在登录成功后自动获取用户信息。 - 在SettingFeature中新增用户信息刷新状态管理,支持用户信息的刷新操作。 - 在SettingView中集成用户信息刷新按钮,提升用户体验。 - 在SplashFeature中实现自动获取用户信息的逻辑,优化用户登录流程。 - 在yanaAPITests中添加用户信息相关的单元测试,确保功能的正确性。
103 lines
3.5 KiB
Swift
103 lines
3.5 KiB
Swift
import Foundation
|
||
import ComposableArchitecture
|
||
|
||
@Reducer
|
||
struct SettingFeature {
|
||
@ObservableState
|
||
struct State: Equatable {
|
||
var userInfo: UserInfo?
|
||
var accountModel: AccountModel?
|
||
var isLoading = false
|
||
var error: String?
|
||
var isRefreshingUserInfo = false // 新增:用户信息刷新状态
|
||
}
|
||
|
||
enum Action: Equatable {
|
||
case onAppear
|
||
case loadUserInfo
|
||
case userInfoLoaded(UserInfo?)
|
||
case loadAccountModel
|
||
case accountModelLoaded(AccountModel?)
|
||
case refreshUserInfo // 新增:刷新用户信息
|
||
case refreshUserInfoResponse(TaskResult<UserInfo?>) // 新增:刷新用户信息响应
|
||
case logoutTapped
|
||
case logout
|
||
case dismissTapped
|
||
}
|
||
|
||
@Dependency(\.apiService) var apiService // 新增:API服务依赖
|
||
|
||
var body: some ReducerOf<Self> {
|
||
Reduce { state, action in
|
||
switch action {
|
||
case .onAppear:
|
||
return .concatenate(
|
||
.send(.loadUserInfo),
|
||
.send(.loadAccountModel)
|
||
)
|
||
|
||
case .loadUserInfo:
|
||
return .run { send in
|
||
let userInfo = await UserInfoManager.getUserInfo()
|
||
await send(.userInfoLoaded(userInfo))
|
||
}
|
||
|
||
case let .userInfoLoaded(userInfo):
|
||
state.userInfo = userInfo
|
||
return .none
|
||
|
||
case .loadAccountModel:
|
||
return .run { send in
|
||
let accountModel = await UserInfoManager.getAccountModel()
|
||
await send(.accountModelLoaded(accountModel))
|
||
}
|
||
|
||
case let .accountModelLoaded(accountModel):
|
||
state.accountModel = accountModel
|
||
return .none
|
||
|
||
case .refreshUserInfo: // 新增:刷新用户信息
|
||
return .none
|
||
// state.isRefreshingUserInfo = true
|
||
// state.error = nil
|
||
// return .run { send in
|
||
// let userInfo = await UserInfoManager.refreshCurrentUserInfo(apiService: apiService)
|
||
// await send(.refreshUserInfoResponse(.success(userInfo)))
|
||
// }
|
||
|
||
case let .refreshUserInfoResponse(.success(userInfo)): // 新增:处理刷新响应
|
||
state.isRefreshingUserInfo = false
|
||
if let userInfo = userInfo {
|
||
state.userInfo = userInfo
|
||
state.error = nil
|
||
} else {
|
||
state.error = "刷新用户信息失败"
|
||
}
|
||
return .none
|
||
|
||
case let .refreshUserInfoResponse(.failure(error)): // 新增:处理刷新错误
|
||
state.isRefreshingUserInfo = false
|
||
state.error = error.localizedDescription
|
||
return .none
|
||
|
||
case .logoutTapped:
|
||
return .send(.logout)
|
||
|
||
case .logout:
|
||
state.isLoading = true
|
||
return .run { _ in
|
||
await UserInfoManager.clearAllAuthenticationData()
|
||
}
|
||
|
||
case .dismissTapped:
|
||
return .none
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 移除:未使用的通知名称定义
|
||
// extension Notification.Name {
|
||
// static let settingsDismiss = Notification.Name("settingsDismiss")
|
||
// }
|