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 footerRefreshing: Bool = false
@State private var noMore: Bool = false @State private var noMore: Bool = false
//
@State private var visibleIndices = Set<Int>()
var body: some View { var body: some View {
VStack(alignment: .center) { VStack(alignment: .center) {
@ -37,75 +40,72 @@ struct IndexMainView: View {
.padding([.top, .bottom], 5) .padding([.top, .bottom], 5)
Spacer() Spacer()
Button(action: { HStack {
appNavigation.append(dest: .followList) Text("\(indexModel.follow_num)")
}) { .font(.system(size: 17))
HStack { .foregroundColor(.black)
Text("\(indexModel.follow_num)") .padding([.top, .bottom], 5)
.font(.system(size: 17)) .padding(.leading, 10)
.foregroundColor(.black)
.padding([.top, .bottom], 5)
.padding(.leading, 10)
}
} }
.contentShape(Rectangle()) .contentShape(Rectangle())
.highPriorityGesture(
TapGesture().onEnded {
print("call me tap")
appNavigation.append(dest: .followList)
}
)
.zIndex(1) .zIndex(1)
.border(Color.red)
} }
.padding([.leading, .trailing], 15) .padding([.leading, .trailing], 15)
.frame(height: 50) .frame(height: 50)
.background(Color(hex: "#F2F2F2"), ignoresSafeAreaEdges: .top) .background(Color(hex: "#F2F2F2"), ignoresSafeAreaEdges: .top)
ScrollView(.vertical, showsIndicators: false) { 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() Rectangle()
.frame(width: 0, height: 15) .frame(width: 0, height: 15)
// //
LazyVStack(alignment: .center, spacing: 10) { LazyVStack(alignment: .center, spacing: 10) {
ForEach(indexModel.updateDramaGroups, id: \.group_id) { group in ForEach(indexModel.updateDramaGroups, id: \.group_id) { group in
DramaGroupView(group: group, model: indexModel) { DramaGroupView(visibleIndices: $visibleIndices, group: group, model: indexModel) {
selectGroupId = group.group_id selectGroupId = group.group_id
indexModel.selectedDate = group.group_id indexModel.selectedDate = group.group_id
showDateNavPopover = true showDateNavPopover = true
} }
.contentShape(Rectangle())
} }
} }
// // //
RefreshFooter(refreshing: $footerRefreshing, action: { // RefreshFooter(refreshing: $footerRefreshing, action: {
guard !self.showDateNavPopover else { // guard !self.showDateNavPopover else {
return // return
} // }
//
Task { // Task {
self.footerRefreshing = true // self.footerRefreshing = true
await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .next) // await self.indexModel.loadMoreUpdateDramas(userId: self.userId, mode: .next)
self.footerRefreshing = false // self.footerRefreshing = false
} // }
}) { // }) {
ProgressView() // ProgressView()
} // }
.noMore(noMore) // .noMore(noMore)
.preload(offset: 50) // .preload(offset: 50)
} }
.enableRefresh()
.frame(width: 370) .frame(width: 370)
.coordinateSpace(name: "indexScrollView") .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) { .overlay(alignment: .topTrailing) {
HStack(alignment: .center) { HStack(alignment: .center) {
Button(action: { Button(action: {
@ -151,6 +151,14 @@ struct IndexMainView: View {
indexModel.setFixedDrameGroup(groupId: minFrame.key) 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 { struct DramaGroupView: View {
@EnvironmentObject var appNav: AppNavigation @EnvironmentObject var appNav: AppNavigation
@Binding var visibleIndices: Set<Int>
let group: IndexModel.UpdateDramaGroup let group: IndexModel.UpdateDramaGroup
let model: IndexModel let model: IndexModel
@ -224,9 +233,13 @@ extension IndexMainView {
let minY = geometry.frame(in: .named("indexScrollView")).minY let minY = geometry.frame(in: .named("indexScrollView")).minY
let y = minY >= 0 ? minY : minY + height 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 } 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 { #Preview {