IOS_Boss/IOS_study/Post/PostPLJobIView.swift
2025-07-27 12:33:06 +08:00

321 lines
15 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// PostPLJobIView.swift
// IOS_study
//
// Created by CC-star on 2025/6/28.
//
import SwiftUI
struct PostPLJobIView: View {
var isEditing = false //
@AppStorage("workPlaceName") var workPlaceName = ""
@AppStorage("workProvince") var workProvince = ""
@AppStorage("workCity") var workCity = ""
@AppStorage("workContact") var workContact = ""
@Environment(PLJobViewModel.self) var vm
@Environment(ProfileViewModel.self) var profileVM
@Environment(HUD.self) var hud
@Environment(TabBarViewModel.self) var tabbarVM
@State var scrollView: ScrollViewProxy?// = nil
@Binding var naviPath: NavigationPath
@State var WordNum20 = 20
@State var WordNum50 = 50
@State var WordNum100 = 100
@State var WordNum200 = 200
@State var WordNum300 = 300
@State var WordNum500 = 500
var draftJob: PLJob{ vm.draftJob }
var invalidMsg: String? {
if !profileVM.user.cIsUploaded { return "需要先上传公司信息" }
if draftJob.title.isBlank { return "工作名称未写" }
if draftJob.hourlyWage < 20 || draftJob.hourlyWage > 1000 { return "基本时给太低或太高" }
if draftJob.placeName.isBlank { return "工作地点未填" }
if draftJob.city.isBlank { return "城市未填" }
if draftJob.contact.isBlank { return "联系方式未填"}
if draftJob.title.count > WordNum50 { return "工作名称不能超过\($WordNum50)" }
if draftJob.otherTime.count > WordNum100 { return "时间说明不能超过\($WordNum100)" }
if draftJob.otherNeed.count > WordNum300 { return "工作要求不能超过\($WordNum300)" }
if draftJob.workContent.count > WordNum500 { return "工作内容不能超过\($WordNum500)" }
if draftJob.otherBenefit.count > WordNum300 { return "工作福利不能超过\($WordNum300)" }
if draftJob.placeName.count > WordNum50 { return "工作地点名称不能超过\($WordNum50)" }
if draftJob.city.count > WordNum20 { return "工作地城市不能超过\($WordNum20)" }
if draftJob.contact.count > WordNum200 { return "联系方式不能超过\($WordNum200)" }
return nil
}
var body: some View {
@Bindable var vm = vm
ScrollViewReader { scrollView in
ScrollView(showsIndicators: false) {
VStack(spacing: kStackSpacingS) {
VStack {
if profileVM.user.cIsUploaded {
Text(profileVM.user.cName).subTStyleL()
} else {
Text("请先至个人页添加公司").size15().red()
}
}.push(to: .center).padding().bg()
// MARK: -
VStack(alignment: .leading,spacing: kStackSpacing) {
HStack {
VStack(alignment: .leading) {
Text("工作业种").littleTStyle()
Picker("工作业种", selection: $vm.draftJob.business) {
ForEach(kBusinessArr, id: \.self){
Text($0)
}
}.pStyle()
}
VStack(alignment: .leading) {
Text("工作名称").littleTStyle()
TextField("IOS程序员", text: $vm.draftJob.title).tfStyle()
}
}.id("title")
VStack(alignment: .leading) {
Text("是否报税").littleTStyle()
Picker("是否报税", selection: $vm.draftJob.tax){
ForEach(kTaxArr, id: \.self){
Text($0)
}
}.pickerStyle(.segmented)
}.padding(.bottom,5)
HStack {
Text("基本时给:").littleTStyle()
TextField("", value: $vm.draftJob.hourlyWage, formatter: NumberFormatter())
.size18ab().multilineTextAlignment(.center).kerning(2)
.keyboardType(.numberPad).tfStyle().frame(width: 88)
Text("请填写最低时给").size13s()
}
HStack {
Text("招聘人数:").littleTStyle()
Picker("招聘人数", selection: $vm.draftJob.wantNum) { ForEach(kWantNumArr, id: \.self){
Text("\($0)")//
}
}.pStyle()
Text("请填写最多招聘人数").size13s()
}
}.padding().bg()
// MARK: -
VStack(alignment: .leading,spacing: kStackSpacingS) {
Text("工作时间").littleTStyle()
HStack {
HStack(spacing: 3) {
Picker("起始小时", selection: $vm.draftJob.startHour) { ForEach(0..<25) {Text("\($0)")}
}.pStyle()
Text(":").conlonStyle()
Picker("起始分钟", selection: $vm.draftJob.startMin) { ForEach([0,30], id: \.self) {Text($0 == 0 ? "00":"\($0)")}
}.pStyle()
Image(systemName: "minus")
Picker("结束小时", selection: $vm.draftJob.endHour) { ForEach(0..<25) {Text("\($0)")}
}.pStyle()
Text(":").conlonStyle()
Picker("结束分钟", selection: $vm.draftJob.endMin) { ForEach([0,30], id: \.self) {Text($0 == 0 ? "00":"\($0)")}
}.pStyle()
}
Button {
withAnimation {
vm.draftJob.has2.toggle()
}
} label: {
Image(systemName: vm.draftJob.has2 ? "minus.circle.fill" : "plus.circle.fill")
.foregroundStyle(vm.draftJob.has2 ? .red : .accent)
}.font(.title2).padding(.horizontal,3)
}
if(vm.draftJob.has2){
HStack(spacing: 3) {
Picker("第二个起始小时", selection: $vm.draftJob.startHour2) { ForEach(0..<25) {Text("\($0)")}
}.pStyle()
Text(":").conlonStyle()
Picker("第二个起始分钟2", selection: $vm.draftJob.startMin2) { ForEach([0,30], id: \.self) {Text($0 == 0 ? "00":"\($0)")}
}.pStyle()
Image(systemName: "minus")
Picker("第二个结束小时2", selection: $vm.draftJob.endHour2) { ForEach(0..<25) {Text("\($0)")}
}.pStyle()
Text(":").conlonStyle()
Picker("第二个结束分钟2", selection: $vm.draftJob.endMin2) { ForEach([0,30], id: \.self) {Text($0 == 0 ? "00":"\($0)")}
}.pStyle()
}
}
Text("追加说明").littleTStyle()
TextField("具体时间段可以详谈", text: $vm.draftJob.otherTime, axis: .vertical).tfStyleMultiS()
}.push(to: .leading).padding().bg()
// MARK: -
VStack(alignment: .leading,spacing: kStackSpacing) {
HStack {
VStack(alignment: .leading) {
Text("经验要求").littleTStyle()
Picker("经验要求", selection: $vm.draftJob.needExp) { ForEach(kNeedExpArr, id: \.self) {Text($0)}
}.pStyle()
}
VStack(alignment: .leading) {
Text("学历要求").littleTStyle()
Picker("学历要求", selection: $vm.draftJob.needEdu) { ForEach(kNeedEduArr, id: \.self) {Text($0)}
}.pStyle()
}
}
HStack {
VStack(alignment: .leading) {
Text("语言要求").littleTStyle()
Picker("学历要求", selection: $vm.draftJob.needLan) { ForEach(kNeedLanArr, id: \.self) {Text($0)}
}.pStyle()
}
VStack(alignment: .leading) {
Text("框架要求").littleTStyle()
Picker("学历要求", selection: $vm.draftJob.needFrame) { ForEach(kNeedFrameArr, id: \.self) {Text($0)}
}.pStyle()
}
}
VStack(alignment: .leading) {
Text("更多要求/加分项(选填)").littleTStyle()
TextField("", text: $vm.draftJob.otherNeed, axis: .vertical).tfStyleMultiM()
}
}.padding().bg()
// MARK: -
VStack(alignment: .leading) {
Text("工作内容(选填)").littleTStyle()
TextField("", text: $vm.draftJob.workContent, axis: .vertical).tfStyleMultiM()
}.padding().bg()
// MARK: -
VStack(alignment: .leading,spacing: kStackSpacing) {
Text("公司福利").littleTStyle()
HStack {
Text("交通费报销").onTapGesture {
vm.draftJob.moveFee.toggle()
}.toggleStyle(isTap: vm.draftJob.moveFee)
Text("不加班").onTapGesture {
vm.draftJob.noOverTime.toggle()
}.toggleStyle(isTap: vm.draftJob.noOverTime)
}
VStack(alignment: .leading) {
Text("更多福利(选填)").littleTStyle()
TextField("", text: $vm.draftJob.otherBenefit, axis: .vertical).tfStyleMultiL()
}
}.padding().bg()
// MARK: -
VStack(alignment: .leading,spacing: kStackSpacing) {
HStack {
Text("省份").littleTStyle()
Picker("省份", selection: $vm.draftJob.province) { ForEach(kProvinceArr, id: \.self) {Text($0)}
}.pStyle()
if !workProvince.isEmpty {
HStack(spacing: 3) {
Text("上次填的:").size13s()
Button {
vm.draftJob.province = workProvince
} label: {
Text(workProvince).labelBG()
}
}
}
}
HStack {
Text("城市").littleTStyle()
TextField("", text: $vm.draftJob.city, axis: .vertical).tfStyle().frame(width: 115)
if !workCity.isEmpty {
HStack(spacing: 3) {
Text("上次填的:").size13s()
Button {
vm.draftJob.city = workCity
} label: {
Text(workCity).labelBG()
}
}
}
}
VStack(alignment: .leading) {
Text("工作地点").littleTStyle()
TextField("请填写完整工作地址", text: $vm.draftJob.placeName, axis: .vertical).tfStyle()
if !workPlaceName.isEmpty {
HStack(spacing: 3) {
Text("上次填的:").size13s()
Button {
vm.draftJob.placeName = workPlaceName
} label: {
Text(workPlaceName).labelBG()
}
}
}
}
// Button {
// workProvince = province
// workCity = city
// workProvince = province
// } label: {
// Text("")
// }.btnStyle()
//
}.padding().bg()
// MARK: -
VStack(alignment: .leading,spacing: kStackSpacing){
Text("联系方式/应聘方式").littleTStyle()
HStack {
Picker("联系方式种类", selection: $vm.draftJob.contactType) {
ForEach(kContactTypeArr, id: \.self) {Text($0)}
}.pStyle()
TextField("", text: $vm.draftJob.contact, axis: .vertical).tfStyle()
}
if !workContact.isEmpty {
HStack(spacing: 3) {
Text("上次填的:").size13s()
Button {
vm.draftJob.contact = workContact
} label: {
Text(workContact).labelBG()
}
}
}
Text("据调查99%的人才都喜欢使用微信联系").size13().red()
}.padding().bg()
// MARK: -
postBtn
//
// withAnimation {//withAnimation ->
// Button("") {
// scrollView.scrollTo("title",anchor: .top)//idtitleviewtopidtitleview
// }
// }
}.tc().bg2()
postBottomEView().bg()
}.navigationBarBackButtonHidden(isEditing).navigationBarTitleDisplayMode(.inline)
.toolbar {
if isEditing {
ToolbarItem(placement: .principal) { Text("编辑兼职").tc().bold() }
ToolbarItem(placement: .topBarLeading) {
Button {
if !naviPath.isEmpty {//
naviPath.removeLast()//
}
} label: {
Image(systemName: "chevron.left").secondary().padding(.horizontal,6)
}
}
}
}
.onAppear() {
self.scrollView = scrollView
}
}
}
}
#Preview {
PostPLJobIView(naviPath: .constant(NavigationPath()))
}