
- 重构用户信息加载逻辑,采用Result类型处理成功与失败的响应,提升错误处理能力。 - 更新状态管理,确保用户信息加载状态与错误信息的准确反映。 - 移除冗余代码,简化用户信息获取流程,增强代码可读性。
120 lines
3.8 KiB
Swift
120 lines
3.8 KiB
Swift
import Foundation
|
|
import ComposableArchitecture
|
|
|
|
@Reducer
|
|
struct AppSettingFeature {
|
|
@ObservableState
|
|
struct State: Equatable {
|
|
var nickname: String = ""
|
|
var avatarURL: String? = nil
|
|
var userInfo: UserInfo? = nil
|
|
var isLoadingUserInfo: Bool = false
|
|
var userInfoError: String? = nil
|
|
|
|
// WebView 导航状态
|
|
var showUserAgreement: Bool = false
|
|
var showPrivacyPolicy: Bool = false
|
|
}
|
|
|
|
enum Action: Equatable {
|
|
case onAppear
|
|
case editNicknameTapped
|
|
case logoutTapped
|
|
|
|
// 用户信息相关
|
|
case loadUserInfo
|
|
case userInfoResponse(Result<UserInfo, APIError>)
|
|
|
|
// WebView 导航
|
|
case personalInfoPermissionsTapped
|
|
case helpTapped
|
|
case clearCacheTapped
|
|
case checkUpdatesTapped
|
|
case aboutUsTapped
|
|
|
|
// WebView 关闭
|
|
case userAgreementDismissed
|
|
case privacyPolicyDismissed
|
|
}
|
|
|
|
@Dependency(\.apiService) var apiService
|
|
|
|
var body: some ReducerOf<Self> {
|
|
Reduce { state, action in
|
|
switch action {
|
|
case .onAppear:
|
|
return .send(.loadUserInfo)
|
|
|
|
case .editNicknameTapped:
|
|
// 预留编辑昵称逻辑
|
|
return .none
|
|
|
|
case .logoutTapped:
|
|
// 预留登出逻辑
|
|
return .none
|
|
|
|
case .loadUserInfo:
|
|
state.isLoadingUserInfo = true
|
|
state.userInfoError = nil
|
|
return .run { send in
|
|
do {
|
|
if let userInfo = await UserInfoManager.getUserInfo() {
|
|
await send(.userInfoResponse(.success(userInfo)))
|
|
} else {
|
|
await send(.userInfoResponse(.failure(APIError.custom("用户信息不存在"))))
|
|
}
|
|
} catch {
|
|
let apiError: APIError
|
|
if let error = error as? APIError {
|
|
apiError = error
|
|
} else {
|
|
apiError = APIError.custom(error.localizedDescription)
|
|
}
|
|
await send(.userInfoResponse(.failure(apiError)))
|
|
}
|
|
}
|
|
|
|
case let .userInfoResponse(.success(userInfo)):
|
|
state.userInfo = userInfo
|
|
state.nickname = userInfo.nick ?? ""
|
|
state.avatarURL = userInfo.avatar
|
|
state.isLoadingUserInfo = false
|
|
return .none
|
|
|
|
case let .userInfoResponse(.failure(error)):
|
|
state.userInfoError = error.localizedDescription
|
|
state.isLoadingUserInfo = false
|
|
return .none
|
|
|
|
case .personalInfoPermissionsTapped:
|
|
state.showPrivacyPolicy = true
|
|
return .none
|
|
|
|
case .helpTapped:
|
|
state.showUserAgreement = true
|
|
return .none
|
|
|
|
case .clearCacheTapped:
|
|
// 预留清除缓存逻辑
|
|
return .none
|
|
|
|
case .checkUpdatesTapped:
|
|
// 预留检查更新逻辑
|
|
return .none
|
|
|
|
case .aboutUsTapped:
|
|
// 预留关于我们逻辑
|
|
return .none
|
|
|
|
case .userAgreementDismissed:
|
|
state.showUserAgreement = false
|
|
return .none
|
|
|
|
case .privacyPolicyDismissed:
|
|
state.showPrivacyPolicy = false
|
|
return .none
|
|
}
|
|
}
|
|
}
|
|
}
|