// // PLJobView.swift // IOS_study // // Created by CC-star on 2025/6/13. // import SwiftUI import Photos struct PLJobView: View { var canEdit = false var showBoss = true @Environment(HUD.self) var hud @Environment(PLJobViewModel.self) var vm @Environment(ProfileViewModel.self) var profileVM @Environment(AuthViewModel.self) var authVM @Environment(ReviewViewModel.self) var reviewVM @Environment(\.displayScale) var displayScale//获取屏幕分辨率 @State var showActiveDialog = false//是否上/下线 @State var showRemoveDialog = false//是否移除 @State var showRemoveAlert = false//移除警告 @State var saveImage: UIImage? @State var openSetting = false @State var viewDidLoad = false @State var showReportDialog = false @State var showPostReview = false @Binding var naviPath : NavigationPath var job: PLJob { vm.job } var isActive:Bool{ vm.job.isActive } var titleAD: String { isActive ? "" : "[已下线]" } var isIng: Bool { vm.isRemoving || vm.isToggling } var shareImage: Image? { if let saveImage { return Image(uiImage: saveImage) } else { return nil } } var body: some View { List { tilteView//头部视图 if showBoss { companyView }//公司视图 detailView//工作详情 contactView//应聘电话 goRevireBtn listBottomEView() }.listStyle().navigationTitle("长期兼职").navigationBarTitleDisplayMode(.inline).navigationBarBackButtonHidden() //顶部返回键 .toolbar { ToolbarItem(placement: .topBarLeading) { Button { if !naviPath.isEmpty {//检查是否为最后一页 naviPath.removeLast()//返回上一页 } } label: { Image(systemName: "chevron.left").secondary().padding(.horizontal,6) } } ToolbarItem(placement: .topBarTrailing) { HStack(spacing: 3) { if !canEdit { Button("举报") { showReportDialog = true } .confirmationDialog("确定举报吗?", isPresented: $showReportDialog, titleVisibility: .visible) { Button("确定") { Task { await report() } } Button("取消", role: .cancel) { } } } Button { Task { await saveImageToAlbum() } } label: { Text("保存") } if let shareImage { ShareLink(item: shareImage, preview: SharePreview("以长图形式分享", image: shareImage)) { Text("分享") } } }.tc2().size15() } } .alert("请允许保存图片权限", isPresented: $openSetting) { Button("再想想") { openSetting = false } Button("去设置") { if let url = URL(string: UIApplication.openSettingsURLString), UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url) } } } message: { Text("请重新设置照片权限") } .sheet(isPresented: $showPostReview, content: { PostReviewView() }) .onAppear { if !viewDidLoad { Task { generateSnapshot() } viewDidLoad = true } } } var shareView: some View { VStack(spacing: 0) { Text("招兼职").size18b() tilteView//头部视图 companyView //公司视图 detailView//工作详情 contactView//应聘电话 listBottomEView() Text("\(kAppName)App").accent().bold().padding() }.padding(.top, 60).padding(.bottom, 30) .frame(width: UIScreen.main.bounds.size.width)//按照用户的手机屏幕来得到宽度 .bg2() } @MainActor func generateSnapshot() { let renderer = ImageRenderer(content: shareView) renderer.scale = displayScale saveImage = renderer.uiImage } @MainActor func saveImageToAlbum() async { if let saveImage { let currenStatus = PHPhotoLibrary.authorizationStatus(for: .addOnly) if currenStatus == .notDetermined {//未申请过权限 let status = await PHPhotoLibrary.requestAuthorization(for: .addOnly)//添加只向相册添加相片的权限 if status == .authorized {//第一次同意 writeToAlbum(saveImage) } else if currenStatus == .authorized {//之前同意过 writeToAlbum(saveImage) } else { openSetting = true } } else { hud.show("相片保存失败,请退出本页后重试") } } } func writeToAlbum(_ saveImage: UIImage) { UIImageWriteToSavedPhotosAlbum(saveImage, nil, nil, nil); hud.show("相片保存成功,请返回相册查看") } // MARK: - 举报 func report() async { var reports = (UserDefaults.standard.array(forKey: jobReportsKey) as? [String]) ?? [] if reports.contains(job.id) { hud.show("已举报,会尽快处理") } else { let userID = AuthManager.shared.getUserID() if !userID.isEmpty { if reports.count > 50 { reports.removeAll() } do { try await JobReportManger.shared.save(report: JobReport(jobID: job.id, jobType: "兼职", jobTitle: job.title, bossID: job.userID, userID: userID)) reports.append(job.id) UserDefaults.standard.set(reports, forKey: jobReportsKey) hud.show("举报成功,请等候处理") } catch { print("举报失败:\(error)") hud.show("举报失败,请检查网络") } } else { hud.show("请先登录") } } } }