Browse Source

AI 生成页面完成初步的 UI调整 搭建

100Years 3 weeks ago
parent
commit
ed793596d1
27 changed files with 439 additions and 271 deletions
  1. 12 8
      AIEmoji.xcodeproj/project.pbxproj
  2. 22 0
      AIEmoji/Assets.xcassets/Common/network_error.imageset/Contents.json
  3. BIN
      AIEmoji/Assets.xcassets/Common/network_error.imageset/network_error@2x.png
  4. BIN
      AIEmoji/Assets.xcassets/Common/network_error.imageset/network_error@3x.png
  5. 22 0
      AIEmoji/Assets.xcassets/Common/yellow_warning.imageset/Contents.json
  6. BIN
      AIEmoji/Assets.xcassets/Common/yellow_warning.imageset/yellow_warning@2x.png
  7. BIN
      AIEmoji/Assets.xcassets/Common/yellow_warning.imageset/yellow_warning@3x.png
  8. 3 3
      AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+SendMsg.swift
  9. 1 1
      AIEmoji/Business/AIChat/TSChatViewController/Views/TSTextMessageContentCell.swift
  10. 3 3
      AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/TSAIChangeEmoteVC.swift
  11. 5 5
      AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/ViewModel/TSAIChangeEmoteVM.swift
  12. 4 5
      AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIListPhotoGeneratorBaseVC.swift
  13. 5 5
      AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift
  14. 1 1
      AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateVC.swift
  15. 13 9
      AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateViewModel.swift
  16. 5 7
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/TSPTPGeneratorVC.swift
  17. 6 6
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/VM/TSPTPGeneratorVM.swift
  18. 4 5
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift
  19. 4 4
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift
  20. 67 13
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorErrorView.swift
  21. 65 0
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorFailView.swift
  22. 148 0
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratoringAnimationView.swift
  23. 47 187
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorloadingView.swift
  24. 0 7
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/Untitled.swift
  25. 1 1
      AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGenerateBaseOperation.swift
  26. 1 1
      AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGeneratePosterOperation.swift
  27. 0 0
      AIEmoji/Res/rotatingAnimation_1.gif

+ 12 - 8
AIEmoji.xcodeproj/project.pbxproj

@@ -95,10 +95,11 @@
 		A80EDE002D6EFD22003CD332 /* TSPhotoPickerManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80EDDFF2D6EFD20003CD332 /* TSPhotoPickerManager.swift */; };
 		A80EDE022D6F1CCD003CD332 /* TSPTPGeneratorVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80EDE012D6F1CCB003CD332 /* TSPTPGeneratorVC.swift */; };
 		A80EDE062D6F3491003CD332 /* TSPTPBrowseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80EDE052D6F3490003CD332 /* TSPTPBrowseVC.swift */; };
-		A80EDE082D700395003CD332 /* rotatingAnimation.gif in Resources */ = {isa = PBXBuildFile; fileRef = A80EDE072D700395003CD332 /* rotatingAnimation.gif */; };
+		A80EDE082D700395003CD332 /* rotatingAnimation_1.gif in Resources */ = {isa = PBXBuildFile; fileRef = A80EDE072D700395003CD332 /* rotatingAnimation_1.gif */; };
 		A81BECA32DD1EA1E005D06A2 /* TSGeneratorErrorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BECA22DD1EA18005D06A2 /* TSGeneratorErrorView.swift */; };
 		A81BECA62DD1EFAF005D06A2 /* TSGeneratorloadingContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BECA52DD1EF9E005D06A2 /* TSGeneratorloadingContentView.swift */; };
-		A81BECA82DD1F075005D06A2 /* Untitled.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BECA72DD1F071005D06A2 /* Untitled.swift */; };
+		A81BECA82DD1F075005D06A2 /* TSGeneratoringAnimationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BECA72DD1F071005D06A2 /* TSGeneratoringAnimationView.swift */; };
+		A81BECAA2DD1FA44005D06A2 /* TSGeneratorFailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81BECA92DD1FA38005D06A2 /* TSGeneratorFailView.swift */; };
 		A82D60792DB7703D00596190 /* TSAIExpandImageVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82D60782DB7703C00596190 /* TSAIExpandImageVC.swift */; };
 		A82D607B2DB7724700596190 /* TSAIExpandStyleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82D607A2DB7724600596190 /* TSAIExpandStyleView.swift */; };
 		A82D607D2DB7748800596190 /* ai_expand_image_style.json in Resources */ = {isa = PBXBuildFile; fileRef = A82D607C2DB7748200596190 /* ai_expand_image_style.json */; };
@@ -360,10 +361,11 @@
 		A80EDDFF2D6EFD20003CD332 /* TSPhotoPickerManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPhotoPickerManager.swift; sourceTree = "<group>"; };
 		A80EDE012D6F1CCB003CD332 /* TSPTPGeneratorVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPTPGeneratorVC.swift; sourceTree = "<group>"; };
 		A80EDE052D6F3490003CD332 /* TSPTPBrowseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPTPBrowseVC.swift; sourceTree = "<group>"; };
-		A80EDE072D700395003CD332 /* rotatingAnimation.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = rotatingAnimation.gif; sourceTree = "<group>"; };
+		A80EDE072D700395003CD332 /* rotatingAnimation_1.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = rotatingAnimation_1.gif; sourceTree = "<group>"; };
 		A81BECA22DD1EA18005D06A2 /* TSGeneratorErrorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneratorErrorView.swift; sourceTree = "<group>"; };
 		A81BECA52DD1EF9E005D06A2 /* TSGeneratorloadingContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneratorloadingContentView.swift; sourceTree = "<group>"; };
-		A81BECA72DD1F071005D06A2 /* Untitled.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Untitled.swift; sourceTree = "<group>"; };
+		A81BECA72DD1F071005D06A2 /* TSGeneratoringAnimationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneratoringAnimationView.swift; sourceTree = "<group>"; };
+		A81BECA92DD1FA38005D06A2 /* TSGeneratorFailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSGeneratorFailView.swift; sourceTree = "<group>"; };
 		A82D60782DB7703C00596190 /* TSAIExpandImageVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIExpandImageVC.swift; sourceTree = "<group>"; };
 		A82D607A2DB7724600596190 /* TSAIExpandStyleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIExpandStyleView.swift; sourceTree = "<group>"; };
 		A82D607C2DB7748200596190 /* ai_expand_image_style.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = ai_expand_image_style.json; sourceTree = "<group>"; };
@@ -1172,9 +1174,10 @@
 			isa = PBXGroup;
 			children = (
 				A83404D22D9D23CA00C140E4 /* TSGeneratorloadingView.swift */,
