100Years пре 2 месеци
родитељ
комит
c639a50b30
27 измењених фајлова са 620 додато и 476 уклоњено
  1. 6 2
      TSLiveWallpaper.xcodeproj/project.pbxproj
  2. 22 0
      TSLiveWallpaper/Assets.xcassets/Common/generator_sensitive_error.imageset/Contents.json
  3. BIN
      TSLiveWallpaper/Assets.xcassets/Common/generator_sensitive_error.imageset/generator_sensitive_error@2x.png
  4. BIN
      TSLiveWallpaper/Assets.xcassets/Common/generator_sensitive_error.imageset/generator_sensitive_error@3x.png
  5. 22 0
      TSLiveWallpaper/Assets.xcassets/Common/text_toast_loading.imageset/Contents.json
  6. BIN
      TSLiveWallpaper/Assets.xcassets/Common/text_toast_loading.imageset/text_toast_loading@2x.png
  7. BIN
      TSLiveWallpaper/Assets.xcassets/Common/text_toast_loading.imageset/text_toast_loading@3x.png
  8. 22 0
      TSLiveWallpaper/Assets.xcassets/Vip/nav_vip.imageset/Contents.json
  9. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/nav_vip.imageset/nav_vip@2x.png
  10. BIN
      TSLiveWallpaper/Assets.xcassets/Vip/nav_vip.imageset/nav_vip@3x.png
  11. 2 2
      TSLiveWallpaper/Business/BusinessView/TSGeneratorView/TSGeneratorErrorView.swift
  12. 2 2
      TSLiveWallpaper/Business/BusinessView/TSGeneratorView/TSGeneratoringAnimationView.swift
  13. 26 0
      TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/TSAIListHistoryVC.swift
  14. 24 4
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift
  15. 16 18
      TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVM.swift
  16. 12 11
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIListPhotoGeneratorVC.swift
  17. 268 268
      TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIListPhotoGeneratorVM.swift
  18. 1 5
      TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift
  19. 9 5
      TSLiveWallpaper/Business/TSBootVC/TSBootVC.swift
  20. 0 99
      TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSViewTool/TSViewTool.swift
  21. 3 3
      TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift
  22. 46 44
      TSLiveWallpaper/Common/TSNetWork/TSNetWork+Business.swift
  23. 130 0
      TSLiveWallpaper/Common/ViewTool/TSTextToastView.swift
  24. 1 1
      TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBaseOperation.swift
  25. 2 2
      TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBasePhotoOperation.swift
  26. 5 9
      TSLiveWallpaper/Data/TSDBManager/TSDBManager.swift
  27. 1 1
      TSLiveWallpaper/Data/TSRealmManager/TSRealmManager.swift

+ 6 - 2
TSLiveWallpaper.xcodeproj/project.pbxproj

@@ -100,6 +100,7 @@
 		A86857D72DF983620089D222 /* generat_loading.gif in Resources */ = {isa = PBXBuildFile; fileRef = A86857D62DF983620089D222 /* generat_loading.gif */; };
 		A86857DA2DF994600089D222 /* TSAIPhotoDetailsVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86857D92DF9945F0089D222 /* TSAIPhotoDetailsVC.swift */; };
 		A86857DD2DF99C200089D222 /* TSImageIPanComparisonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86857DC2DF99C200089D222 /* TSImageIPanComparisonView.swift */; };
+		A895B5002E01370E004F9B85 /* TSTextToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A895B4FF2E01370E004F9B85 /* TSTextToastView.swift */; };
 		A8C4C0982D242154003C46FC /* LivePhoto.swift in Sources */ = {isa = PBXBuildFile; fileRef = A858EE162D1CF49B004B680F /* LivePhoto.swift */; };
 		A8C4C0A42D24218A003C46FC /* metadata.mov in Resources */ = {isa = PBXBuildFile; fileRef = A8C4C09E2D24218A003C46FC /* metadata.mov */; };
 		A8C4C0A52D24218A003C46FC /* Converter4Video.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C4C09B2D24218A003C46FC /* Converter4Video.swift */; };
