Files
e-party-iOS/yana/Features/AppSettingFeature.swift
edwinQQQ 71c40e465d feat: 更新AppSettingFeature以增强用户设置功能
- 重构AppSettingFeature,采用@Reducer和@ObservableState以优化状态管理。
- 新增用户信息加载逻辑,支持从服务器获取用户信息并更新界面。
- 更新AppSettingView,整合头像、昵称及其他设置项的展示,提升用户体验。
- 增加多语言支持,更新Localizable.strings文件以适应新的设置项。
2025-07-24 11:24:04 +08:00

115 lines
3.5 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 userInfoLoaded(UserInfo?)
case userInfoLoadFailed(String)
// 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
let currentUid = await UserInfoManager.getCurrentUserId()
if let userInfo = await UserInfoManager.fetchUserInfoFromServer(
uid: currentUid,
apiService: apiService
) {
await send(.userInfoLoaded(userInfo))
} else {
await send(.userInfoLoadFailed("获取用户信息失败"))
}
}
case let .userInfoLoaded(userInfo):
state.isLoadingUserInfo = false
state.userInfo = userInfo
state.nickname = userInfo?.nick ?? "hahahaha"
state.avatarURL = userInfo?.avatar
return .none
case let .userInfoLoadFailed(error):
state.isLoadingUserInfo = false
state.userInfoError = error
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
}
}
}
}