123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- //
- // TSAIChangeEmoteVM.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/4/10.
- //
- import ObjectMapper
- import Alamofire
- class TSAIChangeEmoteVM {
-
- //###################################### 样式选择 ######################################
- var selectedStyleIndex:Int = 0
- lazy var selectStyleModels: [TSGenerateStyleModel] = {
- var selectStyleModels = [TSGenerateStyleModel]()
- if let dataArray = Mapper<TSGenerateStyleModel>().mapArray(JSONfile: "ai_change_emote_style.json"){
- selectStyleModels = dataArray
-
- if let model = dataArray.safeObj(At: selectedStyleIndex) {
- selectStyleModel = model //加上默认的选择
- }
- }
-
- return selectStyleModels
- }()
-
- var selectStyleModel:TSGenerateStyleModel?
-
- var isSavePhotoMark:Bool = false
- var isNeedSavePhoto:Bool {
- if isSavePhotoMark == false{
- for model in selectStyleModels {
- if let _ = model.actionInfoModel {
- return true
- }
- }
- }
- return false
- }
- //###################################### 生成图片 ######################################
- var uploadRequest:Request?
- var creatRequest:Request?
- var queryRequest:Request?
- var stopNetwork = false
-
- @Published var stateDatauPblished:(TSProgressState,TSActionInfoModel?) = (TSProgressState.none,nil)
- var aiText:String = ""
- var generatingProgress = 0
-
- var upLoadImage:UIImage?{
- didSet{
- imageUrl = nil
- isSavePhotoMark = false
- for model in selectStyleModels {
- model.actionInfoModel = nil
- }
- }
- }
- var imageUrl:String?
- }
- extension TSAIChangeEmoteVM {
-
- func creatImage() {
- guard let imageUrl = imageUrl else { return }
- guard let selectStyleModel = selectStyleModel else { return }
-
- generatingProgress = 0
- stopNetwork = false
- stateDatauPblished = (.start,nil)
- stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
-
- let postDict = ["emotionType":selectStyleModel.style,
- "imageUrl":imageUrl,
- "device":getUserInfoJsonString()]
-
- creatRequest = TSNetworkShared.post(urlType: .changeEmotion,parameters:postDict) { [weak self] data,error in
- guard let self = self else { return }
-
- if let dataDict = data as? [String:Any] ,
- dataDict.safeInt(forKey: "code") == 200,
- let actionId = dataDict["actionId"] as? Int{
- if stopNetwork == false {
- self.getActionInfo(action_id:actionId)
- }
- }else{
- self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
- }
- }
- }
-
- func getActionInfo(action_id:Int){
- queryRequest = TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { [weak self] data,error in
- guard let self = self else { return }
- if let result = kNetWorkResultSuccess(data: data) {
- if let genmojiModel = TSActionInfoModel(JSON: result) {
- switch genmojiModel.actionStatus {
- case .success:
- if let url = URL(string:genmojiModel.response.resultUrl) {
- UIImageView.downloadImageWithProgress(url: url) { [weak self] progress in
- guard let self = self else { return }
-
- let progressInt = Int(progress*10.0)
- let progressString = "Changing".localized + " \(90 + progressInt)%"
- stateDatauPblished = (.progressString(progressString),nil)
- dePrint("生成后图片下载进度 \(progress)")
- } completion: {[weak self] image in
- guard let self = self else { return }
- self.stateDatauPblished = (.success(nil),genmojiModel)
- self.selectStyleModel?.actionInfoModel = genmojiModel
- generatingProgress = 0
- }
- }else{
- self.stateDatauPblished = (.success(nil),genmojiModel)
- self.selectStyleModel?.actionInfoModel = genmojiModel
- generatingProgress = 0
- }
-
- case .failed:
- self.stateDatauPblished = (.failed(kNetWorkMessage(data: data) ?? ""),nil)
- generatingProgress = 0
- default:
- stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
- if stopNetwork == false {
- kDelayOnMainThread(1.0) {
- self.getActionInfo(action_id: action_id)
- }
- }
- }
- }
- }else{
- self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
- }
- }
- }
-
- func cancelAllRequest(){
- creatRequest?.cancel()
- queryRequest?.cancel()
- stopNetwork = true
- }
-
-
- func generating(progress:Float) -> String {
- let progress = progress*(0.9) // 预留 10% 进度给图片下载
- //Generating 0%-100%
- var progressInt = Int(progress*100)
- if progressInt > 99 {
- progressInt = 99
- }
-
- generatingProgress = progressInt
- return "Changing".localized + " \(progressInt)%"
- }
-
-
- func uploadAndCreatImage() {
-
- if let model = selectStyleModel?.actionInfoModel {
- self.stateDatauPblished = (.success(nil),model)
- return
- }
-
- if let imageUrl = imageUrl,imageUrl.contains("http") {
- creatImage()
- return
- }
-
- stopNetwork = false
- stateDatauPblished = (.start,nil)
-
- stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),nil)
- uploadImage { [weak self] progress in
- guard let self = self else { return }
- if generatingProgress == 0 {
- stateDatauPblished = (.progressString(uploadingPhoto(progress: progress)),nil)
- }
- } completion: { [weak self] data, error in
- guard let self = self else { return }
- if let error = error {
- imageUrl = nil
- self.stateDatauPblished = (.failed(error.localizedDescription),nil)
- }else{
- if let string = data as? String {
- imageUrl = string
- creatImage()
- }
- }
- }
- }
-
- func uploadingPhoto(progress:Float) -> String {
- //Uploading Photo 0%-100%
- var progressInt = Int(progress*100)
- if progressInt > 99 {
- progressInt = 99
- }
- return "Uploading Photo".localized + " \(progressInt)%"
- }
-
- func uploadImage(
- progressHandler: @escaping (Float) -> Void, // 上传进度回调
- completion: @escaping (Any?, Error?) -> Void)
- {
- guard let imageData = upLoadImage?.pngData() else { return }
- stateDatauPblished = (.start,nil)
- let dataArray = [
- ["data": imageData,
- "fieldName": "file", // 字段名
- "fileName": "image.png", // 文件名
- "mimeType": "image/png" // MIME 类型
- ]
- ]
-
- uploadRequest = TSNetworkShared.uploadData(
- urlType: .upload,
- dataArray: dataArray,
- progressHandler: { progress in
- progressHandler(progress)
- },completion: { [weak self] result in
- guard let self = self else { return }
- switch result {
- case .success(let data):
- if let dataDict = data as? [String:Any] ,
- dataDict.safeInt(forKey: "code") == 200,
- let picUrl = dataDict["result"] as? String{
- completion(picUrl,nil)
- }else{
- let error = NSError(domain: "Service exception", code: 0)
- completion(nil,error)
- }
- case .failure(let error):
- completion(nil,error)
- }
- })
- }
-
- }
|