fix IndexMain

This commit is contained in:
anlicheng 2025-04-09 17:18:02 +08:00
parent d00703f8c5
commit f1bda5455f

View File

@ -28,6 +28,9 @@ struct IndexMainView: View {
@State private var footerRefreshing: Bool = false
@State private var noMore: Bool = false
//
@State private var visibleIndices = Set<Int>()
var body: some View {
VStack(alignment: .center) {
@ -37,75 +40,72 @@ struct IndexMainView: View {
.padding([.top, .bottom], 5)
Spacer()
Button(action: {
appNavigation.append(dest: .followList)
}) {
HStack {
Text("\(indexModel.follow_num)")
.font(.system(size: 17))
.foregroundColor(.black)
.padding([.top, .bottom], 5)
.padding(.leading, 10)
}
HStack {
Text("\(indexModel.follow_num)")
.font(.system(size: 17))
.foregroundColor(.black)
.padding([.top, .bottom], 5)
.padding(.leading, 10)
}
.contentShape(Rectangle())
.highPriorityGesture(
TapGesture().onEnded {
print("call me tap")
appNavigation.append(dest: .followList)
}
)
.zIndex(1)
.border(Color.red)
}
.padding([.leading, .trailing], 15)
.frame(height: 50)
.background(Color(hex: "#F2F2F2"), ignoresSafeAreaEdges: .top)
ScrollView(.vertical, showsIndicators: false) {
//
RefreshHeader(refreshing: $headerRefreshing, action: {
guard !self.showDateNavPopover else {
return
}
Task {
//
self.headerRefreshing = true
await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .prev)
self.headerRefreshing = false
}
}) { progress in
ProgressView()
}
Rectangle()
.frame(width: 0, height: 15)
//
LazyVStack(alignment: .center, spacing: 10) {
ForEach(indexModel.updateDramaGroups, id: \.group_id) { group in
DramaGroupView(group: group, model: indexModel) {
DramaGroupView(visibleIndices: $visibleIndices, group: group, model: indexModel) {
selectGroupId = group.group_id
indexModel.selectedDate = group.group_id
showDateNavPopover = true
}
.contentShape(Rectangle())
}
}
//
RefreshFooter(refreshing: $footerRefreshing, action: {
guard !self.showDateNavPopover else {
return
}
Task {
self.footerRefreshing = true
await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .next)
self.footerRefreshing = false
}
}) {
ProgressView()
}
.noMore(noMore)
.preload(offset: 50)
// //
// RefreshFooter(refreshing: $footerRefreshing, action: {
// guard !self.showDateNavPopover else {
// return
// }
//
// Task {
// self.footerRefreshing = true
// await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .next)
// self.footerRefreshing = false
// }
// }) {
// ProgressView()
// }
// .noMore(noMore)
// .preload(offset: 50)
}
.enableRefresh()
.frame(width: 370)
.coordinateSpace(name: "indexScrollView")
.refreshable {
guard !self.showDateNavPopover && !self.headerRefreshing else {
return
}
//
self.headerRefreshing = true
await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .prev)
self.headerRefreshing = false
}
.overlay(alignment: .topTrailing) {
HStack(alignment: .center) {
Button(action: {
@ -151,6 +151,14 @@ struct IndexMainView: View {
indexModel.setFixedDrameGroup(groupId: minFrame.key)
}
}
.onPreferenceChange(DramaOffsetPreferenceKey.self) { offsets in
self.visibleIndices = Set(offsets.compactMap { (id: Int, offset: CGFloat) in
return offset >= 0 ? id : nil
})
print("visible indx: \(self.visibleIndices)")
}
}
}
@ -159,7 +167,8 @@ extension IndexMainView {
//
struct DramaGroupView: View {
@EnvironmentObject var appNav: AppNavigation
@Binding var visibleIndices: Set<Int>
let group: IndexModel.UpdateDramaGroup
let model: IndexModel
@ -224,9 +233,13 @@ extension IndexMainView {
let minY = geometry.frame(in: .named("indexScrollView")).minY
let y = minY >= 0 ? minY : minY + height
Color.clear.preference(key: DramaGroupElementPreferenceKey.self, value: [ group.group_id : y])
Color.clear
.preference(key: DramaGroupElementPreferenceKey.self, value: [ group.group_id : y])
.preference(key: DramaOffsetPreferenceKey.self, value: [item.id : minY])
})
}
.allowsHitTesting(visibleIndices.contains(item.id))
.disabled(!visibleIndices.contains(item.id))
}
}
}
@ -240,6 +253,16 @@ extension IndexMainView {
value.merge(nextValue()) { $1 }
}
}
// , [groupId : minY]
struct DramaOffsetPreferenceKey: PreferenceKey {
static var defaultValue: [Int: CGFloat] = [:]
static func reduce(value: inout [Int: CGFloat], nextValue: () -> [Int: CGFloat]) {
value.merge(nextValue()) { $1 }
}
}
}
#Preview {