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

160 lines
5.1 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.

//
// ProfileViewModel.swift
// IOS_study
//
// Created by CC-star on 2025/7/15.
//
import PhotosUI
import SwiftUI
@Observable final class ProfileViewModel {
var viewDidLoad = false
//user
var user = DBUser()
var userID: String { user.id }
var draftUser = DBUser()
var isFcUser = false
var isCompanyImagesLoaded = false
var isPostingCompany = false
//
var plJobs: [PLJob] = []
var aPLJobsCount = 0
var pLJobsCount = 0
var isFcPLJobs = false
var shouldRefreshMyPLJobs = false
//
var currentPLPage = 0
var isPLFinshed = false
//
var isFcSome: Bool { isFcUser || isFcPLJobs }
@MainActor func getUsersData() async throws {
try await getUser()
async let getPLJobs: () = getPLJobs(isRefresh: true)
async let getPLJobsCount: () = getPLJobsCount()
let _ = await (getPLJobs, getPLJobsCount)
}
@MainActor func refreshIFNeed() async throws {
if shouldRefreshMyPLJobs {
async let getPLJobs: () = getPLJobs(isRefresh: true)
async let getPLJobsCount: () = getPLJobsCount()
let _ = await (getPLJobs, getPLJobsCount)
shouldRefreshMyPLJobs = false
}
}
var logoUIImage: UIImage?// -> nil
var logoImageErrorMsg = ""
var logoItem: PhotosPickerItem? {
didSet {
//guard let logoItem -> guard let logoItem = logoItem
guard let logoItem else { return }
Task {
//item
if let data = try? await logoItem.loadTransferable(type: Data.self), let uiImage = UIImage(data: data) {
logoImageErrorMsg = ""
logoUIImage = uiImage
} else {
print("PhotosPickerItem转换成图片失败")
logoImageErrorMsg = "上传图片失败,请重新上传"
}
self.logoItem = nil
}
}
}
var isLoadingCompanyImages = false
var companyUIImages: [UIImage] = []
var companyUIImagesErrorMsg = ""
var companyItems: [PhotosPickerItem] = [] {
didSet {
if companyItems.isEmpty { return }
Task { @MainActor in
isLoadingCompanyImages = true
defer {
isLoadingCompanyImages = false
}
var newImages: [UIImage] = []
for item in companyItems {
if let data = try? await item.loadTransferable(type: Data.self), let uiImage = UIImage(data: data) {
newImages.append(uiImage)
}
}
companyUIImages.append(contentsOf: newImages)
if newImages.count == companyItems.count {
companyUIImagesErrorMsg = ""
} else {
companyUIImagesErrorMsg = "有图片上传失败,请重新上传"
}
companyItems.removeAll()
}
}
}
@MainActor func loadCompanyLogoAndIamges() async {
isCompanyImagesLoaded = false
if !user.cLogoURLStr.isEmpty {
if let url = URL(string: user.cLogoURLStr),
let (data, _) = try? await URLSession.shared.data(from: url),
let uiImage = UIImage(data: data) {
logoUIImage = uiImage
}
}
if !user.cImageURLStrs.isEmpty {
var newImages: [UIImage] = []
for cImageURLStr in user.cImageURLStrs {
if let url = URL(string: cImageURLStr),
let (data, _) = try? await URLSession.shared.data(from: url),
let uiImage = UIImage(data: data) {
newImages.append(uiImage)
}
}
companyUIImages = newImages
}
isCompanyImagesLoaded = true
}
@MainActor func postCompany() async throws {
user = draftUser
//()
user.cName = user.cName.trimmed
user.cCity = user.cCity.trimmed
//
if user.cAboutUS.isBlank {
user.cAboutUS = ""
} else {
user.cAboutUS = user.cAboutUS.trimmed
}
//async let withThrowingTaskGroup
async let logoURLStr: String? = {//
guard let logoUIImage else { return nil }
return try await StorageManager.shared.saveImage(logoUIImage)
}()
if !companyUIImages.isEmpty {
let companyImageResults = try await withThrowingTaskGroup(of:((Int, String).self)) { group in
for (index, uiImage) in companyUIImages.enumerated() {
group.addTask {
let urlStr = try await StorageManager.shared.saveImage(uiImage)
return (index, urlStr)
}
}
var results: [(Int, String)] = []
for try await result in group {
results.append(result)
}
return results
}
user.cImageURLStrs = companyImageResults.sorted(by: { $0.0 < $1.0 }).map { $0.1 }
}
if let clogoURLStr = try await logoURLStr {
user.cLogoURLStr = clogoURLStr
}
try await UserManager.shared.update(user: user)
}
}