@@ -245,6 +246,7 @@
 		A86857D62DF983620089D222 /* generat_loading.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = generat_loading.gif; sourceTree = "<group>"; };
 		A86857D92DF9945F0089D222 /* TSAIPhotoDetailsVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIPhotoDetailsVC.swift; sourceTree = "<group>"; };
 		A86857DC2DF99C200089D222 /* TSImageIPanComparisonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSImageIPanComparisonView.swift; sourceTree = "<group>"; };
+		A895B4FF2E01370E004F9B85 /* TSTextToastView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextToastView.swift; sourceTree = "<group>"; };
 		A8C4C0992D24218A003C46FC /* AVAssetExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVAssetExtension.swift; sourceTree = "<group>"; };
 		A8C4C09A2D24218A003C46FC /* Converter4Image.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Converter4Image.swift; sourceTree = "<group>"; };
 		A8C4C09B2D24218A003C46FC /* Converter4Video.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Converter4Video.swift; sourceTree = "<group>"; };
@@ -741,6 +743,7 @@
 		A86857A52DF920400089D222 /* ViewTool */ = {
 			isa = PBXGroup;
 			children = (
+				A895B4FF2E01370E004F9B85 /* TSTextToastView.swift */,
 				A86857A72DF9204B0089D222 /* TSPhotoPickerManager */,
 			);
 			path = ViewTool;
@@ -1124,6 +1127,7 @@
 				A8C4C0E62D268D02003C46FC /* LivePhotoCreater.swift in Sources */,
 				A8C4C0E72D268D02003C46FC /* VideoRecorder.swift in Sources */,
 				A8F76C4D2D3747B400AA6E93 /* TSPurchaseVC.swift in Sources */,
+				A895B5002E01370E004F9B85 /* TSTextToastView.swift in Sources */,
 				A81F5B5B2D1A5F2300740085 /* TSHomeTopBannerCell.swift in Sources */,
 				A83946312D1D66A000ABFF0D /* TSTermsServiceVC.swift in Sources */,
 				A8C4C0982D242154003C46FC /* LivePhoto.swift in Sources */,
@@ -1269,7 +1273,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
@@ -1309,7 +1313,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_APP_SANDBOX = NO;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;

+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Common/generator_sensitive_error.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "generator_sensitive_error@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "generator_sensitive_error@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Common/generator_sensitive_error.imageset/generator_sensitive_error@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Common/generator_sensitive_error.imageset/generator_sensitive_error@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Common/text_toast_loading.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "text_toast_loading@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "text_toast_loading@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Common/text_toast_loading.imageset/text_toast_loading@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Common/text_toast_loading.imageset/text_toast_loading@3x.png


+ 22 - 0
TSLiveWallpaper/Assets.xcassets/Vip/nav_vip.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "nav_vip@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "nav_vip@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
TSLiveWallpaper/Assets.xcassets/Vip/nav_vip.imageset/nav_vip@2x.png


BIN
TSLiveWallpaper/Assets.xcassets/Vip/nav_vip.imageset/nav_vip@3x.png


+ 2 - 2
TSLiveWallpaper/Business/BusinessView/TSGeneratorView/TSGeneratorErrorView.swift

@@ -42,7 +42,7 @@ class TSGeneratorErrorView: TSBaseView {
     }()
     
     lazy var submitBtn: UIButton = {
-        let btn = UIButton.createButton(title: "Generate in the background".localized,backgroundImage: kSubmitBtnNormalbg,font: .font(size: 14,weight: .medium),titleColor: UIColor.themeColor,corner: 24)
+        let btn = UIButton.createButton(title: "Process in the background".localized,backgroundImage: kSubmitBtnNormalbg,font: .font(size: 14,weight: .medium),titleColor: UIColor.themeColor,corner: 24)
         btn.titleLabel?.adjustsFontSizeToFitWidth = true
         btn.layer.borderColor = (UIColor.themeColor).cgColor
         btn.layer.borderWidth = 1.0
@@ -89,7 +89,7 @@ extension TSGeneratorErrorView {
     
     func sensitiveErrorView() {
         submitBtn.setTitle(isUploadImage ? "Reselect photos".localized : "Got it".localized, for: .normal)
-        errorImageView.image = UIImage(named: "generator_failed")
+        errorImageView.image = UIImage(named: "generator_sensitive_error")
         
 
         textLabel.text = "Your photo may contain nudity, gore or violence that does not comply with the health policy, please replace the photo and try again.".localized

+ 2 - 2
TSLiveWallpaper/Business/BusinessView/TSGeneratorView/TSGeneratoringAnimationView.swift

@@ -59,8 +59,8 @@ class TSGeneratoringAnimationView : TSBaseView {
         return textLabel
     }()
     
-    lazy var backgroundGenerateBtn: UIButton = {
-        let btn = UIButton.createButton(title: "Generate in the background".localized,backgroundImage: kSubmitBtnNormalbg,font: .font(size: 14,weight: .medium),titleColor: UIColor.themeColor,corner: 24)
+    lazy var backgroundGenerateBtn: UIButton = { 
+        let btn = UIButton.createButton(title: "Process in the background".localized,backgroundImage: kSubmitBtnNormalbg,font: .font(size: 14,weight: .medium),titleColor: UIColor.themeColor,corner: 24)
         btn.titleLabel?.adjustsFontSizeToFitWidth = true
         btn.layer.borderColor = (UIColor.themeColor).cgColor
         btn.layer.borderWidth = 1.0

+ 26 - 0
TSLiveWallpaper/Business/TSAIListVC/TSAIListHistoryVC/TSAIListHistoryVC.swift

@@ -11,6 +11,15 @@ class TSAIListHistoryVC: TSBaseVC {
 
     var listModelArray:[TSActionInfoModel] = []
     
+    //###################################### 导航栏 view ######################################
+    lazy var vipBtn: UIButton = {
+        let vipBtn = UIButton.createButton(image: UIImage(named: "nav_vip")) { [weak self] in
+            guard let self = self else { return }
+            TSPurchaseVC.show(target: self) {}
+        }
+        return vipBtn
+    }()
+    
     lazy var navBarView: TSBaseNavContentBarView = {
         let navBarView = TSBaseNavContentBarView()
 
@@ -20,6 +29,13 @@ class TSAIListHistoryVC: TSBaseVC {
            make.center.equalToSuperview()
         }
         
+        navBarView.barView.addSubview(vipBtn)
+        vipBtn.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.trailing.equalTo(-16)
+            make.width.height.equalTo(32)
+        }
+        
         kMainAsync {
             label.applyGradient(colors: ["#F1D3AB".uiColor,"#E4A858".uiColor])
         }
@@ -89,6 +105,9 @@ class TSAIListHistoryVC: TSBaseVC {
         updateDataView()
         NotificationCenter.default.addObserver(self, selector: #selector(operationChanged(_:)), name: .kGenerateBasePhotoOperation, object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(updateDataView), name: .kAIPhotoDataChanged, object: nil)
+        
+        NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
+        updateVipView()
     }
     
     @objc func operationChanged(_ notification: Notification) {
@@ -99,6 +118,12 @@ class TSAIListHistoryVC: TSBaseVC {
         }
     }
     
+    @objc func updateVipView() {
+        kMainAsync{
+            self.vipBtn.isHidden = PurchaseManager.default.isVip
+        }
+    }
+    
     @objc func updateDataView(){
         dbHistory.getModelList { [weak self] array in
             guard let self = self else { return }
@@ -109,6 +134,7 @@ class TSAIListHistoryVC: TSBaseVC {
 //        updateView()
     }
     
+
     func updateView() {
         collectionView.reloadData()
         

+ 24 - 4
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVC.swift

@@ -18,7 +18,14 @@ class TSAIListVC: TSBaseVC {
     }()
 
     //###################################### 导航栏 view ######################################
-
+    lazy var vipBtn: UIButton = {
+        let vipBtn = UIButton.createButton(image: UIImage(named: "nav_vip")) { [weak self] in
+            guard let self = self else { return }
+            TSPurchaseVC.show(target: self) {}
+        }
+        return vipBtn
+    }()
+    
     lazy var navBarView: TSBaseNavContentBarView = {
         let navBarView = TSBaseNavContentBarView()
 
@@ -28,6 +35,13 @@ class TSAIListVC: TSBaseVC {
            make.center.equalToSuperview()
         }
         
+        navBarView.barView.addSubview(vipBtn)
+        vipBtn.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.trailing.equalTo(-16)
+            make.width.height.equalTo(32)
+        }
+        
         kMainAsync {
             label.applyGradient(colors: ["#F1D3AB".uiColor,"#E4A858".uiColor])
         }
@@ -76,8 +90,8 @@ class TSAIListVC: TSBaseVC {
     }
     
     override func dealThings() {
-//        NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
-//        updateVipView()
+        NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
+        updateVipView()
     }
     
     override func viewWillAppear(_ animated: Bool) {
@@ -86,6 +100,12 @@ class TSAIListVC: TSBaseVC {
     override func viewWillDisappear(_ animated: Bool) {
         
     }
+    
+    @objc func updateVipView() {
+        kMainAsync{
+            self.vipBtn.isHidden = PurchaseManager.default.isVip
+        }
+    }
 }
 
 extension TSAIListVC: UICollectionViewDataSource ,UICollectionViewDelegate {
@@ -117,7 +137,7 @@ extension TSAIListVC: UICollectionViewDataSource ,UICollectionViewDelegate {
         if let sectionModel = dataArray.safeObj(At: indexPath.section),let itemModel = sectionModel.itemsArray.safeObj(At: indexPath.row){
             
             if TSGenerateBasePhotoOperationQueue.shared.isAvailability == false {
-                kSaveSuccesswShared.show(atView: self.view,text: "1 task is processing"){
+                kTextToastShared.show(atView: self.view,text: "1 task is processing"){
                     TSAIListHistoryVC.showPosition()
                 }
                 return

+ 16 - 18
TSLiveWallpaper/Business/TSAIListVC/TSAIListVC/TSAIListVM.swift

@@ -23,24 +23,7 @@ class TSAIListVM {
         var dataArray = [TSBasicSectionModel]()
         let sectionModel = TSBasicSectionModel()
         dataArray.append(sectionModel)
-        
-
-        
-        //照片高清修复
-        sectionModel.addSubItemModel(
-            createItemModel(
-                leftImageName:"aiList_Enhance",
-                leftTitle: "Enhance".localized,
-                leftSubTitle: "Remove blur, sharpen, add details".localized,
-                rightViewStyle: 0,
-                tapBlock: { [weak self] model, _, _ in
-                   guard let self = self else { return }
-                    enterSelectPhotos(style: .enhance) { image in
-                    let baseVc = TSAIUploadPhotoVC(titleString: model.leftTitle ?? "",upLoadImage: image, generatorStyle: .enhance)
-                        kPushVC(target: self.target, modelVC: baseVc)
-                    }
-        }))
-        
+    
         //黑白照片变颜色
         sectionModel.addSubItemModel(
             createItemModel(
@@ -71,6 +54,21 @@ class TSAIListVM {
                     }
         }))
         
+        //照片高清修复
+        sectionModel.addSubItemModel(
+            createItemModel(
+                leftImageName:"aiList_Enhance",
+                leftTitle: "Enhance".localized,
+                leftSubTitle: "Remove blur, sharpen, add details".localized,
+                rightViewStyle: 0,
+                tapBlock: { [weak self] model, _, _ in
+                   guard let self = self else { return }
+                    enterSelectPhotos(style: .enhance) { image in
+                    let baseVc = TSAIUploadPhotoVC(titleString: model.leftTitle ?? "",upLoadImage: image, generatorStyle: .enhance)
+                        kPushVC(target: self.target, modelVC: baseVc)
+                    }
+        }))
+        
         //修复和上色老照片
         sectionModel.addSubItemModel(
             createItemModel(

+ 12 - 11
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIListPhotoGeneratorVC.swift

@@ -42,7 +42,7 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
     init(generatorModel:TSAIListPhotoGeneratorModel,infoModel:TSActionInfoModel? = nil,complete:@escaping ((TSActionInfoModel)->Void)) {
         self.complete = complete
         self.generatorModel = generatorModel
-        self.viewModel = TSAIListPhotoGeneratorBaseVM(generatorModel: generatorModel)
+//        self.viewModel = TSAIListPhotoGeneratorBaseVM(generatorModel: generatorModel)
         super.init()
         self.infoModel = infoModel
     }
@@ -69,7 +69,7 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
         return false
     }
     
-    var viewModel: TSAIListPhotoGeneratorBaseVM!
+//    var viewModel: TSAIListPhotoGeneratorBaseVM!
 
     lazy var generateInView : TSGeneratorView = {
         let generateInView = TSGeneratorView()
@@ -132,14 +132,13 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
                     cancelAction: { [weak self]  in
                         guard let self = self else { return }
                         print("用户点击了Leave")
-                        viewModel.cancelAllRequest()
                         
                         if let model = infoModel{
                             TSRMShared.aiListDB.deleteListModel(id: model.id)
                             NotificationCenter.default.post(name: .kAIPhotoDataChanged, object: nil)
                         }
-                        
-                        self.dismiss(animated: true, completion: nil)
+            
+                        cancelDidmiss()
                     },
                     confirmAction: { [weak self]  in
                         guard let self = self else { return }
@@ -148,8 +147,7 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
                     }
                 ))
             }else{
-                viewModel.cancelAllRequest()
-                self.dismiss(animated: true, completion: nil)
+                cancelDidmiss()
             }
         }else{
             TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
@@ -166,8 +164,7 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
                 cancelAction: { [weak self]  in
                     guard let self = self else { return }
                     print("用户点击了Leave")
-                    viewModel.cancelAllRequest()
-                    self.dismiss(animated: true, completion: nil)
+                    cancelDidmiss()
                 },
                 confirmAction: {
                     print("用户点击了Stay")
@@ -175,7 +172,12 @@ class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
             ))
         }
     }
-    
+
+    func cancelDidmiss(){
+//        viewModel.cancelAllRequest()
+        operation?.cancel()
+        self.dismiss(animated: true, completion: nil)
+    }
     //重新生成
     @objc func clickRegenerateBtn(){
         //判断 vip
@@ -238,7 +240,6 @@ extension TSAIListPhotoGeneratorVC{
             guard let self = self else { return }
             if success {
                 generateInView.setBackgroundGenerateBtnHidden(false)
-                navRightBtn.isHidden = false
             }
         }
     }

+ 268 - 268
TSLiveWallpaper/Business/TSAIListVC/TSAIPhotoGeneratorVC/TSAIListPhotoGeneratorVM.swift

@@ -5,249 +5,249 @@
 //  Created by 100Years on 2025/6/11.
 //
 
-import Alamofire
+//import Alamofire
 
 
 
-let actionInfoDictVideo:[String:Any] = [
-    "actionType":"image_animation",
-    "comments": "Success",
-    "costTime":11,
-    "createdTimestamp":1744972580,
-    "id":32743,
-    "percent":1,
-    "request":"{\\\"imageUrl\\\": \\\"https://be-aigc.oss-cn-shanghai.aliyuncs.com/1981095e-b810-4eef-923b-5540350ae2d7.jpeg\\\", \\\"countryCode\\\": \\\"CN\\\", \\\"ip\\\": \\\"120.229.53.7\\\"}",
-    "response": "{\\\"resultUrl\\\": \\\"https://be-aigc.s3-accelerate.amazonaws.com/4e0da626-1de7-4c2e-9be2-3e6d0742a28e.mp4\\\"}",
-    "status":"success"
-]
-
-
-class TSAIListPhotoGeneratorBaseVM {
-    
-    var uploadRequest:Request?
-    var creatRequest:Request?
-    var queryRequest:Request?
-    var stopNetwork = false
-    
-    @Published var stateDatauPblished:(TSProgressState,TSActionInfoModel?) = (TSProgressState.none,nil)
-    
-    var imageUrl:String?
-    var imageUrls:[String]?
-    var generatorModel:TSAIListPhotoGeneratorModel
-    init(generatorModel:TSAIListPhotoGeneratorModel) {
-        self.generatorModel = generatorModel
-    }
-    
-    func uploadAndCreatImage() {
-        //上传多个图片
-        if let _ = generatorModel.upLoadImages {
-            uploadImagesAndCreat()
-            return
-        }
-        //上传单个图片
-        if let imageUrl = imageUrl,imageUrl.contains("http") {
-            creatImage()
-            return
-        }
-  
-        stopNetwork = false
-        stateDatauPblished = (.start,nil)
-        
-        stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),nil)
-        uploadRequest = TSNetworkShared.uploadImage(upLoadImage: generatorModel.upLoadImage, maxKb: generatorModel.generatorStyle.imageMaxKb) { [weak self]  progress in
-            guard let self = self else { return }
-          
-            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 = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
-            }else{
-                if let string = data as? String {
-                    imageUrl = string
-                    creatImage()
-                }
-            }
-        }
-    }
-    
-    private func uploadImagesAndCreat() {
-        
-        if let imageUrls = imageUrls{
-            creatImage()
-            return
-        }
-        guard let upLoadImages = generatorModel.upLoadImages else { return }
-        var uploadImageUrls:[String] = []
-        let progressRatio:Float = 1.0/Float(upLoadImages.count)//进度分割比例
-        var totalProgress:Float = 0.0//总进度
-        stopNetwork = false
-        stateDatauPblished = (.start,nil)
-        stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),nil)
-        
-        let group = DispatchGroup()
-        for image in upLoadImages {
-            group.enter()
-            uploadRequest = TSNetworkShared.uploadImage(upLoadImage: image, maxKb: generatorModel.generatorStyle.imageMaxKb) { [weak self]  progress in
-                guard let self = self else { return }
-                totalProgress+=progress*progressRatio
-                stateDatauPblished = (.progressString(uploadingPhoto(progress: totalProgress)),nil)
-            } completion: { [weak self]  data, error in
-                guard let self = self else { return }
-                if let error = error {
-                    self.imageUrls = nil
-                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
-                }else{
-                    if let string = data as? String {
-                        uploadImageUrls.append(string)
-                    }
-                }
-                group.leave()
-            }
-        }
-
-        group.notify(queue: .main) {
-            if uploadImageUrls.count == upLoadImages.count {
-                self.imageUrls = uploadImageUrls
-                self.imageUrl = ""
-                self.creatImage()
-            }
-        }
-    }
-    
-    
-    func creatImage() {
-        guard let imageUrl = imageUrl else { return }
-        stopNetwork = false
-        stateDatauPblished = (.start,nil)
-        stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
-        
-        var urlType:TSNeURLType = .imageRewrite
-        var postDict:[String:Any] = [
-            "device":getUserInfoJsonString(),
-            "imageUrl":imageUrl,
-            "model": generatorModel.generatorStyle.aiModel
-        ]
-        switch generatorModel.generatorStyle {
-        case .enhance:
-            urlType = .imageRewrite
-            postDict["prompt"] = "把图片变清晰"
-        case .colorize:
-            urlType = .imageRewrite
-            postDict["prompt"] = "Add suitable colors to photos"
-        case .descratch:
-            urlType = .imageRewrite
-            postDict["prompt"] = "Remove the photo's scratches and dirt"
-        case .enlighten:
-            urlType = .imageRewrite
-            postDict["prompt"] = "Adjust the light and darkness of the photo to make the overall look coordinated"
-            
-        case .recreate:
-            urlType = .imageRewrite
-            postDict["prompt"] = "Recreate damaged portraits and added suitable color for photo"
-        }
-        
-        creatRequest = TSNetworkShared.post(urlType: urlType,parameters: postDict) { [weak self] data,error in
-            guard let self = self else { return }
-            
-            if let dataDict = kNetWorkCodeSuccess(data: data),
-               let actionId = dataDict["actionId"] as? Int{
-                if stopNetwork == false {
-                    self.getActionInfo(action_id:actionId)
-                }
-            }else{
-                if let error = error {
-                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
-                }else{
-                    self.stateDatauPblished = (.generalNormalFailed,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(string:genmojiModel.response.resultUrl) {
-//                            if generatorModel.generatorStyle == .photoLive {
-//                                downloadVideo(urlString: genmojiModel.response.resultUrl) { url in
-//                                    if let url = url {
-//                                        
-//                                        genmojiModel.videoPath = url.path.documentLastURLString
-//                                        if let videoImage = kGetVideoThumbnail(from: url) {
-//                                            let imageSavePath = url.deletingPathExtension().path + ".jpeg"
-//                                            videoImage.saveToFile(at:URL(fileURLWithPath:imageSavePath))
-//                                            genmojiModel.videoThumbnailPath = imageSavePath.documentLastURLString
-//                                        }
+//let actionInfoDictVideo:[String:Any] = [
+//    "actionType":"image_animation",
+//    "comments": "Success",
+//    "costTime":11,
+//    "createdTimestamp":1744972580,
+//    "id":32743,
+//    "percent":1,
+//    "request":"{\\\"imageUrl\\\": \\\"https://be-aigc.oss-cn-shanghai.aliyuncs.com/1981095e-b810-4eef-923b-5540350ae2d7.jpeg\\\", \\\"countryCode\\\": \\\"CN\\\", \\\"ip\\\": \\\"120.229.53.7\\\"}",
+//    "response": "{\\\"resultUrl\\\": \\\"https://be-aigc.s3-accelerate.amazonaws.com/4e0da626-1de7-4c2e-9be2-3e6d0742a28e.mp4\\\"}",
+//    "status":"success"
+//]
+//
 //
-//                                        self.stateDatauPblished = (.success(nil),genmojiModel)
-//                                    }else{
-//                                        self.stateDatauPblished = (.generalNormalFailed,nil)
-//                                    }
-//                                }
-//                            }else {
-                            
-                            let group = DispatchGroup()
+//class TSAIListPhotoGeneratorBaseVM {
+//    
+//    var uploadRequest:Request?
+//    var creatRequest:Request?
+//    var queryRequest:Request?
+//    var stopNetwork = false
+//    
+//    @Published var stateDatauPblished:(TSProgressState,TSActionInfoModel?) = (TSProgressState.none,nil)
+//    
+//    var imageUrl:String?
+//    var imageUrls:[String]?
+//    var generatorModel:TSAIListPhotoGeneratorModel
+//    init(generatorModel:TSAIListPhotoGeneratorModel) {
+//        self.generatorModel = generatorModel
+//    }
+//    
+//    func uploadAndCreatImage() {
+//        //上传多个图片
+//        if let _ = generatorModel.upLoadImages {
+//            uploadImagesAndCreat()
+//            return
+//        }
+//        //上传单个图片
+//        if let imageUrl = imageUrl,imageUrl.contains("http") {
+//            creatImage()
+//            return
+//        }
+//  
+//        stopNetwork = false
+//        stateDatauPblished = (.start,nil)
+//        
+//        stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),nil)
+//        uploadRequest = TSNetworkShared.uploadImage(upLoadImage: generatorModel.upLoadImage, maxKb: generatorModel.generatorStyle.imageMaxKb) { [weak self]  progress in
+//            guard let self = self else { return }
+//          
+//            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 = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+//            }else{
+//                if let string = data as? String {
+//                    imageUrl = string
+//                    creatImage()
+//                }
+//            }
+//        }
+//    }
+//    
+//    private func uploadImagesAndCreat() {
+//        
+//        if let imageUrls = imageUrls{
+//            creatImage()
+//            return
+//        }
+//        guard let upLoadImages = generatorModel.upLoadImages else { return }
+//        var uploadImageUrls:[String] = []
+//        let progressRatio:Float = 1.0/Float(upLoadImages.count)//进度分割比例
+//        var totalProgress:Float = 0.0//总进度
+//        stopNetwork = false
+//        stateDatauPblished = (.start,nil)
+//        stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),nil)
+//        
+//        let group = DispatchGroup()
+//        for image in upLoadImages {
+//            group.enter()
+//            uploadRequest = TSNetworkShared.uploadImage(upLoadImage: image, maxKb: generatorModel.generatorStyle.imageMaxKb) { [weak self]  progress in
+//                guard let self = self else { return }
+//                totalProgress+=progress*progressRatio
+//                stateDatauPblished = (.progressString(uploadingPhoto(progress: totalProgress)),nil)
+//            } completion: { [weak self]  data, error in
+//                guard let self = self else { return }
+//                if let error = error {
+//                    self.imageUrls = nil
+//                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+//                }else{
+//                    if let string = data as? String {
+//                        uploadImageUrls.append(string)
+//                    }
+//                }
+//                group.leave()
+//            }
+//        }
+//
+//        group.notify(queue: .main) {
+//            if uploadImageUrls.count == upLoadImages.count {
+//                self.imageUrls = uploadImageUrls
+//                self.imageUrl = ""
+//                self.creatImage()
+//            }
+//        }
+//    }
+//    
+//    
+//    func creatImage() {
+//        guard let imageUrl = imageUrl else { return }
+//        stopNetwork = false
+//        stateDatauPblished = (.start,nil)
+//        stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
+//        
+//        var urlType:TSNeURLType = .imageRewrite
+//        var postDict:[String:Any] = [
+//            "device":getUserInfoJsonString(),
+//            "imageUrl":imageUrl,
+//            "model": generatorModel.generatorStyle.aiModel
+//        ]
+//        switch generatorModel.generatorStyle {
+//        case .enhance:
+//            urlType = .imageRewrite
+//            postDict["prompt"] = "把图片变清晰"
+//        case .colorize:
+//            urlType = .imageRewrite
+//            postDict["prompt"] = "Add suitable colors to photos"
+//        case .descratch:
+//            urlType = .imageRewrite
+//            postDict["prompt"] = "Remove the photo's scratches and dirt"
+//        case .enlighten:
+//            urlType = .imageRewrite
+//            postDict["prompt"] = "Adjust the light and darkness of the photo to make the overall look coordinated"
+//            
+//        case .recreate:
+//            urlType = .imageRewrite
+//            postDict["prompt"] = "Recreate damaged portraits and added suitable color for photo"
+//        }
+//        
+//        creatRequest = TSNetworkShared.post(urlType: urlType,parameters: postDict) { [weak self] data,error in
+//            guard let self = self else { return }
+//            
+//            if let dataDict = kNetWorkCodeSuccess(data: data),
+//               let actionId = dataDict["actionId"] as? Int{
+//                if stopNetwork == false {
+//                    self.getActionInfo(action_id:actionId)
+//                }
+//            }else{
+//                if let error = error {
+//                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+//                }else{
+//                    self.stateDatauPblished = (.generalNormalFailed,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(string:genmojiModel.response.resultUrl) {
+////                            if generatorModel.generatorStyle == .photoLive {
+////                                downloadVideo(urlString: genmojiModel.response.resultUrl) { url in
+////                                    if let url = url {
+////                                        
+////                                        genmojiModel.videoPath = url.path.documentLastURLString
+////                                        if let videoImage = kGetVideoThumbnail(from: url) {
+////                                            let imageSavePath = url.deletingPathExtension().path + ".jpeg"
+////                                            videoImage.saveToFile(at:URL(fileURLWithPath:imageSavePath))
+////                                            genmojiModel.videoThumbnailPath = imageSavePath.documentLastURLString
+////                                        }
+////
+////                                        self.stateDatauPblished = (.success(nil),genmojiModel)
+////                                    }else{
+////                                        self.stateDatauPblished = (.generalNormalFailed,nil)
+////                                    }
+////                                }
+////                            }else {
+//                            
+//                            let group = DispatchGroup()
+////                            group.enter()
+////                            downloadImage(urlString: genmojiModel.request.imageUrl) {
+////                                group.leave()
+////                            }
+//                            
+//                            TSImageStoreTool.storeImage(image: generatorModel.upLoadImage, urlString: genmojiModel.request.imageUrl)
+//                            
 //                            group.enter()
-//                            downloadImage(urlString: genmojiModel.request.imageUrl) {
+//                            downloadImage(urlString: genmojiModel.response.resultUrl) {
 //                                group.leave()
 //                            }
-                            
-                            TSImageStoreTool.storeImage(image: generatorModel.upLoadImage, urlString: genmojiModel.request.imageUrl)
-                            
-                            group.enter()
-                            downloadImage(urlString: genmojiModel.response.resultUrl) {
-                                group.leave()
-                            }
-                
-                            group.notify(queue: .main) {
-                                self.stateDatauPblished = (.success(nil),genmojiModel)
-                            }
-                            
+//                
+//                            group.notify(queue: .main) {
+//                                self.stateDatauPblished = (.success(nil),genmojiModel)
 //                            }
-                        }else{
-                            self.stateDatauPblished = (.success(nil),genmojiModel)
-                        }
-                        
-                    case .failed:
-                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg,genmojiModel.response.code),nil)
-                    default:
-                        stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
-                        if stopNetwork == false {
-                            kDelayOnMainThread(1.0) {
-                                self.getActionInfo(action_id: action_id)
-                            }
-                        }
-                    }
-                }
-            }else{
-                if let error = error {
-                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
-                }else{
-                    self.stateDatauPblished = (.generalNormalFailed,nil)
-                }
-            }
-        }
-    }
-    
-    func downloadImage(urlString:String,completion:@escaping ()->Void){
-        TSImageStoreTool.downloadImageWithProgress(urlString: urlString) { [weak self]  progress in
-            guard let self = self else { return }
-    
-            let progressInt = Int(progress*10.0)
-            let progressString = generatingText + " \(90 + progressInt)%"
-            stateDatauPblished = (.progressString(progressString),nil)
-            dePrint("生成后图片下载进度: \(progress)")
-        } completion: { image in
-            completion()
-        }
-    }
+//                            
+////                            }
+//                        }else{
+//                            self.stateDatauPblished = (.success(nil),genmojiModel)
+//                        }
+//                        
+//                    case .failed:
+//                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg,genmojiModel.response.code),nil)
+//                    default:
+//                        stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
+//                        if stopNetwork == false {
+//                            kDelayOnMainThread(1.0) {
+//                                self.getActionInfo(action_id: action_id)
+//                            }
+//                        }
+//                    }
+//                }
+//            }else{
+//                if let error = error {
+//                    self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
+//                }else{
+//                    self.stateDatauPblished = (.generalNormalFailed,nil)
+//                }
+//            }
+//        }
+//    }
+//    
+//    func downloadImage(urlString:String,completion:@escaping ()->Void){
+//        TSImageStoreTool.downloadImageWithProgress(urlString: urlString) { [weak self]  progress in
+//            guard let self = self else { return }
+//    
+//            let progressInt = Int(progress*10.0)
+//            let progressString = generatingText + " \(90 + progressInt)%"
+//            stateDatauPblished = (.progressString(progressString),nil)
+//            dePrint("生成后图片下载进度: \(progress)")
+//        } completion: { image in
+//            completion()
+//        }
+//    }
     
 //    func downloadVideo(urlString:String,completion:@escaping (URL?)->Void){
 //        TSDownloadManager.getDownLoadVideo(urlString: urlString) { progress in
@@ -259,36 +259,36 @@ class TSAIListPhotoGeneratorBaseVM {
 //            completion(url)
 //        }
 //    }
-    
-    func cancelAllRequest(){
-        creatRequest?.cancel()
-        queryRequest?.cancel()
-        stopNetwork = true
-    }
- 
-    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 generating(progress:Float) -> String {
-        let progress = progress*(0.9) // 预留 10% 进度给图片下载
-        //Processing 0%-100%
-        var progressInt = Int(progress*100)
-
-        if progressInt > 99 {
-            progressInt = 99
-        }
-        
-        return generatingText + " \(progressInt)%"
-    }
-    
-    
-    var generatingText:String{
-        return "Processing".localized
-    }
-}
+//    
+//    func cancelAllRequest(){
+//        creatRequest?.cancel()
+//        queryRequest?.cancel()
+//        stopNetwork = true
+//    }
+// 
+//    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 generating(progress:Float) -> String {
+//        let progress = progress*(0.9) // 预留 10% 进度给图片下载
+//        //Processing 0%-100%
+//        var progressInt = Int(progress*100)
+//
+//        if progressInt > 99 {
+//            progressInt = 99
+//        }
+//        
+//        return generatingText + " \(progressInt)%"
+//    }
+//    
+//    
+//    var generatingText:String{
+//        return "Processing".localized
+//    }
+//}

+ 1 - 5
TSLiveWallpaper/Business/TSAIListVC/TSAIUploadPhotoVC/TSAIUploadPhotoVC.swift

@@ -317,11 +317,7 @@ extension TSAIUploadPhotoVC {
 //        if generatorStyle != .catTohuman {
             additionalPrompt = ""
 //        }
-        let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)){ [weak self] model in
-            guard let self = self else { return }
-            model.generateStyle = self.generatorStyle.rawValue
-            TSRMShared.aiListDB.updateData(model)
-        }
+        let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)){ model in }
         
         
         gennerateVC.backstageBlock = { [weak self]  in

+ 9 - 5
TSLiveWallpaper/Business/TSBootVC/TSBootVC.swift

@@ -48,12 +48,16 @@ class TSBootVC: TSBaseVC {
     var currentIndex:Int = 0{
         didSet{
             if dataArray.count > 0 {
-                
-                if currentIndex >= dataArray.count {
-                    closeComplete()
-                    return
+                if currentIndex < dataArray.count {
+                    self.collectionView.scrollToItem(at: IndexPath(item: currentIndex, section: 0), at: .centeredHorizontally, animated: true)
+                }else{
+                    let vc = TSPurchaseVC()
+                    vc.closePageBlock = { [weak self]  in
+                        guard let self = self else { return }
+                        closeComplete()
+                    }
+                    self.navigationController?.pushViewController(vc, animated: false)
                 }
-                self.collectionView.scrollToItem(at: IndexPath(item: currentIndex, section: 0), at: .centeredHorizontally, animated: true)
             }
         }
     }

+ 0 - 99
TSLiveWallpaper/Business/TSPurchaseMembershipVC/TSViewTool/TSViewTool.swift

@@ -58,102 +58,3 @@ class TSViewTool: UIView {
 
 let kWapppaperPlaceholderImage = UIImage(named: "wapppaper_placeholder")
 let KIconLiveImage = UIImage(named: "icon_live")
-
-//let kSaveSuccesswShared = TSSavePhotoSuccessTool.shared
-//class TSSavePhotoSuccessTool {
-//    
-//    static let shared = TSSavePhotoSuccessTool()
-//    
-//    private lazy var textLabel:UILabel = {
-//        let textLabel = UILabel()
-//        textLabel.textColor = "#4A5178".uiColor
-//        textLabel.text = "Save Successfully".localized
-//        textLabel.font = UIFont.font(size: 14)
-//        return textLabel
-//    }()
-//    
-//    private lazy var saveSuccessBg: UIView = {
-//        return creatSaveSuccessBg()
-//    }()
-//    
-//    func creatSaveSuccessBg() -> UIView {
-//        let view = UIView()
-//        view.frame = CGRect(x: 0, y: 0, width: 288, height: 48)
-//        // 阴影
-//        view.backgroundColor = .clear
-//        view.layer.shadowColor = UIColor.black.cgColor
-//        view.layer.shadowOffset = CGSize(width: 0, height: 2)
-//        view.layer.shadowOpacity = 0.1
-//        
-//        // 圆角
-//        let colorBg = UIView()
-//        colorBg.backgroundColor = .white
-//        colorBg.layer.cornerRadius = 8
-//        colorBg.layer.masksToBounds = true
-//        colorBg.clipsToBounds = true
-//        
-//        view.addSubview(colorBg)
-//        colorBg.snp.makeConstraints { make in
-//            make.leading.trailing.top.bottom.equalTo(0)
-//        }
-//        
-//        let image = UIImage(named: "success_icon")
-//        let iconView = UIImageView(image: image)
-//        view.addSubview(iconView)
-//        iconView.snp.makeConstraints { make in
-//            make.width.height.equalTo(24)
-//            make.centerY.equalToSuperview()
-//            make.leading.equalTo(12)
-//        }
-//    
-//
-//        view.addSubview(textLabel)
-//        
-//        let viewButton = UIButton.createButton(title: "View".localized ,backgroundColor: "4FEA9D".toColor()?.withAlphaComponent(0.2),font: UIFont.font(size: 14),titleColor: "4FEA9D".toColor(),corner: 14) {
-//            if let url = URL(string: "photos-redirect://") {
-//                if UIApplication.shared.canOpenURL(url) {
-//                    UIApplication.shared.open(url, options: [:], completionHandler: nil)
-//                    playVibration()
-//                }
-//            }
-//        }
-//        view.addSubview(viewButton)
-//        
-//        viewButton.snp.makeConstraints { make in
-//            make.width.equalTo(65)
-//            make.height.equalTo(28)
-//            make.trailing.equalTo(-8)
-//            make.centerY.equalToSuperview()
-//        }
-//        
-//        textLabel.snp.makeConstraints { make in
-//            make.leading.equalTo(iconView.snp.trailing).offset(8)
-//            make.trailing.equalTo(viewButton.snp.leading).offset(-4)
-//            make.centerY.equalToSuperview()
-//        }
-//
-//        return view
-//    }
-//
-//    
-//    
-//    func show(atView:UIView,text:String = "Save Successfully".localized) {
-//        
-//        kMainAsync {
-//            self.textLabel.text = text
-//            atView.addSubview(self.saveSuccessBg)
-//            self.saveSuccessBg.snp.remakeConstraints { make in
-//                make.width.equalTo(288)
-//                make.height.equalTo(48)
-//                make.centerX.equalToSuperview()
-//                make.top.equalTo(k_Height_statusBar()+56.0)
-//            }
-//        }
-//
-//        DispatchQueue.main.asyncAfter(deadline: .now()+5.0) {
-//            self.saveSuccessBg.removeFromSuperview()
-//        }
-//    }
-//    
-//    
-//}

+ 3 - 3
TSLiveWallpaper/Common/Purchase/TSPurchaseManager.swift

@@ -75,9 +75,9 @@ public class PurchaseManager: NSObject {
     }
 
     @objc public var isVip: Bool {
-//        #if DEBUG
-//        return true
-//        #endif
+        #if DEBUG
+        return true
+        #endif
         guard let expiresDate = expiredDate else {
             return false
         }

+ 46 - 44
TSLiveWallpaper/Common/TSNetWork/TSNetWork+Business.swift

@@ -11,29 +11,29 @@ private let baseChinaURL = "http://ai.100yearslater100.com"
 import Alamofire
 enum TSNeURLType:String {
     
-    case imageEmoji = "/api/image/emoji"         //文生emoji
+//    case imageEmoji = "/api/image/emoji"         //文生emoji
     case actionInfo = "/api/action/info"         //查询生成过程接口
-    case chat = "/api/text/chat"                 //AI 对话接口
-    case textPicCreate = "/api/image/create"     //文生图
+//    case chat = "/api/text/chat"                 //AI 对话接口
+//    case textPicCreate = "/api/image/create"     //文生图
     case upload = "/api/upload"                  //上传图片
     case imageRewrite = "/api/image/rewrite"     //图生图
-    case imageToImageStyle = "/api/ops/aichat-img2img-config"     //图生图 风格列表
-    case chatV2 = "/api/text/chat/v2"             //AI 对话接口V2,扩展了 DeepSeek 深度思考
-    
-    case config = "/api/ops/aichat-config"       //App配置
-    
-    case changeAge = "/api/image/change-age"       //换年龄
-    case subscriptionApple = "/api/subscription/apple"       //苹果订阅
-    case changeEmotion = "/api/image/change-emotion"       //更换表情
-    case changeHair = "/api/image/change-hair"       //更换头发
-    case imageRestore = "/api/image/restore"          //老照片修复
-    case eyeOpen = "/api/image/eye-open"          //睁眼
-    case pretty = "/api/image/pretty"          //美容
-    case photoAnimation = "/api/image/animation"          //照片变活
-    case photoExpand = "/api/image/outpaint"          //照片扩展
-    
-    case overResolution = "/api/image/over-resolution"          //图片超分辨率
-    case changeClothes = "/api/image/change-clothes"          //换衣服
+//    case imageToImageStyle = "/api/ops/aichat-img2img-config"     //图生图 风格列表
+//    case chatV2 = "/api/text/chat/v2"             //AI 对话接口V2,扩展了 DeepSeek 深度思考
+//    
+//    case config = "/api/ops/aichat-config"       //App配置
+//    
+//    case changeAge = "/api/image/change-age"       //换年龄
+//    case subscriptionApple = "/api/subscription/apple"       //苹果订阅
+//    case changeEmotion = "/api/image/change-emotion"       //更换表情
+//    case changeHair = "/api/image/change-hair"       //更换头发
+//    case imageRestore = "/api/image/restore"          //老照片修复
+//    case eyeOpen = "/api/image/eye-open"          //睁眼
+//    case pretty = "/api/image/pretty"          //美容
+//    case photoAnimation = "/api/image/animation"          //照片变活
+//    case photoExpand = "/api/image/outpaint"          //照片扩展
+//    
+//    case overResolution = "/api/image/over-resolution"          //图片超分辨率
+//    case changeClothes = "/api/image/change-clothes"          //换衣服
 
     
     func getUrlString() -> String {
@@ -50,20 +50,22 @@ enum TSNeURLType:String {
     
     ///需要进行次数验证的接口
     var validateURLTypeList : [TSNeURLType] {
-        [.textPicCreate,
-         .upload,
-         .imageRewrite,
-         .changeAge,
-         .subscriptionApple,
-         .changeEmotion,
-         .changeHair,
-         .imageRestore,
-         .eyeOpen,
-         .pretty,
-         .photoAnimation,
-         .photoExpand,
-         .overResolution,
-         .changeClothes]
+        [
+//            .textPicCreate,
+            .upload,
+            .imageRewrite,
+//         .changeAge,
+//         .subscriptionApple,
+//         .changeEmotion,
+//         .changeHair,
+//         .imageRestore,
+//         .eyeOpen,
+//         .pretty,
+//         .photoAnimation,
+//         .photoExpand,
+//         .overResolution,
+//         .changeClothes
+        ]
     }
 }
 
@@ -142,8 +144,8 @@ enum TSNetWorkCode : Int {
             return TSGeneratorView.Style.sensitiveError
         case .networkError:
             return TSGeneratorView.Style.netWorkError
-        case .generateTooMuch:
-            return TSGeneratorView.Style.generateTooMuch
+//        case .generateTooMuch:
+//            return TSGeneratorView.Style.generateTooMuch
         default:
             return TSGeneratorView.Style.generalError
         }
@@ -247,10 +249,10 @@ extension TSNetworkManager {
         completion: @escaping (Result<Any, Error>) -> Void
     ) -> Request? {
         ///需要校验。且需要判断是否超过最大次数
-        if urlType.needValidate,kPurchaseBusiness.isOverTotalTimes {
-            completion(.failure(NSError(domain: "", code: TSNetWorkCode.generateTooMuch.rawValue)))
-            return nil
-        }
+//        if urlType.needValidate,kPurchaseBusiness.isOverTotalTimes {
+//            completion(.failure(NSError(domain: "", code: TSNetWorkCode.generateTooMuch.rawValue)))
+//            return nil
+//        }
         
         let urlString = urlType.getUrlString()
         return request(method: .post, urlString: urlString, parameters:parameters) { result in
@@ -338,10 +340,10 @@ extension TSNetworkManager {
     -> Request?{
         
         ///需要校验。且需要判断是否超过最大次数
-        if kPurchaseBusiness.isOverTotalTimes {
-            completion(nil,NSError(domain: "", code: TSNetWorkCode.generateTooMuch.rawValue))
-            return nil
-        }
+//        if kPurchaseBusiness.isOverTotalTimes {
+//            completion(nil,NSError(domain: "", code: TSNetWorkCode.generateTooMuch.rawValue))
+//            return nil
+//        }
         
         guard let imageData = TSImageCompress.compressImageToTargetSize(upLoadImage, targetSizeKB: maxKb, preserveTransparency: false) else {
             completion(nil,NSError(domain: "image nil", code: 0))

+ 130 - 0
TSLiveWallpaper/Common/ViewTool/TSTextToastView.swift

@@ -0,0 +1,130 @@
+//
+//  TSTextToastView.swift
+//  TSLiveWallpaper
+//
+//  Created by 100Years on 2025/6/16.
+//
+
+
+public let kTextToastShared = TSTextToastView.shared
+open class TSTextToastView {
+    
+    static let shared = TSTextToastView()
+    
+    public var clickViewHandle:(()->Void)?
+    
+    private lazy var textLabel:UILabel = {
+        let textLabel = UILabel()
+        textLabel.textColor = UIColor.white
+        textLabel.text = "Save Successfully".localized
+        textLabel.font = UIFont.font(size: 14)
+        return textLabel
+    }()
+    
+    private lazy var saveSuccessBg: UIView = {
+        return creatSaveSuccessBg()
+    }()
+    
+    lazy var loadingView: UIImageView = {
+        let loadingView = UIImageView.createImageView(image:.textToastLoading)
+        return loadingView
+    }()
+    
+    
+    private lazy var viewButton:UIView = {
+        let color = "#DFD7C0".uiColor
+        let viewButton = UIButton.createButton(title: "View".localized ,backgroundColor: color.withAlphaComponent(0.2),font: UIFont.font(size: 12),titleColor: color,corner: 14) { [weak self]  in
+            guard let self = self else { return }
+            if let clickViewHandle = clickViewHandle {
+                clickViewHandle()
+            }
+            
+            DispatchQueue.main.async{
+                self.saveSuccessBg.removeFromSuperview()
+                self.loadingView.stopRotating()
+            }
+        }
+        viewButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)
+        return viewButton
+    }()
+    
+    func creatSaveSuccessBg() -> UIView {
+        let view = UIView()
+        view.frame = CGRect(x: 0, y: 0, width: 288, height: 48)
+        // 阴影
+        view.backgroundColor = .clear
+        view.layer.shadowColor = UIColor.black.cgColor
+        view.layer.shadowOffset = CGSize(width: 0, height: 2)
+        view.layer.shadowOpacity = 0.1
+        
+        // 圆角
+        let colorBg = UIView()
+        colorBg.backgroundColor = "#333333".uiColor
+        colorBg.layer.cornerRadius = 8
+        colorBg.layer.masksToBounds = true
+        colorBg.clipsToBounds = true
+        
+        view.addSubview(colorBg)
+        colorBg.snp.makeConstraints { make in
+            make.leading.trailing.top.bottom.equalTo(0)
+        }
+        
+        view.addSubview(loadingView)
+        view.addSubview(viewButton)
+        view.addSubview(textLabel)
+        
+        loadingView.snp.makeConstraints { make in
+            make.width.height.equalTo(24)
+            make.centerY.equalToSuperview()
+            make.leading.equalTo(12)
+        }
+        
+        viewButton.snp.makeConstraints { make in
+            make.width.equalTo(viewButton.intrinsicContentSize.width)
+            make.height.equalTo(28)
+            make.trailing.equalTo(-8)
+            make.centerY.equalToSuperview()
+        }
+    
+        textLabel.snp.makeConstraints { make in
+            make.leading.equalTo(loadingView.snp.trailing).offset(8)
+            make.trailing.equalTo(viewButton.snp.leading).offset(-8)
+            make.centerY.equalToSuperview()
+        }
+        
+        return view
+    }
+
+    
+    
+    public func getBottom(topY:CGFloat)->CGFloat{
+        let bottom = -(k_ScreenHeight - 48 - topY)
+        debugPrint("bottom=\(bottom)")
+        return bottom
+    }
+    
+    public func show(atView:UIView,text:String = "Process successfully".localized,deadline:Double = 5.0,bottom:CGFloat = -112,showViewBtn:Bool = true,clickViewHandle:(()->Void)? = nil) {
+        self.clickViewHandle = clickViewHandle
+        kExecuteOnMainThread {
+            self.textLabel.text = text
+            self.viewButton.isHidden = !showViewBtn
+            atView.addSubview(self.saveSuccessBg)
+            self.saveSuccessBg.snp.remakeConstraints { make in
+                make.width.greaterThanOrEqualTo(288)
+                make.width.lessThanOrEqualTo(k_ScreenWidth-32)
+                make.height.equalTo(48)
+                make.centerX.equalToSuperview()
+                make.top.equalTo(k_Nav_Height + 10)
+            }
+            
+            self.loadingView.startRotating()
+        }
+
+        DispatchQueue.main.asyncAfter(deadline: .now() + deadline) {
+            self.saveSuccessBg.removeFromSuperview()
+            self.loadingView.stopRotating()
+        }
+    }
+    
+    
+}

+ 1 - 1
TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBaseOperation.swift

@@ -92,7 +92,7 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
             }
         }
     }
-    
+
     var currentActionInfoModelChanged:((TSActionInfoModel)->Void)?
     @Published var currentActionInfoModel: TSActionInfoModel = TSActionInfoModel()
     

+ 2 - 2
TSLiveWallpaper/Data/OperationQueue/TSGenerateBaseOperation/TSGenerateBasePhotoOperation.swift

@@ -64,7 +64,7 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
             currentActionInfoModel.generateStyle = generateStyleModel.generatorStyle.rawValue
         }
 
-        TSRMShared.aiListDB.updateData(currentActionInfoModel,id: currentActionInfoModel.id)
+        TSRMShared.aiListDB.updateData(currentActionInfoModel,uuid: uuid)
     }
     override func handleGenerateSuccess() {
 //        kPurchaseBusiness.useOnceForFree(type: .general)
@@ -93,7 +93,7 @@ class TSGenerateBasePhotoOperation: TSGenerateBaseOperation , @unchecked Sendabl
         if let cyModel = copyModel as? TSActionInfoModel {
             let topY = k_Nav_Height+10
             debugPrint("topY=\(topY)")
-            kSaveSuccesswShared.show(atView: window,text: "Successfully generated".localized,deadline: 5.0) {
+            kSaveSuccesswShared.show(atView: window,text: "Process successfully".localized,deadline: 5.0) {
                 let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: UIImage(), generatorStyle: cyModel.request.generatorStyle),infoModel: cyModel) { model in }
                 gennerateVC.modalPresentationStyle = .overFullScreen
                 gennerateVC.modalTransitionStyle = .crossDissolve

+ 5 - 9
TSLiveWallpaper/Data/TSDBManager/TSDBManager.swift

@@ -107,23 +107,19 @@ class TSDBHistory: Object {
     }
 
     
-    func updateData(_ actionInfoModel:TSActionInfoModel,id:Int? = nil){
+    func updateData(_ actionInfoModel:TSActionInfoModel,uuid:String? = nil){
         let dbModel = TSDBActionInfoModel.createDBModel(actionInfoModel: actionInfoModel)
-            var replaceID = dbModel.id
-            if let id = id {
-                replaceID = id
-            }
-            
+            var replaceUUID = uuid ?? dbModel.uuid
             let frozenList = self.listModels.freeze()
-            if let index = frozenList.firstIndex(where: { $0.id == replaceID }) {
+            if let index = frozenList.firstIndex(where: { $0.uuid == replaceUUID }) {
+                dePrint("updateData 替换 \(dbModel)")
                 TSRMShared.writeThread {
                     listModels[index] = dbModel// 如果找到,替换该元素
                 }
             } else {
-                print("Thread.current insert1=\(Thread.current)")
                 TSRMShared.writeThread {
+                    dePrint("updateData 插入 \(dbModel)")
                     listModels.insert(dbModel, at: 0)// 如果没有找到,添加到末尾
-                    print("Thread.current insert2=\(Thread.current)")
                 }
             }
     }

+ 1 - 1
TSLiveWallpaper/Data/TSRealmManager/TSRealmManager.swift

@@ -25,7 +25,7 @@ class TSRealmManager {
          3.6.1 ->4
          **/
    
-        let newSchemaVersion: UInt64 = 5
+        let newSchemaVersion: UInt64 = 6
         // 获取默认配置
         var config = Realm.Configuration.defaultConfiguration
         // 设置新版本号