// // PLJobsView.swift // IOS_study // // Created by CC-star on 2025/6/12. // import SwiftUI import LeanCloud struct PLJobsView: View { @State var lastPLFilter = PLFilter() @State var showFilterView = false @State var showOrderView = false @State var lastPLOrder: PLOrder = .updatedAt @Environment(HUD.self) var hud @Environment(PLJobViewModel.self) var vm @Environment(TabBarViewModel.self) var TabBarVM @Environment(NetworkMonitor.self) var nt @State var naviPath = NavigationPath() var body: some View { NavigationStack(path: $naviPath) { ZStack { if !vm.jobs.isEmpty { ScrollViewReader { scrollView in List{ Color.clear.frame(height: 1).listRowStyle().id("top")//透明空白视图,无明显影响 ForEach(vm.jobs) {job in Button { vm.job = job naviPath.append(Navi1.PLJobsToPLJob) } label: { PLJobCellView(job: job) }.buttonStyle(.borderless) }.listRowStyle() // Button("加载更多", action: { // loadMore() // }).buttonStyle(.borderless) Group { if vm.fcJobsErrMsg.isEmpty { if !vm.isFinshed { if vm.isFcJobs { Text("正在加载中...") } else { Text("正在加载中...").onAppear { loadMore() } } } else { if nt.isConnected { Text("已全部加载") } else { Text("当前无网络,无法加载更多数据,请联网后下拉刷新") } } } else { HStack { Text("自动加载数据失败,请手动加载") Button("点击加载", action: loadMore).buttonStyle(.borderless).accent() } } }.listRowStyleLoading2() }.listStyle().refreshable { await refreashable() } .onChange(of: vm.isOF) {//尾随闭包 withAnimation { scrollView.scrollTo("top", anchor: .top) } } } } else { //首次加载,还没有加载出数据 if vm.fcJobsErrMsg.isEmpty {//没有错误 if !vm.isFcJobs { if nt.isConnected && vm.filter.totalCount > 0 { //筛选后没有数据todo Text("没有找到符合筛选条件的在招职位,请更改筛选条件").explainStyle() } else {//取完数据后发现没有数据:1.没有联网 2.筛选后没有数据 VStack(spacing: 9) {//没有联网【根据后端SDK的不同,有的直接走这里,有的直接抛出错误】 Button { refreash() } label: { Text("点击刷新").appleStyle() } Text("网络问题,若刷新失败,请重启App").explainStyle() } } } else { Color.bg2//展示空白视图 } } else {//有错误 VStack(alignment: .leading, spacing: 9) { Button { refreash() } label: { Text("点击刷新").appleStyle() } Text("加载数据失败,请点击刷新") HStack { Text("若刷新失败,请截图并联系客服微信:\(KdevContact)") Button { UIPasteboard.general.string = KdevContact hud.show("复制成功") } label: { Text("复制").accent() } } exDivider() // HStack { Text("错误信息").push(to: .center) Text(vm.fcJobsErrMsg).red() // } }.explainStyle() } } }.naviBarStyle() .navigationDestination(for: Navi1.self) { navi in switch navi { case .PLJobsToPLJob : PLJobView(naviPath: $naviPath) } } .toolbar { ToolbarItem(placement: .topBarLeading) { orderBtn } ToolbarItem(placement: .principal) { Text("好工作").tc().bold() } ToolbarItem(placement: .topBarTrailing) { filterBtn } } .overlay { if showFilterView || showOrderView {//展示筛选\排序视图 Color.black.opacity(0.3)//半透明阴影视图 .onTapGesture {//点击手势 showFilterView = false showOrderView = false } } } .overlay(alignment: .top) { if showFilterView { plFilterView } else if showOrderView { plOrderView } } .overlay { if vm.isFcJobs { BprogressView() } } }.animation(.default, value: showFilterView)//对showFilterView使用默认【default】的动画效果 .onAppear { getJobsOnce() refreshIFNeed() } } func getJobsOnce() { if vm.isJobsLoaded { return } Task { await vm.getJobs() } } func refreshIFNeed() { if vm.isJobsLoaded && TabBarVM.refreshJobs && TabBarVM.jobType == "兼职" { vm.filter = PLFilter() vm.order = .updatedAt refreash() TabBarVM.refreshJobs = false } } func refreashable() async { await vm.getJobs(isResFresh: true) } func refreash() { Task { await refreashable() } } func loadMore() { Task { await vm.getJobs() } } } #Preview { PLJobsView() }