
- 在APIEndpoints.swift中新增tcToken端点以支持腾讯云COS Token获取。 - 在APIModels.swift中新增TcTokenRequest和TcTokenResponse模型,处理Token请求和响应。 - 在COSManager.swift中实现Token的获取、缓存和过期管理逻辑,提升API请求的安全性。 - 在LanguageSettingsView中添加调试功能,允许测试COS Token获取。 - 在多个视图中更新状态管理和导航逻辑,确保用户体验一致性。 - 在FeedFeature和HomeFeature中优化状态管理,简化视图逻辑。
124 lines
3.7 KiB
Swift
124 lines
3.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()
|
||
|
||
// 新增:Feed 状态
|
||
var feedState = FeedFeature.State()
|
||
|
||
// 新增:登出状态
|
||
var isLoggedOut = false
|
||
}
|
||
|
||
enum Action {
|
||
case onAppear
|
||
case loadUserInfo
|
||
case userInfoLoaded(UserInfo?)
|
||
case loadAccountModel
|
||
case accountModelLoaded(AccountModel?)
|
||
case logoutTapped
|
||
case logout
|
||
|
||
// 设置页面相关actions
|
||
case settingDismissed
|
||
case setting(SettingFeature.Action)
|
||
|
||
// 新增:Feed actions
|
||
case feed(FeedFeature.Action)
|
||
|
||
// 新增:登出完成
|
||
case logoutCompleted
|
||
}
|
||
|
||
var body: some ReducerOf<Self> {
|
||
Scope(state: \.settingState, action: \.setting) {
|
||
SettingFeature()
|
||
}
|
||
|
||
// 新增:Feed Scope
|
||
Scope(state: \.feedState, action: \.feed) {
|
||
FeedFeature()
|
||
}
|
||
|
||
Reduce { state, action in
|
||
switch action {
|
||
case .onAppear:
|
||
// 只在未初始化时才执行首次加载
|
||
guard !state.isInitialized else {
|
||
return .none
|
||
}
|
||
|
||
state.isInitialized = true
|
||
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 .logoutTapped:
|
||
return .send(.logout)
|
||
|
||
case .logout:
|
||
// 清除所有认证数据并设置登出状态
|
||
return .run { send in
|
||
await UserInfoManager.clearAllAuthenticationData()
|
||
await send(.logoutCompleted)
|
||
}
|
||
|
||
case .logoutCompleted:
|
||
state.isLoggedOut = true
|
||
return .none
|
||
|
||
case .settingDismissed:
|
||
state.isSettingPresented = false
|
||
return .none
|
||
|
||
case .setting:
|
||
// 由子reducer处理
|
||
return .none
|
||
|
||
case .feed(_):
|
||
// FeedFeature 的 action 由 Scope 自动处理
|
||
return .none
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 移除:未使用的通知名称定义
|
||
// extension Notification.Name {
|
||
// static let homeLogout = Notification.Name("homeLogout")
|
||
// }
|