feat: 更新CreateFeed功能及相关视图组件
- 在CreateFeedFeature中新增isPresented依赖,确保在适当的上下文中执行视图关闭操作。 - 在FeedFeature中优化状态管理,简化CreateFeedView的呈现逻辑。 - 新增FeedListFeature和MainFeature,整合FeedListView和底部导航功能,提升用户体验。 - 更新HomeView和SplashView以集成MainView,确保应用结构一致性。 - 在多个视图中调整状态管理和导航逻辑,增强可维护性和用户体验。
This commit is contained in:
@@ -7,145 +7,103 @@ struct FeedFeature {
|
||||
struct State: Equatable {
|
||||
var moments: [MomentsInfo] = []
|
||||
var isLoading = false
|
||||
var isRefreshing = false
|
||||
var hasMoreData = true
|
||||
var error: String?
|
||||
var nextDynamicId: Int = 0
|
||||
|
||||
// 是否已初始化 - 用于防止重复初始化
|
||||
var isInitialized = false
|
||||
|
||||
// CreateFeedView 相关状态 - 简化为布尔值
|
||||
var isCreateFeedPresented = false
|
||||
// CreateFeedView 相关状态
|
||||
var createFeedState = CreateFeedFeature.State()
|
||||
}
|
||||
|
||||
enum Action {
|
||||
enum Action: Equatable {
|
||||
case onAppear
|
||||
case refresh
|
||||
case loadLatestMoments
|
||||
case loadMoreMoments
|
||||
case momentsResponse(TaskResult<MomentsLatestResponse>)
|
||||
case clearError
|
||||
case retryLoad
|
||||
|
||||
// CreateFeedView 相关 Action - 简化为布尔控制
|
||||
case showCreateFeed
|
||||
// CreateFeedView 相关 Action
|
||||
case createFeedCompleted
|
||||
case createFeedDismissed
|
||||
// CreateFeedFeature 的 action
|
||||
case createFeed(CreateFeedFeature.Action)
|
||||
}
|
||||
|
||||
@Dependency(\.apiService) var apiService
|
||||
|
||||
var body: some ReducerOf<Self> {
|
||||
Scope(state: \.createFeedState, action: \.createFeed) {
|
||||
CreateFeedFeature()
|
||||
}
|
||||
|
||||
Reduce { state, action in
|
||||
switch action {
|
||||
case .onAppear:
|
||||
// 只在未初始化时才执行首次加载
|
||||
guard !state.isInitialized else {
|
||||
return .none
|
||||
}
|
||||
|
||||
guard state.moments.isEmpty && !state.isLoading else { return .none }
|
||||
return .send(.loadLatestMoments)
|
||||
|
||||
case .refresh:
|
||||
guard !state.isRefreshing else { return .none }
|
||||
state.isRefreshing = true
|
||||
state.error = nil
|
||||
let request = LatestDynamicsRequest(dynamicId: "", pageSize: 20, types: [.text, .picture])
|
||||
return .run { send in
|
||||
await send(.momentsResponse(TaskResult { try await apiService.request(request) }))
|
||||
}
|
||||
case .loadLatestMoments:
|
||||
// 添加重复请求防护
|
||||
guard !state.isLoading else {
|
||||
return .none
|
||||
}
|
||||
|
||||
// 加载最新数据(下拉刷新)
|
||||
guard !state.isLoading else { return .none }
|
||||
state.isLoading = true
|
||||
state.error = nil
|
||||
|
||||
let request = LatestDynamicsRequest(
|
||||
dynamicId: "", // 首次加载传空字符串
|
||||
pageSize: 20,
|
||||
types: [.text, .picture]
|
||||
)
|
||||
let request = LatestDynamicsRequest(dynamicId: "", pageSize: 20, types: [.text, .picture])
|
||||
return .run { send in
|
||||
await send(.momentsResponse(TaskResult {
|
||||
try await apiService.request(request)
|
||||
}))
|
||||
await send(.momentsResponse(TaskResult { try await apiService.request(request) }))
|
||||
}
|
||||
|
||||
case .loadMoreMoments:
|
||||
// 加载更多数据(分页加载)
|
||||
guard !state.isLoading && state.hasMoreData else { return .none }
|
||||
|
||||
state.isLoading = true
|
||||
state.error = nil
|
||||
|
||||
let request = LatestDynamicsRequest(
|
||||
dynamicId: state.nextDynamicId == 0 ? "" : String(state.nextDynamicId),
|
||||
pageSize: 20,
|
||||
types: [.text, .picture]
|
||||
)
|
||||
|
||||
let request = LatestDynamicsRequest(dynamicId: state.nextDynamicId == 0 ? "" : String(state.nextDynamicId), pageSize: 20, types: [.text, .picture])
|
||||
return .run { send in
|
||||
await send(.momentsResponse(TaskResult {
|
||||
try await apiService.request(request)
|
||||
}))
|
||||
await send(.momentsResponse(TaskResult { try await apiService.request(request) }))
|
||||
}
|
||||
|
||||
case let .momentsResponse(.success(response)):
|
||||
state.isLoading = false
|
||||
|
||||
// 设置初始化状态
|
||||
if !state.isInitialized {
|
||||
state.isInitialized = true
|
||||
}
|
||||
|
||||
// 检查响应状态
|
||||
state.isRefreshing = false
|
||||
guard response.code == 200, let data = response.data else {
|
||||
let errorMsg = response.message.isEmpty ? "获取动态失败" : response.message
|
||||
state.error = errorMsg
|
||||
return .none
|
||||
}
|
||||
|
||||
// 判断是刷新还是加载更多
|
||||
let isRefresh = state.nextDynamicId == 0
|
||||
|
||||
let isRefresh = state.nextDynamicId == 0 || state.isRefreshing
|
||||
if isRefresh {
|
||||
// 刷新:替换所有数据
|
||||
state.moments = data.dynamicList
|
||||
} else {
|
||||
// 加载更多:追加到现有数据
|
||||
state.moments.append(contentsOf: data.dynamicList)
|
||||
}
|
||||
|
||||
// 更新分页状态
|
||||
state.nextDynamicId = data.nextDynamicId
|
||||
state.hasMoreData = !data.dynamicList.isEmpty
|
||||
|
||||
return .none
|
||||
|
||||
case let .momentsResponse(.failure(error)):
|
||||
state.isLoading = false
|
||||
state.isRefreshing = false
|
||||
state.error = error.localizedDescription
|
||||
return .none
|
||||
|
||||
case .clearError:
|
||||
state.error = nil
|
||||
return .none
|
||||
|
||||
case .retryLoad:
|
||||
// 重试加载
|
||||
if state.moments.isEmpty {
|
||||
return .send(.loadLatestMoments)
|
||||
} else {
|
||||
return .send(.loadMoreMoments)
|
||||
}
|
||||
|
||||
// CreateFeedView 相关 Action 处理 - 简化为布尔控制
|
||||
case .showCreateFeed:
|
||||
state.isCreateFeedPresented = true
|
||||
return .none
|
||||
|
||||
case .createFeedCompleted:
|
||||
// 发布完成后刷新动态列表
|
||||
state.isCreateFeedPresented = false
|
||||
return .send(.loadLatestMoments)
|
||||
|
||||
return .send(.refresh)
|
||||
case .createFeedDismissed:
|
||||
state.isCreateFeedPresented = false
|
||||
return .none
|
||||
case .createFeed(.dismissView):
|
||||
return .send(.createFeedDismissed)
|
||||
case .createFeed:
|
||||
return .none
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user