feat: 添加腾讯云COS Token管理功能及相关视图更新
- 在APIEndpoints.swift中新增tcToken端点以支持腾讯云COS Token获取。 - 在APIModels.swift中新增TcTokenRequest和TcTokenResponse模型,处理Token请求和响应。 - 在COSManager.swift中实现Token的获取、缓存和过期管理逻辑,提升API请求的安全性。 - 在LanguageSettingsView中添加调试功能,允许测试COS Token获取。 - 在多个视图中更新状态管理和导航逻辑,确保用户体验一致性。 - 在FeedFeature和HomeFeature中优化状态管理,简化视图逻辑。
This commit is contained in:
@@ -11,12 +11,11 @@ struct FeedFeature {
|
||||
var error: String?
|
||||
var nextDynamicId: Int = 0
|
||||
|
||||
// 是否已初始化
|
||||
// 是否已初始化 - 用于防止重复初始化
|
||||
var isInitialized = false
|
||||
|
||||
// CreateFeedView 相关状态
|
||||
var isShowingCreateFeed = false
|
||||
var createFeedState: CreateFeedFeature.State? = nil
|
||||
// CreateFeedView 相关状态 - 简化为布尔值
|
||||
var isCreateFeedPresented = false
|
||||
}
|
||||
|
||||
enum Action {
|
||||
@@ -27,11 +26,10 @@ struct FeedFeature {
|
||||
case clearError
|
||||
case retryLoad
|
||||
|
||||
// CreateFeedView 相关 Action
|
||||
// CreateFeedView 相关 Action - 简化为布尔控制
|
||||
case showCreateFeed
|
||||
case dismissCreateFeed
|
||||
case createFeedCompleted
|
||||
indirect case createFeed(CreateFeedFeature.Action)
|
||||
case createFeedDismissed
|
||||
}
|
||||
|
||||
@Dependency(\.apiService) var apiService
|
||||
@@ -40,15 +38,19 @@ struct FeedFeature {
|
||||
Reduce { state, action in
|
||||
switch action {
|
||||
case .onAppear:
|
||||
#if DEBUG
|
||||
return .none
|
||||
#endif
|
||||
// 只在首次出现时触发加载
|
||||
guard !state.isInitialized else { return .none }
|
||||
state.isInitialized = true
|
||||
// 只在未初始化时才执行首次加载
|
||||
guard !state.isInitialized else {
|
||||
return .none
|
||||
}
|
||||
|
||||
return .send(.loadLatestMoments)
|
||||
|
||||
case .loadLatestMoments:
|
||||
// 添加重复请求防护
|
||||
guard !state.isLoading else {
|
||||
return .none
|
||||
}
|
||||
|
||||
// 加载最新数据(下拉刷新)
|
||||
state.isLoading = true
|
||||
state.error = nil
|
||||
@@ -58,7 +60,6 @@ struct FeedFeature {
|
||||
pageSize: 20,
|
||||
types: [.text, .picture]
|
||||
)
|
||||
|
||||
return .run { send in
|
||||
await send(.momentsResponse(TaskResult {
|
||||
try await apiService.request(request)
|
||||
@@ -87,50 +88,38 @@ struct FeedFeature {
|
||||
case let .momentsResponse(.success(response)):
|
||||
state.isLoading = false
|
||||
|
||||
// 添加调试日志
|
||||
debugInfoSync("📱 FeedFeature: API 响应成功")
|
||||
debugInfoSync("📱 FeedFeature: response.code = \(response.code)")
|
||||
debugInfoSync("📱 FeedFeature: response.message = \(response.message)")
|
||||
debugInfoSync("📱 FeedFeature: response.data = \(response.data != nil ? "有数据" : "无数据")")
|
||||
// 设置初始化状态
|
||||
if !state.isInitialized {
|
||||
state.isInitialized = true
|
||||
}
|
||||
|
||||
// 检查响应状态
|
||||
guard response.code == 200, let data = response.data else {
|
||||
let errorMsg = response.message.isEmpty ? "获取动态失败" : response.message
|
||||
state.error = errorMsg
|
||||
debugErrorSync("❌ FeedFeature: API 响应失败 - code: \(response.code), message: \(errorMsg)")
|
||||
return .none
|
||||
}
|
||||
|
||||
// 添加数据调试日志
|
||||
debugInfoSync("📱 FeedFeature: data.dynamicList.count = \(data.dynamicList.count)")
|
||||
debugInfoSync("📱 FeedFeature: data.nextDynamicId = \(data.nextDynamicId)")
|
||||
|
||||
// 判断是刷新还是加载更多
|
||||
let isRefresh = state.nextDynamicId == 0
|
||||
debugInfoSync("📱 FeedFeature: isRefresh = \(isRefresh)")
|
||||
|
||||
if isRefresh {
|
||||
// 刷新:替换所有数据
|
||||
state.moments = data.dynamicList
|
||||
debugInfoSync(" FeedFeature: 刷新数据,moments.count = \(state.moments.count)")
|
||||
} else {
|
||||
// 加载更多:追加到现有数据
|
||||
let oldCount = state.moments.count
|
||||
state.moments.append(contentsOf: data.dynamicList)
|
||||
debugInfoSync(" FeedFeature: 加载更多,moments.count: \(oldCount) -> \(state.moments.count)")
|
||||
}
|
||||
|
||||
// 更新分页状态
|
||||
state.nextDynamicId = data.nextDynamicId
|
||||
state.hasMoreData = !data.dynamicList.isEmpty
|
||||
|
||||
debugInfoSync("📱 FeedFeature: 更新完成 - nextDynamicId: \(state.nextDynamicId), hasMoreData: \(state.hasMoreData)")
|
||||
return .none
|
||||
|
||||
case let .momentsResponse(.failure(error)):
|
||||
state.isLoading = false
|
||||
state.error = error.localizedDescription
|
||||
debugErrorSync("❌ FeedFeature: API 请求失败 - \(error.localizedDescription)")
|
||||
return .none
|
||||
|
||||
case .clearError:
|
||||
@@ -145,30 +134,20 @@ struct FeedFeature {
|
||||
return .send(.loadMoreMoments)
|
||||
}
|
||||
|
||||
// CreateFeedView 相关 Action 处理 - 简化为布尔控制
|
||||
case .showCreateFeed:
|
||||
state.isShowingCreateFeed = true
|
||||
// 初始化 createFeedState
|
||||
state.createFeedState = CreateFeedFeature.State()
|
||||
return .none
|
||||
|
||||
case .dismissCreateFeed:
|
||||
state.isShowingCreateFeed = false
|
||||
state.createFeedState = nil
|
||||
state.isCreateFeedPresented = true
|
||||
return .none
|
||||
|
||||
case .createFeedCompleted:
|
||||
state.isShowingCreateFeed = false
|
||||
state.createFeedState = nil
|
||||
// 发布完成后刷新动态列表
|
||||
state.isCreateFeedPresented = false
|
||||
return .send(.loadLatestMoments)
|
||||
case .createFeed:
|
||||
// 子模块 Action 由作用域 reducer 处理
|
||||
|
||||
case .createFeedDismissed:
|
||||
state.isCreateFeedPresented = false
|
||||
return .none
|
||||
}
|
||||
}
|
||||
// 子模块作用域 reducer
|
||||
self.ifLet(\.createFeedState, action: \.createFeed) {
|
||||
CreateFeedFeature()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user