import Foundation import ComposableArchitecture @Reducer struct FeedListFeature { @Dependency(\.apiService) var apiService struct State: Equatable { var feeds: [Feed] = [] // 预留 feed 内容 var isLoading: Bool = false var error: String? = nil var isEditFeedPresented: Bool = false // 新增:控制 EditFeedView 弹窗 // 新增:动态内容 var moments: [MomentsInfo] = [] // 新增:只加载一次标志 var isLoaded: Bool = false } enum Action: Equatable { case onAppear case reload case loadMore case editFeedButtonTapped // 新增:点击 add 按钮 case editFeedDismissed // 新增:关闭编辑页 // 新增:动态内容相关 case fetchFeeds case fetchFeedsResponse(TaskResult) // 预留后续 Action } func reduce(into state: inout State, action: Action) -> Effect { switch action { case .onAppear: // 只在首次加载时请求 feed 数据 guard !state.isLoaded else { return .none } state.isLoaded = true return .send(.fetchFeeds) case .fetchFeeds: state.isLoading = true state.error = nil // 发起 API 请求 return .run { [apiService] send in await send(.fetchFeedsResponse(TaskResult { let request = LatestDynamicsRequest(dynamicId: "", pageSize: 20, types: [.text, .picture]) return try await apiService.request(request) })) } case let .fetchFeedsResponse(.success(response)): state.isLoading = false if let list = response.data?.dynamicList { state.moments = list state.error = nil } else { state.moments = [] state.error = response.message } return .none case let .fetchFeedsResponse(.failure(error)): state.isLoading = false state.moments = [] state.error = error.localizedDescription return .none case .reload: // 预留刷新逻辑 return .none case .loadMore: // 预留分页加载逻辑 return .none case .editFeedButtonTapped: state.isEditFeedPresented = true return .none case .editFeedDismissed: state.isEditFeedPresented = false return .none } } } // Feed 数据模型占位,后续可替换为真实模型 enum Feed: Equatable, Identifiable { case placeholder(id: UUID = UUID()) var id: UUID { switch self { case .placeholder(let id): return id } } }