159 lines
6.4 KiB
Swift
159 lines
6.4 KiB
Swift
//
|
||
// 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()
|
||
}
|