-				A81BECA72DD1F071005D06A2 /* Untitled.swift */,
+				A81BECA72DD1F071005D06A2 /* TSGeneratoringAnimationView.swift */,
 				A81BECA52DD1EF9E005D06A2 /* TSGeneratorloadingContentView.swift */,
 				A81BECA22DD1EA18005D06A2 /* TSGeneratorErrorView.swift */,
+				A81BECA92DD1FA38005D06A2 /* TSGeneratorFailView.swift */,
 			);
 			path = TSGeneratorloadingView;
 			sourceTree = "<group>";
@@ -2010,7 +2013,7 @@
 				A8FDB17F2DCC8C5600E9919B /* catPaw_left.gif */,
 				A8FDB1802DCC8C5600E9919B /* catPaw_right.gif */,
 				A82D60802DB7A1E600596190 /* activePhoto.gif */,
-				A80EDE072D700395003CD332 /* rotatingAnimation.gif */,
+				A80EDE072D700395003CD332 /* rotatingAnimation_1.gif */,
 				A89EA6972D5B19F0000EB181 /* Butterfly🦋.json */,
 				A80E723E2D3F4D3000C64288 /* Universe🌍.json */,
 				A80E723B2D3F4CA700C64288 /* Food🍔.json */,
@@ -2151,7 +2154,7 @@
 				A83404DB2D9D382200C140E4 /* AccentURW-Reg.ttf in Resources */,
 				A82D607D2DB7748800596190 /* ai_expand_image_style.json in Resources */,
 				A8F413642DAA6F8C001E715A /* ai_change_hair_style.json in Resources */,
-				A80EDE082D700395003CD332 /* rotatingAnimation.gif in Resources */,
+				A80EDE082D700395003CD332 /* rotatingAnimation_1.gif in Resources */,
 				A83404FE2DA35BFE00C140E4 /* Localizable.strings in Resources */,
 				A8FB02D12D3E6B2A0031A396 /* Cat🐱.json in Resources */,
 				A80E72462D3F4EED00C64288 /* sticker.json in Resources */,
@@ -2308,6 +2311,7 @@
 				A8F776452D3DE8A800AA6E93 /* TSSmallIconBrowseVC.swift in Sources */,
 				A88508B62DBF142B000FBCEC /* TSGennertatorSelectStyleVC.swift in Sources */,
 				A80E72632D40925000C64288 /* TSDiyKeyboardVM.swift in Sources */,
+				A81BECAA2DD1FA44005D06A2 /* TSGeneratorFailView.swift in Sources */,
 				A8F775432D39346400AA6E93 /* TSSetingModel.swift in Sources */,
 				A89EA6BA2D5DDE5B000EB181 /* TSPageNullView.swift in Sources */,
 				A89EA6C12D5ED289000EB181 /* TSChatCellConfig.swift in Sources */,
@@ -2381,7 +2385,7 @@
 				A89EA67A2D59D25F000EB181 /* TSAIChatVM.swift in Sources */,
 				A80EDDF02D6EC045003CD332 /* TSPTPStyleModel.swift in Sources */,
 				A85E47BE2D68999B0018D62D /* ShareActivityItemProvider.swift in Sources */,
-				A81BECA82DD1F075005D06A2 /* Untitled.swift in Sources */,
+				A81BECA82DD1F075005D06A2 /* TSGeneratoringAnimationView.swift in Sources */,
 				A8F7763C2D3B429B00AA6E93 /* TSCommonloadingView.swift in Sources */,
 				A8BA76752DA67E66000B6707 /* TSAIListHistoryBaseVC.swift in Sources */,
 				A8F776322D3A771400AA6E93 /* TSGenmojiCollectionViewModel.swift in Sources */,

+ 22 - 0
AIEmoji/Assets.xcassets/Common/network_error.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Common/network_error.imageset/network_error@2x.png


BIN
AIEmoji/Assets.xcassets/Common/network_error.imageset/network_error@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Common/yellow_warning.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Common/yellow_warning.imageset/yellow_warning@2x.png


BIN
AIEmoji/Assets.xcassets/Common/yellow_warning.imageset/yellow_warning@3x.png


+ 3 - 3
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+SendMsg.swift

