feat: 新增动态点赞与删除功能
- 在APIEndpoints中新增动态点赞和删除端点。 - 实现LikeDynamicRequest和DeleteDynamicRequest结构体,支持动态点赞和删除请求。 - 在DetailFeature中添加点赞和删除动态的逻辑,提升用户交互体验。 - 更新FeedListFeature以支持动态详情视图的展示,增强用户体验。 - 新增DetailView以展示动态详情,包含点赞和删除功能。
This commit is contained in:
145
yana/Features/DetailFeature.swift
Normal file
145
yana/Features/DetailFeature.swift
Normal file
@@ -0,0 +1,145 @@
|
||||
import Foundation
|
||||
import ComposableArchitecture
|
||||
|
||||
@Reducer
|
||||
struct DetailFeature {
|
||||
@Dependency(\.apiService) var apiService
|
||||
|
||||
@ObservableState
|
||||
struct State: Equatable {
|
||||
var moment: MomentsInfo
|
||||
var isLikeLoading = false
|
||||
var isDeleteLoading = false
|
||||
var showImagePreview = false
|
||||
var selectedImageIndex = 0
|
||||
var selectedImages: [String] = []
|
||||
|
||||
init(moment: MomentsInfo) {
|
||||
self.moment = moment
|
||||
}
|
||||
}
|
||||
|
||||
enum Action: Equatable {
|
||||
case onAppear
|
||||
case likeDynamic(Int, Int, Int, Int) // dynamicId, uid, likedUid, worldId
|
||||
case likeResponse(TaskResult<LikeDynamicResponse>)
|
||||
case deleteDynamic
|
||||
case deleteResponse(TaskResult<DeleteDynamicResponse>)
|
||||
case showImagePreview([String], Int)
|
||||
case hideImagePreview
|
||||
case imagePreviewDismissed
|
||||
case onLikeSuccess(Int, Bool) // dynamicId, newLikeState
|
||||
}
|
||||
|
||||
var body: some ReducerOf<Self> {
|
||||
Reduce { state, action in
|
||||
switch action {
|
||||
case .onAppear:
|
||||
return .none
|
||||
|
||||
case let .likeDynamic(dynamicId, uid, likedUid, worldId):
|
||||
state.isLikeLoading = true
|
||||
|
||||
let status = state.moment.isLike ? 0 : 1
|
||||
let request = LikeDynamicRequest(
|
||||
dynamicId: dynamicId,
|
||||
uid: uid,
|
||||
status: status,
|
||||
likedUid: likedUid,
|
||||
worldId: worldId
|
||||
)
|
||||
|
||||
return .run { send in
|
||||
let result = await TaskResult {
|
||||
try await apiService.request(request)
|
||||
}
|
||||
await send(.likeResponse(result))
|
||||
}
|
||||
|
||||
case let .likeResponse(.success(response)):
|
||||
state.isLikeLoading = false
|
||||
// 点赞成功,通知父视图更新状态
|
||||
return .send(.onLikeSuccess(state.moment.dynamicId, !state.moment.isLike))
|
||||
|
||||
case let .onLikeSuccess(dynamicId, newLikeState):
|
||||
// 更新本地动态的点赞状态
|
||||
// 由于MomentsInfo的isLike是let,我们需要重新创建moment对象
|
||||
let updatedMoment = MomentsInfo(
|
||||
dynamicId: state.moment.dynamicId,
|
||||
uid: state.moment.uid,
|
||||
nick: state.moment.nick,
|
||||
avatar: state.moment.avatar,
|
||||
type: state.moment.type,
|
||||
content: state.moment.content,
|
||||
likeCount: state.moment.likeCount,
|
||||
isLike: newLikeState,
|
||||
commentCount: state.moment.commentCount,
|
||||
publishTime: state.moment.publishTime,
|
||||
worldId: state.moment.worldId,
|
||||
status: state.moment.status,
|
||||
playCount: state.moment.playCount,
|
||||
dynamicResList: state.moment.dynamicResList,
|
||||
gender: state.moment.gender,
|
||||
squareTop: state.moment.squareTop,
|
||||
topicTop: state.moment.topicTop,
|
||||
newUser: state.moment.newUser,
|
||||
defUser: state.moment.defUser,
|
||||
scene: state.moment.scene,
|
||||
userVipInfoVO: state.moment.userVipInfoVO,
|
||||
headwearPic: state.moment.headwearPic,
|
||||
headwearEffect: state.moment.headwearEffect,
|
||||
headwearType: state.moment.headwearType,
|
||||
headwearName: state.moment.headwearName,
|
||||
headwearId: state.moment.headwearId,
|
||||
experLevelPic: state.moment.experLevelPic,
|
||||
charmLevelPic: state.moment.charmLevelPic,
|
||||
isCustomWord: state.moment.isCustomWord,
|
||||
labelList: state.moment.labelList
|
||||
)
|
||||
state.moment = updatedMoment
|
||||
return .none
|
||||
|
||||
case let .likeResponse(.failure(error)):
|
||||
state.isLikeLoading = false
|
||||
// 可以在这里处理错误,比如显示错误提示
|
||||
return .none
|
||||
|
||||
case .deleteDynamic:
|
||||
state.isDeleteLoading = true
|
||||
|
||||
let request = DeleteDynamicRequest(dynamicId: state.moment.dynamicId, uid: state.moment.uid)
|
||||
|
||||
return .run { send in
|
||||
let result = await TaskResult {
|
||||
try await apiService.request(request)
|
||||
}
|
||||
await send(.deleteResponse(result))
|
||||
}
|
||||
|
||||
case let .deleteResponse(.success(response)):
|
||||
state.isDeleteLoading = false
|
||||
// 删除成功,返回上一页
|
||||
return .none
|
||||
|
||||
case let .deleteResponse(.failure(error)):
|
||||
state.isDeleteLoading = false
|
||||
// 可以在这里处理错误
|
||||
return .none
|
||||
|
||||
case let .showImagePreview(images, index):
|
||||
state.selectedImages = images
|
||||
state.selectedImageIndex = index
|
||||
state.showImagePreview = true
|
||||
return .none
|
||||
|
||||
case .hideImagePreview:
|
||||
state.showImagePreview = false
|
||||
return .none
|
||||
|
||||
case .imagePreviewDismissed:
|
||||
state.showImagePreview = false
|
||||
return .none
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user