
- 更新Yana项目文档,调整适用版本至iOS 17,确保与最新开发环境兼容。 - 在多个视图中重构代码,优化状态管理和视图逻辑,提升用户体验。 - 添加默认初始化器以简化状态管理,确保各个Feature的状态一致性。 - 更新视图组件,移除不必要的硬编码,增强代码可读性和维护性。 - 修复多个视图中的逻辑错误,确保功能正常运行。
133 lines
4.7 KiB
Swift
133 lines
4.7 KiB
Swift
import Foundation
|
||
import ComposableArchitecture
|
||
|
||
@Reducer
|
||
struct MeFeature {
|
||
@Dependency(\.apiService) var apiService
|
||
@ObservableState
|
||
struct State: Equatable {
|
||
var isFirstLoad: Bool = true
|
||
var userInfo: UserInfo?
|
||
var isLoadingUserInfo: Bool = false
|
||
var userInfoError: String?
|
||
var moments: [MomentsInfo] = []
|
||
var isLoadingMoments: Bool = false
|
||
var momentsError: String?
|
||
var hasMore: Bool = true
|
||
var isLoadingMore: Bool = false
|
||
var isRefreshing: Bool = false
|
||
var page: Int = 1
|
||
var pageSize: Int = 20
|
||
var uid: Int = 0
|
||
// 新增:DetailView相关状态
|
||
var showDetail: Bool = false
|
||
var selectedMoment: MomentsInfo?
|
||
|
||
init() {
|
||
// 默认初始化
|
||
}
|
||
}
|
||
|
||
enum Action: Equatable {
|
||
case onAppear
|
||
case refresh
|
||
case loadMore
|
||
case userInfoResponse(Result<UserInfo, APIError>)
|
||
case momentsResponse(Result<MyMomentsResponse, APIError>)
|
||
// 设置按钮点击
|
||
case settingButtonTapped
|
||
// 新增:DetailView相关Action
|
||
case showDetail(MomentsInfo)
|
||
case detailDismissed
|
||
}
|
||
|
||
func reduce(into state: inout State, action: Action) -> Effect<Action> {
|
||
switch action {
|
||
case .onAppear:
|
||
guard state.isFirstLoad else { return .none }
|
||
state.isFirstLoad = false
|
||
return .send(.refresh)
|
||
case .refresh:
|
||
guard state.uid > 0 else { return .none }
|
||
state.isRefreshing = true
|
||
state.page = 1
|
||
state.hasMore = true
|
||
return .merge(
|
||
fetchUserInfo(uid: state.uid),
|
||
fetchMoments(uid: state.uid, page: 1, pageSize: state.pageSize)
|
||
)
|
||
case .loadMore:
|
||
guard state.uid > 0, state.hasMore, !state.isLoadingMore else { return .none }
|
||
state.isLoadingMore = true
|
||
return fetchMoments(uid: state.uid, page: state.page + 1, pageSize: state.pageSize)
|
||
case let .userInfoResponse(result):
|
||
state.isLoadingUserInfo = false
|
||
state.isRefreshing = false
|
||
switch result {
|
||
case let .success(userInfo):
|
||
state.userInfo = userInfo
|
||
state.userInfoError = nil
|
||
case let .failure(error):
|
||
state.userInfoError = error.localizedDescription
|
||
}
|
||
return .none
|
||
case let .momentsResponse(result):
|
||
state.isLoadingMoments = false
|
||
state.isLoadingMore = false
|
||
state.isRefreshing = false
|
||
switch result {
|
||
case let .success(resp):
|
||
let newMoments = resp.data ?? []
|
||
if state.page == 1 {
|
||
state.moments = newMoments
|
||
} else {
|
||
state.moments += newMoments
|
||
}
|
||
state.hasMore = newMoments.count == state.pageSize
|
||
if state.hasMore { state.page += 1 }
|
||
state.momentsError = nil
|
||
case let .failure(error):
|
||
state.momentsError = error.localizedDescription
|
||
}
|
||
return .none
|
||
case .settingButtonTapped:
|
||
// 交由 MainFeature 处理
|
||
return .none
|
||
case .showDetail(let moment):
|
||
state.selectedMoment = moment
|
||
state.showDetail = true
|
||
return .none
|
||
case .detailDismissed:
|
||
state.showDetail = false
|
||
state.selectedMoment = nil
|
||
return .none
|
||
}
|
||
}
|
||
|
||
private func fetchUserInfo(uid: Int) -> Effect<Action> {
|
||
.run { send in
|
||
// do {
|
||
if let userInfo = await UserInfoManager.fetchUserInfoFromServer(uid: String(uid), apiService: apiService) {
|
||
await send(.userInfoResponse(.success(userInfo)))
|
||
} else {
|
||
await send(.userInfoResponse(.failure(.noData)))
|
||
}
|
||
// } catch {
|
||
// await send(.userInfoResponse(.failure(error as? APIError ?? .unknown(error.localizedDescription))))
|
||
// }
|
||
}
|
||
}
|
||
|
||
private func fetchMoments(uid: Int, page: Int, pageSize: Int) -> Effect<Action> {
|
||
.run { send in
|
||
do {
|
||
let req = GetMyDynamicRequest(fromUid: uid, uid: uid, page: page, pageSize: pageSize)
|
||
let resp = try await apiService.request(req)
|
||
await send(.momentsResponse(.success(resp)))
|
||
} catch {
|
||
await send(.momentsResponse(.failure(error as? APIError ?? .unknown(error.localizedDescription))))
|
||
}
|
||
}
|
||
}
|
||
}
|