@@ -100,10 +100,10 @@ extension TSChatViewController {
             guard let self = self else { return }
             if let _ = data {
                 message.sendState = .success("netData")
-//                message.sendState = .failed(kAIErrorString)
+//                message.sendState = TSProgressState.getFailed(kAIErrorString)
 //                kPurchaseDefault.useOnceForFree(type: .aichat)//消耗一次 AI 次数
             }else {
-                message.sendState = .failed(kAIErrorString)
+                message.sendState = TSProgressState.getFailed(kAIErrorString)
                 if viewModel.AiMDString.count == 0 {
                     viewModel.AiMDString = kAIErrorString
                     message.kind = .attributedText(kMDAttributedString(text: viewModel.AiMDString))
@@ -215,7 +215,7 @@ extension TSChatViewController{
             if let _ = data {
                 message.sendState = .success("netData")
             }else {
-                message.sendState = .failed(kAIErrorString)
+                message.sendState = TSProgressState.getFailed(kAIErrorString)
                 if viewModel.AiMDString.count == 0 {
                     viewModel.AiMDString = kAIErrorString
                     message.kind = .attributedText(kMDAttributedString(text: viewModel.AiMDString))

+ 1 - 1
AIEmoji/Business/AIChat/TSChatViewController/Views/TSTextMessageContentCell.swift

@@ -96,7 +96,7 @@ class TSTextMessageContentCell: TSMessageContentCell {
                 stopAnimating()
             case .success(_):
                 stopAnimating()
-            case .failed(_):
+            case .failed(_,_):
                 stopAnimating()
             default:
                 stopAnimating()

+ 3 - 3
AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/TSAIChangeEmoteVC.swift

@@ -81,8 +81,8 @@ class TSAIChangeEmoteVC: TSBaseVC {
         return switchOriginalPictureBtn
     }()
     
-    lazy var generateInView : TSGeneratorloadingView = {
-        let generateInView = TSGeneratorloadingView()
+    lazy var generateInView : TSGeneratorView = {
+        let generateInView = TSGeneratorView()
         generateInView.setBackgroundColor(color: UIColor.black.withAlphaComponent(0.8))
         generateInView.isHidden = true
         generateInView.regenerateBtn.addTarget(self, action: #selector(uploadAndCreatImage), for: .touchUpInside)
@@ -255,7 +255,7 @@ extension TSAIChangeEmoteVC {
 extension TSAIChangeEmoteVC {
     func upDateView(state:TSProgressState,model:TSActionInfoModel?){
         switch state {
-            case .failed(let errorStr):
+            case .failed(let errorStr,let code):
                 showError(text: errorStr)
             case .success:
                 if let model = model {

+ 5 - 5
AIEmoji/Business/TSAILIstVC/TSAIChangeEmoteVC/ViewModel/TSAIChangeEmoteVM.swift

@@ -114,7 +114,7 @@ extension TSAIChangeEmoteVM {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error?.localizedDescription ?? ""),nil)
             }
         }
     }
@@ -148,7 +148,7 @@ extension TSAIChangeEmoteVM {
                         }
                         
                     case .failed:
-                        self.stateDatauPblished = (.failed(kNetWorkMessage(data: data) ?? ""),nil)
+                        self.stateDatauPblished = (TSProgressState.getFailed(kNetWorkMessage(data: data) ?? ""),nil)
                         generatingProgress = 0
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
@@ -160,7 +160,7 @@ extension TSAIChangeEmoteVM {
                     }
                 }
             }else{
-                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error?.localizedDescription ?? ""),nil)
             }
         }
     }
@@ -210,7 +210,7 @@ extension TSAIChangeEmoteVM {
 //                let infoModel = TSActionInfoModel(JSON:actionInfoDictPoster )
 //                self.stateDatauPblished = (.success(nil),infoModel)
 //            }else{
-//                self.stateDatauPblished = (.failed("error?.localizedDescription"),nil)
+//                self.stateDatauPblished = (TSProgressState.getFailed("error?.localizedDescription"),nil)
 //            }
 //        }
 //
@@ -243,7 +243,7 @@ extension TSAIChangeEmoteVM {
             guard let self = self else { return }
             if let error = error {
                 imageUrl = nil
-                self.stateDatauPblished = (.failed(error.localizedDescription),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error.localizedDescription),nil)
             }else{
                 if let string = data as? String {
                     imageUrl = string

+ 4 - 5
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIListPhotoGeneratorBaseVC.swift

@@ -52,10 +52,9 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
     var videoPlayerVC: TSAIListVideoPlayerVC = TSAIListVideoPlayerVC(videoURL: URL(string: "www.baidu.com")!)
   
 
-    lazy var generateInView : TSGeneratorloadingView = {
-        let generateInView = TSGeneratorloadingView()
-        generateInView.timeLabel.text = String(format: "~ %d min".localized, 2)
-        generateInView.infoLabel.text = "It is definitely worth your wait. Just watch it".localized
+    lazy var generateInView : TSGeneratorView = {
+        let generateInView = TSGeneratorView()
+        generateInView.animationView.setText(time: String(format: "~ %d min".localized, 2), info: "It is definitely worth your wait. Just watch it".localized)
         return generateInView
     }()
     
@@ -241,7 +240,7 @@ extension TSAIListPhotoGeneratorBaseVC {
     func upDateView(state:TSProgressState,model:TSActionInfoModel?){
         progressState = state
         switch state {
-            case .failed(let errorStr):
+            case .failed(let errorStr,let code):
                 showError(text: errorStr)
             case .success:
                 if let model = model {

+ 5 - 5
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift

@@ -87,7 +87,7 @@ class TSAIListPhotoGeneratorBaseVM {
             guard let self = self else { return }
             if let error = error {
                 imageUrl = nil
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
             }else{
                 if let string = data as? String {
                     imageUrl = string
@@ -180,7 +180,7 @@ class TSAIListPhotoGeneratorBaseVM {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
             }
         }
     }
@@ -207,7 +207,7 @@ class TSAIListPhotoGeneratorBaseVM {
                                         self.stateDatauPblished = (.success(nil),genmojiModel)
                                         self.generatingProgress = 0
                                     }else{
-                                        self.stateDatauPblished = (.failed(""),nil)
+                                        self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
                                         self.generatingProgress = 0
                                     }
                                 }
@@ -224,7 +224,7 @@ class TSAIListPhotoGeneratorBaseVM {
                         }
                         
                     case .failed:
-                        self.stateDatauPblished = (.failed(genmojiModel.response.codeErrorMsg),nil)
+                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg),nil)
                         generatingProgress = 0
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
@@ -236,7 +236,7 @@ class TSAIListPhotoGeneratorBaseVM {
                     }
                 }
             }else{
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
             }
         }
     }

+ 1 - 1
AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateVC.swift

@@ -129,7 +129,7 @@ extension TSGenmojiGennerateVC {
     func upDateView(state:TSProgressState,model:TSActionInfoModel?){
         progressState = state
         switch state {
-            case .failed(let errorStr):
+            case .failed(let errorStr,let code):
                 showError(text: errorStr)
             case .success:
                 if let model = model {

+ 13 - 9
AIEmoji/Business/TSGenmojiVC/TSGenmojiGennerateVC/TSGenmojiGennerateViewModel.swift

@@ -14,7 +14,7 @@ enum TSProgressState  {
     case progress(CGFloat)
     case progressString(String)
     case success(Any?)
-    case failed(String)
+    case failed(String,Int)
 
     static func fromKeyValue(key string: String,value:String) -> TSProgressState {
         if string == "none" {
@@ -34,7 +34,7 @@ enum TSProgressState  {
         }else if string == "success" {
             return .success(value)
         }else if string == "failed" {
-            return .failed(value)
+            return .failed(value,0)
         }else{
             return .none
         }
@@ -57,7 +57,7 @@ enum TSProgressState  {
                 return ("success",string)
             }
             return ("success","")
-        case .failed(let string):
+        case .failed(let string,let code):
             return ("failed",string)
         }
     }
@@ -77,7 +77,7 @@ enum TSProgressState  {
             return false
         case .success(_):
             return true
-        case .failed(_):
+        case .failed(_,_):
             return true
         }
     }
@@ -87,7 +87,7 @@ enum TSProgressState  {
         switch self {
         case .success(_):
             return true
-        case .failed(_):
+        case .failed(_,_):
             return false
         default:
             return false
@@ -97,12 +97,16 @@ enum TSProgressState  {
     
     var reloadNewData:Bool{
         switch self {
-        case .pending,.success(_),.failed(_):
+        case .pending,.success(_),.failed(_,_):
             return true
         default:
             return false
         }
     }
+    
+    static func getFailed(_ error:String,_ code:Int = 0)->TSProgressState {
+        return .failed(error, code)
+    }
 }
 
 class TSGenmojiGennerateViewModel {
@@ -129,7 +133,7 @@ class TSGenmojiGennerateViewModel {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error?.localizedDescription ?? ""),nil)
             }
         }
     }
@@ -145,7 +149,7 @@ class TSGenmojiGennerateViewModel {
                         self.stateDatauPblished = (.success(nil),genmojiModel)
                         generatingProgress = 0
                     case .failed:
-                        self.stateDatauPblished = (.failed(kNetWorkMessage(data: data) ?? ""),nil)
+                        self.stateDatauPblished = (TSProgressState.getFailed(kNetWorkMessage(data: data) ?? ""),nil)
                         generatingProgress = 0
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
@@ -157,7 +161,7 @@ class TSGenmojiGennerateViewModel {
                     }
                 }
             }else{
-                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(error?.localizedDescription ?? ""),nil)
             }
         }
     }

+ 5 - 7
AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/TSPTPGeneratorVC.swift

@@ -28,15 +28,13 @@ class TSPTPGeneratorVC: TSAIPhotoGeneratorBaseVC {
     
     var viewModel: TSPTPGeneratorVM!
 
-    lazy var generateInView : TSGeneratorloadingView = {
-        let generateInView = TSGeneratorloadingView()
+    lazy var generateInView : TSGeneratorView = {
+        let generateInView = TSGeneratorView()
         generateInView.backgroundGenerateBtn.addTarget(self, action: #selector(clickBackstageBtn), for: .touchUpInside)
         if generateStyleModel.advance {
-            generateInView.timeLabel.text = String(format: "~ %d min".localized, 2)
-            generateInView.infoLabel.text = "It is definitely worth your wait. Just watch it".localized
+            generateInView.animationView.setText(time: String(format: "~ %d min".localized, 2), info: "It is definitely worth your wait. Just watch it".localized)
         }else{
-            generateInView.timeLabel.text = String(format: "~ %d seconds".localized, 20)
-            generateInView.infoLabel.text = ""
+            generateInView.animationView.setText(time: String(format: "~ %d seconds".localized, 20), info: "")
         }
         return generateInView
     }()
@@ -228,7 +226,7 @@ extension TSPTPGeneratorVC {
         infoModel = model
         progressState = state
         switch state {
-            case .failed(let errorStr):
+            case .failed(let errorStr,let code):
                 showError(text: errorStr)
             case .success:
                 if let model = model {

+ 6 - 6
AIEmoji/Business/TSPTPGeneratorVC/TSPTPGeneratorVC/VM/TSPTPGeneratorVM.swift

@@ -71,7 +71,7 @@ class TSPTPGeneratorVM {
 //                let infoModel = TSActionInfoModel(JSON:actionInfoDictPoster )
 //                self.stateDatauPblished = (.success(nil),infoModel)
 //            }else{
-//                self.stateDatauPblished = (.failed("error?.localizedDescription"),nil)
+//                self.stateDatauPblished = (TSProgressState.getFailed("error?.localizedDescription"),nil)
 //            }
 //        }
 //        
@@ -98,7 +98,7 @@ class TSPTPGeneratorVM {
             guard let self = self else { return }
             if let error = error {
                 generateStyleModel.upLoadImageUrl = nil
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
             }else{
                 if let string = data as? String {
                     generateStyleModel.upLoadImageUrl = string
@@ -129,7 +129,7 @@ class TSPTPGeneratorVM {
             guard let self = self else { return }
             if let error = error {
                 generateStyleModel.upLoadImageUrl = nil
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
             }else{
                 if let string = data as? String {
                     generateStyleModel.upLoadImageUrl = string
@@ -169,7 +169,7 @@ class TSPTPGeneratorVM {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
             }
         }
     }
@@ -201,7 +201,7 @@ class TSPTPGeneratorVM {
                         }
                         
                     case .failed:
-                        self.stateDatauPblished = (.failed(genmojiModel.response.codeErrorMsg),nil)
+                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg),nil)
                         generatingProgress = 0
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
@@ -213,7 +213,7 @@ class TSPTPGeneratorVM {
                     }
                 }
             }else{
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
             }
         }
     }

+ 4 - 5
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift

@@ -23,10 +23,9 @@ class TSTextPicGennerateVC: TSAIPhotoGeneratorBaseVC {
         fatalError("init(coder:) has not been implemented")
     }
 
-    lazy var generateInView : TSGeneratorloadingView = {
-        let generateInView = TSGeneratorloadingView()
-        generateInView.timeLabel.text = String(format: "~ %d seconds".localized, 20)
-        generateInView.infoLabel.text = ""
+    lazy var generateInView : TSGeneratorView = {
+        let generateInView = TSGeneratorView()
+        generateInView.animationView.setText(time: String(format: "~ %d seconds".localized, 20), info: "")
         return generateInView
     }()
     
@@ -126,7 +125,7 @@ extension TSTextPicGennerateVC {
     func upDateView(state:TSProgressState,model:TSActionInfoModel?){
         progressState = state
         switch state {
-            case .failed(let errorStr):
+            case .failed(let errorStr,let code):
                 showError(text: errorStr)
             case .success:
                 if let model = model {

+ 4 - 4
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift

@@ -51,7 +51,7 @@ class TSTextPicGennerateVM {
 //                let infoModel = TSActionInfoModel(JSON:actionInfoDictPoster )
 //                self.stateDatauPblished = (.success(nil),infoModel)
 //            }else{
-//                self.stateDatauPblished = (.failed("error?.localizedDescription"),nil)
+//                self.stateDatauPblished = (TSProgressState.getFailed("error?.localizedDescription"),nil)
 //            }
 //        }
 //        
@@ -86,7 +86,7 @@ class TSTextPicGennerateVM {
                     self.getActionInfo(action_id:actionId)
                 }
             }else{
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
             }
         }
     }
@@ -120,7 +120,7 @@ class TSTextPicGennerateVM {
                         }
                         
                     case .failed:
-                        self.stateDatauPblished = (.failed(genmojiModel.response.codeErrorMsg),nil)
+                        self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg),nil)
                         generatingProgress = 0
                     default:
                         stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
@@ -132,7 +132,7 @@ class TSTextPicGennerateVM {
                     }
                 }
             }else{
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
             }
         }
     }

+ 67 - 13
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorErrorView.swift

@@ -1,5 +1,5 @@
 //
-//  TSGeneratorloadingView+Error.swift
+//  TSGeneratorView.swift
 //  AIEmoji
 //
 //  Created by 100Years on 2025/5/12.
@@ -7,15 +7,30 @@
 
 class TSGeneratorErrorView: TSBaseView {
     
+    var style:TSGeneratorView.Style = .generalError{
+        didSet{
+            switch style {
+            case .sensitiveError:
+                sensitiveErrorView()
+            case .netWorkError:
+                netWorkErrorView()
+            default:
+                generalErrorView()
+            }
+        }
+    }
+
     lazy var cusStackView: UIStackView = {
         let cusStackView = UIStackView()
         cusStackView.axis = .vertical
+        cusStackView.distribution = .fill
+        cusStackView.alignment = .center
         return cusStackView
     }()
     
-    lazy var imageView: UIImageView = {
-        let imageView = UIImageView.createImageView(imageName: "failed_big")
-        return imageView
+    lazy var errorImageView: UIImageView = {
+        let errorImageView = UIImageView.createImageView(imageName: "yellow_warning")
+        return errorImageView
     }()
     
     lazy var textLabel: UILabel = {
@@ -24,7 +39,7 @@ class TSGeneratorErrorView: TSBaseView {
     }()
     
     lazy var submitBtn: UIButton = {
-        let btn = UIButton.createButton(title: "Generate in the background".localized,backgroundColor: .white.withAlphaComponent(0.2),font: .font(size: 16),titleColor: .themeColor,corner: 24)
+        let btn = UIButton.createButton(title: "Generate in the background".localized,backgroundImage: kSubmitBtnNormalbg,font: .font(size: 16),titleColor: "#111111".uiColor,corner: 24)
         btn.titleLabel?.adjustsFontSizeToFitWidth = true
         return btn
     }()
@@ -36,30 +51,69 @@ class TSGeneratorErrorView: TSBaseView {
             make.edges.equalToSuperview()
         }
         
-        cusStackView.addArrangedSubview(imageView)
-        imageView.snp.makeConstraints { make in
+        cusStackView.addArrangedSubview(errorImageView)
+        errorImageView.snp.makeConstraints { make in
             make.top.equalTo(0)
             make.width.height.equalTo(56)
-            make.centerX.equalToSuperview()
-            make.bottom.equalTo(0)
         }
         
+        cusStackView.addSpacing(length: 12.0)
+        
         cusStackView.addArrangedSubview(textLabel)
         textLabel.snp.makeConstraints { make in
-            make.top.equalTo(12)
             make.leading.equalTo(24)
             make.trailing.equalTo(-24)
-            make.bottom.equalTo(0)
         }
         
+        cusStackView.addSpacing(length: 28.0)
+        
         cusStackView.addArrangedSubview(submitBtn)
         submitBtn.snp.makeConstraints { make in
-            make.top.equalTo(28)
             make.width.equalTo(250)
             make.height.equalTo(48)
-            make.centerX.equalToSuperview()
             make.bottom.equalTo(0)
         }
     }
 }
 
+extension TSGeneratorErrorView {
+    
+//    func setErrorText(errorString:String) {
+//        textLabel.text = errorString
+//    }
+    
+    func sensitiveErrorView() {
+        submitBtn.setTitle("Reselect photos".localized, for: .normal)
+        errorImageView.image = UIImage(named: "yellow_warning")
+        
+        errorImageView.snp.updateConstraints { make in
+            make.width.height.equalTo(56)
+        }
+        
+        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
+        
+    }
+    
+    func generalErrorView() {
+        submitBtn.setTitle("Got it".localized, for: .normal)
+        errorImageView.image = UIImage(named: "yellow_warning")
+        
+        errorImageView.snp.updateConstraints { make in
+            make.width.height.equalTo(56)
+        }
+        
+        textLabel.text = "Sorry there was a slight problem with the image processing, please try again later.".localized
+    }
+    
+    
+    func netWorkErrorView() {
+        submitBtn.setTitle("Try again".localized, for: .normal)
+        errorImageView.image = UIImage(named: "network_error")
+        
+        errorImageView.snp.updateConstraints { make in
+            make.width.height.equalTo(120)
+        }
+        
+        textLabel.text = "No network, please check your network and try again.".localized
+    }
+}

+ 65 - 0
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorFailView.swift

@@ -0,0 +1,65 @@
+//
+//  TSGeneratorFailView.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/5/12.
+//
+
+class TSGeneratorFailView: TSBaseView {
+    
+    lazy var cusStackView: UIStackView = {
+        let cusStackView = UIStackView()
+        cusStackView.axis = .vertical
+        return cusStackView
+    }()
+    
+    lazy var imageView: UIImageView = {
+        let imageView = UIImageView.createImageView(imageName: "failed_big")
+        return imageView
+    }()
+    
+    lazy var textLabel: UILabel = {
+        let textLabel = UILabel.createLabel(font: .font(size: 14),textColor: .white,textAlignment: .center,numberOfLines: 0)
+        return textLabel
+    }()
+    
+    lazy var submitBtn: UIButton = {
+        let btn = UIButton.createButton(title: "Generate in the background".localized,backgroundColor: .white.withAlphaComponent(0.2),font: .font(size: 16),titleColor: .themeColor,corner: 24)
+        btn.titleLabel?.adjustsFontSizeToFitWidth = true
+        return btn
+    }()
+    
+    override func creatUI() {
+        
+        contentView.addSubview(cusStackView)
+        cusStackView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        cusStackView.addArrangedSubview(imageView)
+        imageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.width.height.equalTo(56)
+            make.centerX.equalToSuperview()
+            make.bottom.equalTo(0)
+        }
+        
+        cusStackView.addArrangedSubview(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.top.equalTo(12)
+            make.leading.equalTo(24)
+            make.trailing.equalTo(-24)
+            make.bottom.equalTo(0)
+        }
+        
+        cusStackView.addArrangedSubview(submitBtn)
+        submitBtn.snp.makeConstraints { make in
+            make.top.equalTo(28)
+            make.width.equalTo(250)
+            make.height.equalTo(48)
+            make.centerX.equalToSuperview()
+            make.bottom.equalTo(0)
+        }
+    }
+}
+

+ 148 - 0
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratoringAnimationView.swift

@@ -0,0 +1,148 @@
+//
+//  Untitled.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/5/12.
+//
+
+import Kingfisher
+
+class TSGeneratoringAnimationView : TSBaseView {
+
+    
+    var isShowBackGeneration:Bool = false {
+        didSet{
+            backgroundGenerateBtn.isHidden = !isShowBackGeneration
+        }
+    }
+    
+    lazy var cusStackView: UIStackView = {
+        let cusStackView = UIStackView()
+        cusStackView.axis = .vertical
+        cusStackView.distribution = .fill
+        cusStackView.alignment = .center
+        return cusStackView
+    }()
+    
+    lazy var animatedImageView: AnimatedImageView = {
+        let animatedImageView = AnimatedImageView()
+        animatedImageView.autoPlayAnimatedImage = false
+        if let gifURL = Bundle.main.url(forResource: "rotatingAnimation_1", withExtension: "gif") {
+            animatedImageView.kf.setImage(with: gifURL, options: [.cacheOriginalImage]) { result in
+                switch result {
+                case .success(let value):
+                    print("GIF 加载成功: \(value.source.url?.absoluteString ?? "")")
+                case .failure(let error):
+                    print("GIF 加载失败: \(error.localizedDescription)")
+                }
+            }
+        }
+        
+        return animatedImageView
+    }()
+    
+    lazy var timeLabel: UILabel = {
+        let textLabel = UILabel.createLabel(font: .font(size: 18,weight: .semibold),textColor: .white,textAlignment: .center)
+        textLabel.isHidden = true
+        return textLabel
+    }()
+    
+    lazy var textLabel: UILabel = {
+        let textLabel = UILabel.createLabel(font: .font(size: 18),textColor: .white,textAlignment: .center,numberOfLines: 0)
+        textLabel.isHidden = true
+        return textLabel
+    }()
+    
+    lazy var infoLabel: UILabel = {
+        let textLabel = UILabel.createLabel(font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),textAlignment: .center,numberOfLines: 0)
+        return textLabel
+    }()
+    
+    lazy var backgroundGenerateBtn: UIButton = {
+        let btn = UIButton.createButton(title: "Generate in the background".localized,font: .font(size: 16),titleColor: .themeColor,corner: 24)
+        btn.layer.borderColor = UIColor.themeColor.cgColor
+        btn.layer.borderWidth = 1.0
+        btn.titleLabel?.adjustsFontSizeToFitWidth = true
+        btn.isHidden = true
+        return btn
+    }()
+    
+    
+    override func creatUI() {
+        
+        contentView.addSubview(cusStackView)
+        cusStackView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        setUpGeneratorContentView()
+    }
+    
+    func setUpGeneratorContentView(){
+        
+        cusStackView.addArrangedSubview(animatedImageView)
+        animatedImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.width.height.equalTo(120)
+        }
+        
+        cusStackView.addSpacing(length: 12.0)
+        
+        cusStackView.addArrangedSubview(timeLabel)
+        timeLabel.snp.makeConstraints { make in
+            make.leading.equalTo(kTextLeading)
+            make.trailing.equalTo(-kTextLeading)
+        }
+        
+        cusStackView.addSpacing(length: 16.0)
+        
+        cusStackView.addArrangedSubview(textLabel)
+        textLabel.snp.makeConstraints { make in
+            make.leading.equalTo(kTextLeading)
+            make.trailing.equalTo(-kTextLeading)
+        }
+        
+        cusStackView.addSpacing(length: 8.0)
+        
+        cusStackView.addArrangedSubview(infoLabel)
+        infoLabel.snp.makeConstraints { make in
+            make.leading.equalTo(kTextLeading)
+            make.trailing.equalTo(-kTextLeading)
+        }
+        
+        cusStackView.addSpacing(length: 20.0)
+        
+        cusStackView.addArrangedSubview(backgroundGenerateBtn)
+        backgroundGenerateBtn.snp.makeConstraints { make in
+            make.width.lessThanOrEqualTo(k_ScreenWidth - 64)
+            make.width.greaterThanOrEqualTo(250)
+            make.height.equalTo(48)
+            make.bottom.equalTo(0)
+        }
+
+    }
+
+}
+
+extension TSGeneratoringAnimationView {
+    
+    
+    func startAnimation() {
+        kDelayMainShort {
+            self.animatedImageView.startAnimating()
+        }
+    }
+
+    func stopAnimation() {
+        self.animatedImageView.stopAnimating()
+    }
+    
+    func setText(time:String,info:String) {
+        timeLabel.text = time
+        infoLabel.text = info
+        
+        timeLabel.isHidden = time.isEmpty
+        infoLabel.isHidden = info.isEmpty
+    }
+    
+}

+ 47 - 187
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorloadingView.swift

@@ -1,5 +1,5 @@
 //
-//  TSGeneratorloadingView.swift
+//  TSGeneratorView.swift
 //  AIEmoji
 //
 //  Created by 100Years on 2025/4/2.
@@ -7,77 +7,39 @@
 
 import Kingfisher
 
-class TSGeneratorloadingView: TSBaseView {
-    
-    
-    
-    lazy var generatorContentView: UIView = {
-        let generatorContentView = UIView()
-        generatorContentView.backgroundColor = .clear
-        return generatorContentView
-    }()
-    
-    lazy var failedImageView: UIImageView = {
-        let imageView = UIImageView.createImageView(imageName: "failed_big")
-        imageView.isHidden = true
-        return imageView
-    }()
-    
-    lazy var animatedImageView: AnimatedImageView = {
-        let animatedImageView = AnimatedImageView()
-        animatedImageView.autoPlayAnimatedImage = false
-        if let gifURL = Bundle.main.url(forResource: "rotatingAnimation", withExtension: "gif") {
-            animatedImageView.kf.setImage(with: gifURL, options: [.cacheOriginalImage]) { result in
-                switch result {
-                case .success(let value):
-                    print("GIF 加载成功: \(value.source.url?.absoluteString ?? "")")
-                case .failure(let error):
-                    print("GIF 加载失败: \(error.localizedDescription)")
-                }
-            }
-        }
-        
-        return animatedImageView
-    }()
-    
-    
-    lazy var generatorCusStackView: TSCustomStackView = {
-        let generatorCusStackView = TSCustomStackView(axis: .vertical,spacing: 0)
-        generatorCusStackView.scrollView.isScrollEnabled = false
-        return generatorCusStackView
-    }()
+
+
+
+let kTextLeading = 24.0
+
+class TSGeneratorView: TSBaseView {
     
-    lazy var timeLabel: UILabel = {
-        let textLabel = UILabel.createLabel(font: .font(size: 18,weight: .semibold),textColor: .white,textAlignment: .center)
-        return textLabel
-    }()
+    enum Style {
+        case loading    //loading
+        case generalError //通用错误
+        case sensitiveError   //敏感类的错误
+        case netWorkError //网络错误
+    }
     
-    lazy var textLabel: UILabel = {
-        let textLabel = UILabel.createLabel(font: .font(size: 18),textColor: .white,textAlignment: .center,numberOfLines: 0)
-        return textLabel
+    var style:Style = .generalError
+
+    lazy var animationView: TSGeneratoringAnimationView = {
+        let animationView = TSGeneratoringAnimationView()
+        return animationView
     }()
     
-    lazy var infoLabel: UILabel = {
-        let textLabel = UILabel.createLabel(font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),textAlignment: .center,numberOfLines: 0)
-        return textLabel
+    lazy var errorView: TSGeneratorErrorView = {
+        let errorView = TSGeneratorErrorView()
+        errorView.isHidden = true
+        return errorView
     }()
-    
-    private var targetView: UIView = UIView()
-    
-//    lazy var blurEffect: UIVisualEffectView = {
-//        let blurEffect = createBlurEffectView(style: .dark)
-//        blurEffect.alpha = 0.9
-//        return blurEffect
-//    }()
-    
+
     lazy var blurEffect: TSDynamicBlurView = {
         return TSDynamicBlurView()
     }()
     
-    
     lazy var regenerateBtn: UIButton = {
         let regenerateBtn = UIButton.createButton(title: "Regenerate".localized,backgroundImage: kSubmitBtnNormalbg,font: .font(size: 12),titleColor: "#111111".uiColor,corner: 22)
-//        regenerateBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 28, bottom: 0, right:28)
         regenerateBtn.isHidden = true
         return regenerateBtn
     }()
@@ -106,12 +68,16 @@ class TSGeneratorloadingView: TSBaseView {
             make.edges.equalToSuperview()
         }
 
-        contentView.addSubview(generatorContentView)
-        generatorContentView.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
+        contentView.addSubview(animationView)
+        animationView.snp.makeConstraints { make in
+            make.leading.trailing.centerY.equalToSuperview()
+        }
+        
+        contentView.addSubview(errorView)
+        errorView.snp.makeConstraints { make in
+            make.leading.trailing.centerY.equalToSuperview()
         }
         
-        setUpGeneratorContentView()
 
         //关闭按钮
         contentView.addSubview(xBtn)
@@ -121,81 +87,8 @@ class TSGeneratorloadingView: TSBaseView {
             make.width.equalTo(36)
             make.height.equalTo(36)
         }
-        
-        timeLabel.superview?.isHidden = true
-        infoLabel.superview?.isHidden = true
-        setBackgroundGenerateBtnHidden(true)
-        
     }
     
-    
-    func setUpGeneratorContentView(){
-        let imageViewTop = 225
-        generatorContentView.addSubview(imageView)
-        imageView.snp.makeConstraints { make in
-            make.width.height.equalTo(200.0)
-            make.centerX.equalToSuperview()
-            make.top.equalTo(imageViewTop)
-        }
-        
-        generatorContentView.addSubview(animatedImageView)
-        animatedImageView.snp.makeConstraints { make in
-            make.width.height.equalTo(200.0)
-            make.centerX.equalToSuperview()
-            make.top.equalTo(imageViewTop)
-        }
-  
-        generatorContentView.addSubview(generatorCusStackView)
-        generatorCusStackView.snp.makeConstraints { make in
-            make.top.equalTo(imageView.snp.bottom).offset(-20)
-            make.leading.equalTo(0)
-            make.trailing.equalTo(0)
-            make.bottom.equalTo(0)
-        }
-        
-        generatorCusStackView.addSubviewToStackWhiteBoard(timeLabel)
-        timeLabel.snp.makeConstraints { make in
-            make.top.equalTo(0)
-            make.leading.equalTo(16)
-            make.trailing.equalTo(-16)
-            make.height.equalTo(27)
-            make.bottom.equalTo(-17)
-        }
-        
-        generatorCusStackView.addSubviewToStackWhiteBoard(textLabel)
-        textLabel.snp.makeConstraints { make in
-            make.top.equalTo(0)
-            make.leading.equalTo(16)
-            make.trailing.equalTo(-16)
-            make.bottom.equalTo(-8)
-        }
-        
-        generatorCusStackView.addSubviewToStackWhiteBoard(infoLabel)
-        infoLabel.snp.makeConstraints { make in
-            make.top.equalTo(0)
-            make.leading.equalTo(16)
-            make.trailing.equalTo(-16)
-            make.bottom.equalTo(-20)
-        }
-        
-        generatorCusStackView.addSubviewToStackWhiteBoard(backgroundGenerateBtn)
-        backgroundGenerateBtn.snp.makeConstraints { make in
-            make.top.equalTo(20)
-            make.leading.equalTo(32)
-            make.trailing.equalTo(-32)
-            make.height.equalTo(48)
-            make.bottom.equalTo(0)
-        }
-        
-        generatorCusStackView.addSubviewToStackWhiteBoard(regenerateBtn)
-        regenerateBtn.snp.makeConstraints { make in
-            make.top.equalTo(20)
-            make.centerX.equalToSuperview()
-            make.height.equalTo(44)
-            make.width.equalTo(126*kDesignScale)
-            make.bottom.equalTo(0)
-        }
-    }
 
     override func dealThings() {
         // 监听应用生命周期事件
@@ -214,56 +107,41 @@ class TSGeneratorloadingView: TSBaseView {
         )
     }
     
-    
     lazy var isRotating = false{
         didSet{
             if isRotating == true{
-                startRotating(view: imageView)
+                animationView.startAnimation()
             }else{
-                stopRotating(view: imageView)
+                animationView.stopAnimation()
             }
         }
     }
     
-    
-    /// 开始旋转
-    func startRotating(view:UIView,duration: Double = 2.0) {
-        kDelayMainShort {
-            self.animatedImageView.startAnimating()
-        }
+    @objc private func handleAppDidEnterBackground() {
+        animationView.stopAnimation()
     }
 
-    /// 停止旋转
-    func stopRotating(view:UIView) {
-        animatedImageView.stopAnimating()
+    @objc private func handleAppWillEnterForeground() {
+        isRotating = isRotating
     }
     
+
+    
     func showLoading(text:String){
-        animatedImageView.isHidden = false
-        imageView.isHidden = true
-        
-        textLabel.text = text
         isRotating = true
+        animationView.isHidden = false
+        errorView.isHidden = true
+        
+        animationView.textLabel.text = text
     }
     
     func showError(text:String){
-        animatedImageView.isHidden = true
-        
-        imageView.isHidden = false
-        imageView.image = UIImage(named: "failed_big")
-        
-        textLabel.text = text
         isRotating = false
-    }
-    
-    @objc private func handleAppDidEnterBackground() {
-        stopRotating(view: targetView)
+        animationView.isHidden = true
+        errorView.isHidden = false
+        errorView.style = style
     }
 
-    @objc private func handleAppWillEnterForeground() {
-        isRotating = isRotating
-    }
-    
     func setBackgroundColor(color:UIColor){
         blurEffect.removeFromSuperview()
         contentView.backgroundColor = color
@@ -271,42 +149,24 @@ class TSGeneratorloadingView: TSBaseView {
 }
 
 
-extension TSGeneratorloadingView{
+extension TSGeneratorView{
     
     func updateShowProgress(text:String) {
         isHidden = false
         showLoading(text: text)
         isRotating = true
-        
-        if timeLabel.text?.count ?? 0 > 0 {
-            timeLabel.superview?.isHidden = false
-        }
-        
-        if infoLabel.text?.count ?? 0 > 0 {
-            infoLabel.superview?.isHidden = false
-        }
     }
     
     func updateShowLoading(text:String){
         isHidden = false
         showLoading(text: text)
         isRotating = true
-        
-        if timeLabel.text?.count ?? 0 > 0 {
-            timeLabel.superview?.isHidden = false
-        }
-        
-        if infoLabel.text?.count ?? 0 > 0 {
-            infoLabel.superview?.isHidden = false
-        }
     }
     
     func updateShowError(text:String?){
         isHidden = false
         showError(text: text ?? kGenerateFailed)
         isRotating = false
-        timeLabel.superview?.isHidden = true
-        infoLabel.superview?.isHidden = true
         setBackgroundGenerateBtnHidden(true)
     }
     

+ 0 - 7
AIEmoji/Business/VIewTool/TSGeneratorloadingView/Untitled.swift

@@ -1,7 +0,0 @@
-//
-//  Untitled.swift
-//  AIEmoji
-//
-//  Created by 100Years on 2025/5/12.
-//
-

+ 1 - 1
AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGenerateBaseOperation.swift

@@ -89,7 +89,7 @@ class TSGenerateBaseOperation: TSBaseOperation , @unchecked Sendable{
         self.currentActionInfoModel.status = "failed"
         generatingProgress = 0
         self.replaceSaveInfoModel(model: self.currentActionInfoModel)
-        self.stateDatauPblished = (.failed(errorString ?? ""),self.currentActionInfoModel)
+        self.stateDatauPblished = (TSProgressState.getFailed(errorString ?? ""),self.currentActionInfoModel)
     }
     
     func getActionInfo(oldModel:TSActionInfoModel) {

+ 1 - 1
AIEmoji/Common/Tool/OperationQueue/TSGenerateBaseOperation/TSGeneratePosterOperation.swift

@@ -144,7 +144,7 @@ class TSGeneratePTPOperation: TSGenerateBaseOperation , @unchecked Sendable{
             if stopNetwork == true { return }
             if let error = error {
                 generateStyleModel.upLoadImageUrl = nil
-                self.stateDatauPblished = (.failed(""),nil)
+                self.stateDatauPblished = (TSProgressState.getFailed(""),nil)
                 complete(nil)
             }else{
                 if let string = data as? String {

+ 0 - 0
AIEmoji/Res/rotatingAnimation.gif → AIEmoji/Res/rotatingAnimation_1.gif