Browse Source

初步完成文生图,还差浏览和换一张的实现

100Years 1 month ago
parent
commit
31203352d9
39 changed files with 815 additions and 110 deletions
  1. 48 0
      AIEmoji.xcodeproj/project.pbxproj
  2. 22 0
      AIEmoji/Assets.xcassets/Common/keyboard.imageset/Contents.json
  3. BIN
      AIEmoji/Assets.xcassets/Common/keyboard.imageset/keyboard@2x.png
  4. BIN
      AIEmoji/Assets.xcassets/Common/keyboard.imageset/keyboard@3x.png
  5. 0 0
      AIEmoji/Assets.xcassets/Common/refresh.imageset/Contents.json
  6. 0 0
      AIEmoji/Assets.xcassets/Common/refresh.imageset/aichat_refresh@2x.png
  7. 0 0
      AIEmoji/Assets.xcassets/Common/refresh.imageset/aichat_refresh@3x.png
  8. BIN
      AIEmoji/Assets.xcassets/Emojis/emojis_banner.imageset/emojis_banner@2x.png
  9. BIN
      AIEmoji/Assets.xcassets/Emojis/emojis_banner.imageset/emojis_banner@3x.png
  10. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/Contents.json
  11. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/tabbar_select_pic@2x.png
  12. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/tabbar_select_pic@3x.png
  13. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_setting.imageset/Contents.json
  14. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_setting.imageset/tabbar_select_setting@2x.png
  15. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_setting.imageset/tabbar_select_setting@3x.png
  16. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/Contents.json
  17. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_select_pic@2x.png
  18. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_select_pic@3x.png
  19. 22 0
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_setting.imageset/Contents.json
  20. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_setting.imageset/tabbar_unSelect_setting@2x.png
  21. BIN
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_setting.imageset/tabbar_unSelect_setting@3x.png
  22. 6 0
      AIEmoji/Assets.xcassets/TextGeneralPicture/Contents.json
  23. 22 0
      AIEmoji/Assets.xcassets/TextGeneralPicture/nav_title_pic.imageset/Contents.json
  24. BIN
      AIEmoji/Assets.xcassets/TextGeneralPicture/nav_title_pic.imageset/nav_title_pic@2x.png
  25. BIN
      AIEmoji/Assets.xcassets/TextGeneralPicture/nav_title_pic.imageset/nav_title_pic@3x.png
  26. 6 3
      AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+Keyboard.swift
  27. 15 14
      AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+NaviBar.swift
  28. 3 1
      AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController.swift
  29. 14 14
      AIEmoji/Business/TSEmojisVC/TSEmojisVC/TSEmojisVC.swift
  30. 40 36
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/TSGenmojiVC.swift
  31. 24 12
      AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/ViewModel/TSGenmojiCollectionViewModel.swift
  32. 5 3
      AIEmoji/Business/TSSetingVC/SetingVC/TSSetingVC.swift
  33. 18 22
      AIEmoji/Business/TSTabBarController/TSTabBarController.swift
  34. 156 0
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/TSTextGeneralPictureVC.swift
  35. 117 0
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/ViewModel/TSTextGeneralPictureVM.swift
  36. 166 0
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift
  37. 57 0
      AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift
  38. 6 3
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift
  39. 2 2
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetworkManager.swift

+ 48 - 0
AIEmoji.xcodeproj/project.pbxproj

@@ -38,6 +38,10 @@
 		A80E73E12D533E5800C64288 /* TSPurchaseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80E73D82D533E5800C64288 /* TSPurchaseVC.swift */; };
 		A80E73E42D533EB000C64288 /* TSPurchaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80E73E22D533EB000C64288 /* TSPurchaseManager.swift */; };
 		A80E73E62D5348D000C64288 /* SettingPurchaseTopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80E73E52D5348CF00C64288 /* SettingPurchaseTopView.swift */; };
+		A85E478F2D67115A0018D62D /* TSTextGeneralPictureVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E478E2D6711590018D62D /* TSTextGeneralPictureVC.swift */; };
+		A85E47922D6728A00018D62D /* TSTextGeneralPictureVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E47912D67289F0018D62D /* TSTextGeneralPictureVM.swift */; };
+		A85E47962D672ADA0018D62D /* TSTextPicGennerateVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E47952D672AD90018D62D /* TSTextPicGennerateVC.swift */; };
+		A85E47982D672AE70018D62D /* TSTextPicGennerateVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = A85E47972D672AE40018D62D /* TSTextPicGennerateVM.swift */; };
 		A89EA64B2D59A588000EB181 /* MessageKit in Frameworks */ = {isa = PBXBuildFile; productRef = A89EA64A2D59A588000EB181 /* MessageKit */; };
 		A89EA6542D59A9F4000EB181 /* TSTextLayoutSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89EA64F2D59A9F4000EB181 /* TSTextLayoutSizeCalculator.swift */; };
 		A89EA6552D59A9F4000EB181 /* TSChatMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89EA6502D59A9F4000EB181 /* TSChatMessage.swift */; };
@@ -158,6 +162,10 @@
 		A80E73D82D533E5800C64288 /* TSPurchaseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchaseVC.swift; sourceTree = "<group>"; };
 		A80E73E22D533EB000C64288 /* TSPurchaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPurchaseManager.swift; sourceTree = "<group>"; };
 		A80E73E52D5348CF00C64288 /* SettingPurchaseTopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingPurchaseTopView.swift; sourceTree = "<group>"; };
+		A85E478E2D6711590018D62D /* TSTextGeneralPictureVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextGeneralPictureVC.swift; sourceTree = "<group>"; };
+		A85E47912D67289F0018D62D /* TSTextGeneralPictureVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextGeneralPictureVM.swift; sourceTree = "<group>"; };
+		A85E47952D672AD90018D62D /* TSTextPicGennerateVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextPicGennerateVC.swift; sourceTree = "<group>"; };
+		A85E47972D672AE40018D62D /* TSTextPicGennerateVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextPicGennerateVM.swift; sourceTree = "<group>"; };
 		A89EA64C2D59A9F4000EB181 /* CustomMessageFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomMessageFlowLayout.swift; sourceTree = "<group>"; };
 		A89EA64E2D59A9F4000EB181 /* TSLayoutSizeCalculator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSLayoutSizeCalculator.swift; sourceTree = "<group>"; };
 		A89EA64F2D59A9F4000EB181 /* TSTextLayoutSizeCalculator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSTextLayoutSizeCalculator.swift; sourceTree = "<group>"; };
@@ -431,6 +439,41 @@
 			path = AIChat;
 			sourceTree = "<group>";
 		};
+		A85E478D2D670DF10018D62D /* TSTextGeneralPictureVC */ = {
+			isa = PBXGroup;
+			children = (
+				A85E47942D672AC30018D62D /* TSTextPicGennerateVC */,
+				A85E47932D672AB40018D62D /* TSTextGeneralPictureVC */,
+			);
+			path = TSTextGeneralPictureVC;
+			sourceTree = "<group>";
+		};
+		A85E47902D6728810018D62D /* ViewModel */ = {
+			isa = PBXGroup;
+			children = (
+				A85E47912D67289F0018D62D /* TSTextGeneralPictureVM.swift */,
+			);
+			path = ViewModel;
+			sourceTree = "<group>";
+		};
+		A85E47932D672AB40018D62D /* TSTextGeneralPictureVC */ = {
+			isa = PBXGroup;
+			children = (
+				A85E47902D6728810018D62D /* ViewModel */,
+				A85E478E2D6711590018D62D /* TSTextGeneralPictureVC.swift */,
+			);
+			path = TSTextGeneralPictureVC;
+			sourceTree = "<group>";
+		};
+		A85E47942D672AC30018D62D /* TSTextPicGennerateVC */ = {
+			isa = PBXGroup;
+			children = (
+				A85E47972D672AE40018D62D /* TSTextPicGennerateVM.swift */,
+				A85E47952D672AD90018D62D /* TSTextPicGennerateVC.swift */,
+			);
+			path = TSTextPicGennerateVC;
+			sourceTree = "<group>";
+		};
 		A89EA64D2D59A9F4000EB181 /* Layout */ = {
 			isa = PBXGroup;
 			children = (
@@ -585,6 +628,7 @@
 		A8F774922D38EA8C00AA6E93 /* Business */ = {
 			isa = PBXGroup;
 			children = (
+				A85E478D2D670DF10018D62D /* TSTextGeneralPictureVC */,
 				A80E74222D5996BF00C64288 /* AIChat */,
 				A80E73DD2D533E5800C64288 /* TSPurchaseMembershipVC */,
 				A80E72702D40F85800C64288 /* LaunchVC */,
@@ -1114,6 +1158,7 @@
 				A8F7763F2D3B68E100AA6E93 /* TSGenmojiGennerateViewModel.swift in Sources */,
 				A80E72352D3F473400C64288 /* DiyPaperTemplateBaseView.swift in Sources */,
 				A80E72362D3F473400C64288 /* DiyPaperTemplate.swift in Sources */,
+				A85E47922D6728A00018D62D /* TSTextGeneralPictureVM.swift in Sources */,
 				A89EA6B82D5D7EE9000EB181 /* TSAIChatHistoryModel.swift in Sources */,
 				A80E72722D40F86000C64288 /* TSLaunchVC.swift in Sources */,
 				A8F775352D38FC9A00AA6E93 /* TSViewTool.swift in Sources */,
@@ -1127,6 +1172,7 @@
 				A80E73E12D533E5800C64288 /* TSPurchaseVC.swift in Sources */,
 				A8F776352D3A7C2B00AA6E93 /* TSGenmojiColSectionView.swift in Sources */,
 				A80E724F2D3F6D7F00C64288 /* DiyFixedTextElement.swift in Sources */,
+				A85E478F2D67115A0018D62D /* TSTextGeneralPictureVC.swift in Sources */,
 				A89EA6C42D5F40CC000EB181 /* TSChatInputBarVC.swift in Sources */,
 				A8F775452D39347100AA6E93 /* TSSetingViewModel.swift in Sources */,
 				A80E72202D3F3A8600C64288 /* DiyElementBaseView.swift in Sources */,
@@ -1140,6 +1186,7 @@
 				A80E72262D3F3A9A00C64288 /* HYHAddImageView.m in Sources */,
 				A80E72272D3F3A9A00C64288 /* DiyTextElement.swift in Sources */,
 				A8FB02BA2D3E3BB20031A396 /* TSEmojisCoLItemCell.swift in Sources */,
+				A85E47962D672ADA0018D62D /* TSTextPicGennerateVC.swift in Sources */,
 				A80E72562D3F98D700C64288 /* TSDiyKeyboardViewVC.swift in Sources */,
 				A8F775032D38EA8C00AA6E93 /* GlobalImports.swift in Sources */,
 				A89EA67A2D59D25F000EB181 /* TSAIChatVM.swift in Sources */,
@@ -1161,6 +1208,7 @@
 				A80E73E62D5348D000C64288 /* SettingPurchaseTopView.swift in Sources */,
 				A80E72382D3F473B00C64288 /* DiyPaperProtocol.swift in Sources */,
 				A8F775382D390C3C00AA6E93 /* TSNetworkManager.swift in Sources */,
+				A85E47982D672AE70018D62D /* TSTextPicGennerateVM.swift in Sources */,
 				A89EA65F2D59AA11000EB181 /* TSChatViewController.swift in Sources */,
 				A89EA6C62D5F5C22000EB181 /* TSChatInputFullScreenVC.swift in Sources */,
 				A89EA6CA2D642C0A000EB181 /* TSChatViewController+SendMsg.swift in Sources */,

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

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

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


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


+ 0 - 0
AIEmoji/Assets.xcassets/AIChat/aichat_refresh.imageset/Contents.json → AIEmoji/Assets.xcassets/Common/refresh.imageset/Contents.json


+ 0 - 0
AIEmoji/Assets.xcassets/AIChat/aichat_refresh.imageset/aichat_refresh@2x.png → AIEmoji/Assets.xcassets/Common/refresh.imageset/aichat_refresh@2x.png


+ 0 - 0
AIEmoji/Assets.xcassets/AIChat/aichat_refresh.imageset/aichat_refresh@3x.png → AIEmoji/Assets.xcassets/Common/refresh.imageset/aichat_refresh@3x.png


BIN
AIEmoji/Assets.xcassets/Emojis/emojis_banner.imageset/emojis_banner@2x.png


BIN
AIEmoji/Assets.xcassets/Emojis/emojis_banner.imageset/emojis_banner@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/tabbar_select_pic@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/tabbar_select_pic@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_setting.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_setting.imageset/tabbar_select_setting@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_setting.imageset/tabbar_select_setting@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_select_pic@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_select_pic@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_setting.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_setting.imageset/tabbar_unSelect_setting@2x.png


BIN
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_setting.imageset/tabbar_unSelect_setting@3x.png


+ 6 - 0
AIEmoji/Assets.xcassets/TextGeneralPicture/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 22 - 0
AIEmoji/Assets.xcassets/TextGeneralPicture/nav_title_pic.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/TextGeneralPicture/nav_title_pic.imageset/nav_title_pic@2x.png


BIN
AIEmoji/Assets.xcassets/TextGeneralPicture/nav_title_pic.imageset/nav_title_pic@3x.png


+ 6 - 3
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+Keyboard.swift

@@ -58,8 +58,8 @@ extension TSChatViewController{
 
 
 extension TSChatViewController{
-
-    func configureMessageInputBar() {
+    
+    func setUpInputBarType(){
         inputBarBgView.addSubview(inputBarTopView)
         inputBarTopView.snp.makeConstraints { make in
             make.leading.equalTo(0)
@@ -77,7 +77,10 @@ extension TSChatViewController{
             }
         }
         inputBarType = .custom(inputBarBgView)
-        
+    }
+    
+
+    func configureMessageInputBar() {
         handleKeyBoard()
         configureScrollToBottomButton()
     }

+ 15 - 14
AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+NaviBar.swift

@@ -38,18 +38,18 @@ extension TSChatViewController {
             make.left.equalTo(16)
         }
         
-        let setBtn = UIButton.createButton(image: UIImage(named: "setting")) { [weak self]  in
-            guard let self = self else { return }
-            let setingVC = TSSetingVC()
-            setingVC.hidesBottomBarWhenPushed = true
-            navigationController?.pushViewController(setingVC, animated: true)
-        }
-        navBarView.barView.addSubview(setBtn)
-        setBtn.snp.makeConstraints { make in
-            make.centerY.equalToSuperview()
-            make.trailing.equalTo(-16)
-            make.width.height.equalTo(24)
-        }
+//        let setBtn = UIButton.createButton(image: UIImage(named: "setting")) { [weak self]  in
+//            guard let self = self else { return }
+//            let setingVC = TSSetingVC()
+//            setingVC.hidesBottomBarWhenPushed = true
+//            navigationController?.pushViewController(setingVC, animated: true)
+//        }
+//        navBarView.barView.addSubview(setBtn)
+//        setBtn.snp.makeConstraints { make in
+//            make.centerY.equalToSuperview()
+//            make.trailing.equalTo(-16)
+//            make.width.height.equalTo(24)
+//        }
         
         let historyBtn = UIButton.createButton(image: UIImage(named: "aichat_history")) { [weak self]  in
             guard let self = self else { return }
@@ -60,14 +60,14 @@ extension TSChatViewController {
         navBarView.barView.addSubview(historyBtn)
         historyBtn.snp.makeConstraints { make in
             make.centerY.equalToSuperview()
-            make.trailing.equalTo(-60)
+            make.trailing.equalTo(-16)
             make.width.height.equalTo(24)
         }
         
         navBarView.barView.addSubview(vipBtn)
         vipBtn.snp.makeConstraints { make in
             make.centerY.equalToSuperview()
-            make.trailing.equalTo(-104)
+            make.trailing.equalTo(-60)
             make.width.height.equalTo(24)
         }
         
@@ -91,6 +91,7 @@ extension TSChatViewController {
         setTitleText(pageTitle)
         _ = setNavigationItem(backTitle, imageName: "navi_back_white", direction: .left, action: #selector(navBarClickLeftAction))
     }
+    
     @objc public func navBarClickLeftAction() {
         debugPrint("navBarClickLeftAction -> \(type(of: self))")
         pop()

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

@@ -57,8 +57,10 @@ class TSChatViewController: MessagesViewController, MessagesDataSource {
     }()
     
     override func viewDidLoad() {
+        //在父类前先设置好inputBarType,否则会先加载默认白色,再加载自定义黑色,会一闪而过白色默认的
+        setUpInputBarType()
+        
         super.viewDidLoad()
-       
         configureNaviBarView()
         configureMessageCollectionView()
         configureMessageInputBar()

+ 14 - 14
AIEmoji/Business/TSEmojisVC/TSEmojisVC/TSEmojisVC.swift

@@ -34,23 +34,23 @@ class TSEmojisVC: TSBaseVC {
             make.leading.equalTo(16)
         }
         
-        let setBtn = UIButton.createButton(image: UIImage(named: "setting")) { [weak self]  in
-            guard let self = self else { return }
-            let setingVC = TSSetingVC()
-            setingVC.hidesBottomBarWhenPushed = true
-            navigationController?.pushViewController(setingVC, animated: true)
-        }
-        navBarView.barView.addSubview(setBtn)
-        setBtn.snp.makeConstraints { make in
-            make.centerY.equalToSuperview()
-            make.trailing.equalTo(-16)
-            make.width.height.equalTo(24)
-        }
+//        let setBtn = UIButton.createButton(image: UIImage(named: "setting")) { [weak self]  in
+//            guard let self = self else { return }
+//            let setingVC = TSSetingVC()
+//            setingVC.hidesBottomBarWhenPushed = true
+//            navigationController?.pushViewController(setingVC, animated: true)
+//        }
+//        navBarView.barView.addSubview(setBtn)
+//        setBtn.snp.makeConstraints { make in
+//            make.centerY.equalToSuperview()
+//            make.trailing.equalTo(-16)
+//            make.width.height.equalTo(24)
+//        }
         
         navBarView.barView.addSubview(vipBtn)
         vipBtn.snp.makeConstraints { make in
             make.centerY.equalToSuperview()
-            make.trailing.equalTo(-62)
+            make.trailing.equalTo(-16)
             make.width.height.equalTo(24)
         }
 
@@ -143,7 +143,7 @@ class TSEmojisVC: TSBaseVC {
     
     
     @objc func clickBanner() {
-        let vc = TSEmojisTutorialsVC()
+        let vc = TSGenmojiVC()
         vc.hidesBottomBarWhenPushed = true
         navigationController?.pushViewController(vc, animated: true)
     }

+ 40 - 36
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/TSGenmojiVC.swift

@@ -19,38 +19,38 @@ class TSGenmojiVC: TSBaseVC {
         return vipBtn
     }()
     
-    lazy var navBarView: TSBaseNavContentBarView = {
-        let navBarView = TSBaseNavContentBarView()
-        
-        let titleImageView = UIImageView.createImageView(imageName: "nav_title_genmoji",contentMode: .scaleToFill)
-        navBarView.barView.addSubview(titleImageView)
-        titleImageView.snp.makeConstraints { make in
-            make.centerY.equalToSuperview()
-            make.left.equalTo(16)
-        }
-        
-        let setBtn = UIButton.createButton(image: UIImage(named: "setting")) { [weak self]  in
-            guard let self = self else { return }
-            let setingVC = TSSetingVC()
-            setingVC.hidesBottomBarWhenPushed = true
-            navigationController?.pushViewController(setingVC, animated: true)
-        }
-        navBarView.barView.addSubview(setBtn)
-        setBtn.snp.makeConstraints { make in
-            make.centerY.equalToSuperview()
-            make.trailing.equalTo(-16)
-            make.width.height.equalTo(24)
-        }
-        
-        navBarView.barView.addSubview(vipBtn)
-        vipBtn.snp.makeConstraints { make in
-            make.centerY.equalToSuperview()
-            make.trailing.equalTo(-62)
-            make.width.height.equalTo(24)
-        }
-        
-        return navBarView
-    }()
+//    lazy var navBarView: TSBaseNavContentBarView = {
+//        let navBarView = TSBaseNavContentBarView()
+//        
+//        let titleImageView = UIImageView.createImageView(imageName: "nav_title_genmoji",contentMode: .scaleToFill)
+//        navBarView.barView.addSubview(titleImageView)
+//        titleImageView.snp.makeConstraints { make in
+//            make.centerY.equalToSuperview()
+//            make.left.equalTo(16)
+//        }
+//        
+//        let setBtn = UIButton.createButton(image: UIImage(named: "setting")) { [weak self]  in
+//            guard let self = self else { return }
+//            let setingVC = TSSetingVC()
+//            setingVC.hidesBottomBarWhenPushed = true
+//            navigationController?.pushViewController(setingVC, animated: true)
+//        }
+//        navBarView.barView.addSubview(setBtn)
+//        setBtn.snp.makeConstraints { make in
+//            make.centerY.equalToSuperview()
+//            make.trailing.equalTo(-16)
+//            make.width.height.equalTo(24)
+//        }
+//        
+//        navBarView.barView.addSubview(vipBtn)
+//        vipBtn.snp.makeConstraints { make in
+//            make.centerY.equalToSuperview()
+//            make.trailing.equalTo(-62)
+//            make.width.height.equalTo(24)
+//        }
+//        
+//        return navBarView
+//    }()
     
     
     lazy var collectionComponent: TSCollectionViewComponent = {
@@ -102,10 +102,14 @@ class TSGenmojiVC: TSBaseVC {
 
     override func createView() {
         edgesForExtendedLayout = []
-        navBarContentView.addSubview(navBarView)
-        navBarView.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
-        }
+        
+        addNormalNavBarView()
+        setPageTitle("AI Text to Emoji".localized)
+        
+//        navBarContentView.addSubview(navBarView)
+//        navBarView.snp.makeConstraints { make in
+//            make.edges.equalToSuperview()
+//        }
         
         contentView.addSubview(collectionComponent.collectionView)
         collectionComponent.collectionView.snp.makeConstraints { make in

+ 24 - 12
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/ViewModel/TSGenmojiCollectionViewModel.swift

@@ -8,6 +8,10 @@
 
 import ObjectMapper
 
+private let kTextPicHistoryScale = 165.0/293.0  //UI 设置尺寸
+private let kTextPicHistoryW = k_ScreenWidth-32.0-12.0
+private let kTextPicHistoryH = kTextPicHistoryW/kTextPicHistoryScale
+
 class TSGenmojiColViewModel: TSBaseModel {
     
     lazy var generateSectionModel: TSGenmojiCoLSectionModel = {
@@ -21,59 +25,67 @@ class TSGenmojiColViewModel: TSBaseModel {
 
 //MARK: TSGenmojiCoLStyple
 enum TSGenmojiCoLStyple : Int {
-    case generate //创造 AI 图
-    case history  //创造后的历史记录
-    
+    case generate //创造Genmoji AI 图
+    case history  //创造Genmoji 后的历史记录
+    case textPicGenerate  //创造文生图后 AI 图
+    case textPicHistory  //创造文生图后的历史记录
     var sectionInset: UIEdgeInsets {
         switch self {
-        case .generate:
+        case .generate,.textPicGenerate:
             return UIEdgeInsets(top: 17, left: 17, bottom: 20, right: 15)
-        case .history:
+        case .history,.textPicHistory:
             return UIEdgeInsets(top: 0, left: 24, bottom: 10, right: 24)
         }
     }
         
     var lineSpacing: CGFloat {
         switch self {
-        case .generate:
+        case .generate,.textPicGenerate:
             return 0
         case .history:
             return 16
+        case .textPicHistory:
+            return 13
         }
     }
     
     var itemSpacing: CGFloat {
         switch self {
-        case .generate:
+        case .generate,.textPicGenerate:
             return 0
         case .history:
             return 16
+        case .textPicHistory:
+            return 13
         }
     }
+
     
     var cellSize:CGSize {
         switch self {
-        case .generate:
+        case .generate,.textPicGenerate:
             return CGSize(width: k_ScreenWidth-32, height: 303)
         case .history:
             return CGSize(width: 88, height: 88)
+        case .textPicHistory:
+            return CGSize(width: kTextPicHistoryW, height: kTextPicHistoryH)
         }
     }
     
     var cellClass: UICollectionViewCell.Type {
         switch self {
-        case .generate:
+        case .generate,.textPicGenerate:
             return TSGenmojiGennerateCell.self
-        case .history:
+        case .history,.textPicHistory:
             return TSGenmojiItemCell.self
         }
     }
     
     var headerViewSize:CGSize {
         switch self {
-        case .generate:
+        case .generate,.textPicGenerate:
             return CGSize.zero
-        case .history:
+        case .history,.textPicHistory:
             return CGSizeMake(k_ScreenWidth, 60)
         }
     }

+ 5 - 3
AIEmoji/Business/TSSetingVC/SetingVC/TSSetingVC.swift

@@ -29,11 +29,13 @@ class TSSetingVC: TSBaseVC {
     }()
     
     override func createView() {
-        addNormalNavBarView()
-        setPageTitle("Setting")
+        edgesForExtendedLayout = []
+        setNavBarViewHidden(true)
+        
         contentView.addSubview(hostVc.view)
         hostVc.view.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
+            make.top.equalTo(k_Height_NavBar)
+            make.leading.trailing.bottom.equalToSuperview()
         }
     }
     

+ 18 - 22
AIEmoji/Business/TSTabBarController/TSTabBarController.swift

@@ -24,20 +24,19 @@ class TSTabBarController: UITabBarController {
     }
 
     @objc private func setUpData() {
-//        viewControllerArray = ["TSEmojisVC", "TSGenmojiVC","TSAIChatContainerVC", "TSWallpaperVC"]
-        viewControllerArray = ["TSEmojisVC", "TSGenmojiVC","TSChatViewController", "TSWallpaperVC"]
-        titleArray = ["Emojis","Genmoji","AIChat","Wallpaper"]
+        viewControllerArray = ["TSChatViewController", "TSTextGeneralPictureVC","TSEmojisVC", "TSSetingVC"]
+        titleArray = ["AIChat","AI Wallpaper","Emojis","Setting"]
         selectedImageArray = [
-            "tabbar_select_emoji",
-            "tabbar_select_aiemoji",
             "tabbar_select_aichat",
-            "tabbar_select_keyboard"
+            "tabbar_select_pic",
+            "tabbar_select_emoji",
+            "tabbar_select_setting"
         ]
         unselectedImageArray = [
-            "tabbar_unSelect_emoji",
-            "tabbar_unSelect_aiemoji",
             "tabbar_unSelect_aichat",
-            "tabbar_unSelect_keyboard"
+            "tabbar_unSelect_pic",
+            "tabbar_unSelect_emoji",
+            "tabbar_unSelect_setting"
         ]
 
         var tabArray: [UINavigationController] = []
@@ -62,9 +61,6 @@ class TSTabBarController: UITabBarController {
 
     private func createUI() {
         tabBar.barStyle = .black
-        tabBar.isTranslucent = true
-        
-        
         tabBar.isTranslucent = false
         tabBar.backgroundColor = "#262626".uiColor
         tabBar.backgroundImage = UIImage.colorFrom(color: tabBar.backgroundColor!, size: CGSize(width: k_ScreenWidth, height: k_TabBar_Height))
@@ -73,7 +69,7 @@ class TSTabBarController: UITabBarController {
         UITabBar.appearance().unselectedItemTintColor = .white.withAlphaComponent(0.4)// 未选中颜色
         UITabBar.appearance().tintColor = UIColor.themeColor // 选中颜色
         
-        delegate = self
+//        delegate = self
     }
 
     private func tabBarItem(title: String, image: UIImage?, selectedImage: UIImage?, tag: Int) -> UITabBarItem {
@@ -94,12 +90,12 @@ class TSTabBarController: UITabBarController {
 }
 
 
-extension TSTabBarController:UITabBarControllerDelegate {
-    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool{
-        if interceptVC == viewController{
-            kPresentModalVC(target: self, modelVC: TSWallpaperVC())
-            return false
-        }
-        return true
-    }
-}
+//extension TSTabBarController:UITabBarControllerDelegate {
+//    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool{
+//        if interceptVC == viewController{
+//            kPresentModalVC(target: self, modelVC: TSWallpaperVC())
+//            return false
+//        }
+//        return true
+//    }
+//}

+ 156 - 0
AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/TSTextGeneralPictureVC.swift

@@ -0,0 +1,156 @@
+//
+//  TSTextGeneralPictureVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/2/19.
+//
+
+class TSTextGeneralPictureVC: TSBaseVC {
+    
+    var viewModel:TSTextGeneralPictureVM = TSTextGeneralPictureVM()
+    
+    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()
+       
+       let titleImageView = UIImageView.createImageView(imageName: "nav_title_pic",contentMode: .scaleToFill)
+       navBarView.barView.addSubview(titleImageView)
+       titleImageView.snp.makeConstraints { make in
+           make.centerY.equalToSuperview()
+           make.left.equalTo(16)
+       }
+       
+       let keyboardBtn = UIButton.createButton(image: UIImage(named: "keyboard")) { [weak self]  in
+           guard let self = self else { return }
+//           let vc = TSWallpaperVC()
+//           vc.hidesBottomBarWhenPushed = true
+//           navigationController?.pushViewController(vc, animated: true)
+           
+           kPresentModalVC(target: self, modelVC: TSWallpaperVC())
+       }
+       navBarView.barView.addSubview(keyboardBtn)
+        keyboardBtn.snp.makeConstraints { make in
+           make.centerY.equalToSuperview()
+           make.trailing.equalTo(-16)
+           make.width.height.equalTo(24)
+       }
+       
+       navBarView.barView.addSubview(vipBtn)
+       vipBtn.snp.makeConstraints { make in
+           make.centerY.equalToSuperview()
+           make.trailing.equalTo(-60)
+           make.width.height.equalTo(24)
+       }
+       
+       return navBarView
+   }()
+    
+    lazy var collectionComponent: TSCollectionViewComponent = {
+        let layout = UICollectionViewFlowLayout()
+        let cp = TSCollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [ :])
+        cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: k_Height_TabBar, right: 0)
+        cp.itemActionHandler = { [weak self] cellCp, indexPath in
+            guard let self = self else { return }
+            if let text = cellCp as? String ,indexPath == IndexPath(item: 0, section: 0) {
+                generateImage(text: text)
+            }
+        }
+        
+        cp.sectionActionHandler = { [weak self] cellCp, indexPath in
+            guard let self = self else { return }
+            if let cmd = cellCp as? String, cmd == "delete"  {
+                showCustomAlert(message: "Are you sure to delete".localized, deleteHandler:  {
+                    self.viewModel.removeAllHistoryList()
+                    self.collectionComponent.clear()
+                    self.collectionComponent.reloadView(with: self.viewModel.colDataArray)
+                })
+            }
+        }
+        
+        cp.itemDidSelectedHandler = { [weak self] (object, indexPath) in
+            guard let self = self else { return }
+            view.endEditing(true)
+            if indexPath.section == 0{
+                return
+            }
+            
+            if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel{
+                var dataModelArray:[TSGenmojiModel] = []
+                for itemModel in sections.items {
+                    dataModelArray.append(itemModel.dataModel)
+                }
+                
+                let browseVC = TSSmallIconBrowseVC()
+                browseVC.dataModelArray = dataModelArray
+                browseVC.currentIndex = indexPath.item
+                kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)
+            }
+
+
+        }
+
+        return cp
+    }()
+
+    override func createView() {
+    
+        navBarContentView.addSubview(navBarView)
+        navBarView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        contentView.addSubview(collectionComponent.collectionView)
+        collectionComponent.collectionView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        
+        collectionComponent.clear()
+        collectionComponent.reloadView(with:viewModel.colDataArray)
+        
+    }
+    
+    override func dealThings() {
+        vipBtn.isHidden = PurchaseManager.default.isVip
+        NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
+    }
+    
+    @objc func vipInfoChanged() {
+        kExecuteOnMainThread {
+            self.vipBtn.isHidden = PurchaseManager.default.isVip
+            self.collectionComponent.reloadData()
+        }
+    }
+}
+
+extension TSTextGeneralPictureVC {
+    func generateImage(text:String) {
+        
+        //判断 vip
+        if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: .generatePic) == false, vc: self) {[weak self] in
+            guard let self = self else { return }
+        }{ return }
+        
+        let gennerateVC = TSTextPicGennerateVC(aiText: text) {[weak self] model in
+            guard let self = self else { return }
+            if viewModel.saveModel(model:model) {
+                collectionComponent.clear()
+                collectionComponent.reloadView(with:viewModel.colDataArray)
+            }else{
+                collectionComponent.reloadData()
+            }
+        }
+        
+        kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
+    }
+}

+ 117 - 0
AIEmoji/Business/TSTextGeneralPictureVC/TSTextGeneralPictureVC/ViewModel/TSTextGeneralPictureVM.swift

@@ -0,0 +1,117 @@
+//
+//  TSTextGeneralPictureVM.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/2/20.
+//
+
+import ObjectMapper
+
+class TSTextGeneralPictureVM {
+    var colDataArray:[TSComponent] = [TSComponent]()
+
+    lazy var generateSectionModel: TSGenmojiCoLSectionModel = {
+        let generateSectionModel = TSGenmojiCoLSectionModel()
+        generateSectionModel.style = .textPicGenerate
+        generateSectionModel.name = ""
+        
+        let itemModel = TSGenmojiCoLItemModel()
+        itemModel.style = .textPicGenerate
+        generateSectionModel.items = [itemModel]
+        
+        return generateSectionModel
+    }()
+    
+    //历史记录
+    @UserDefault(key: "textPicHistoryListString", defaultValue: "")
+    private var enmojiHistoryListString: String
+    
+    
+    lazy var listModelArray: [TSGenmojiModel] = {
+        if let listModelArray = Mapper<TSGenmojiModel>().mapArray(JSONString: enmojiHistoryListString){
+            return listModelArray
+        }
+        return []
+    }()
+    
+    lazy var enmojiHistorySeciton: TSGenmojiCoLSectionModel = {
+        let sectionModel = TSGenmojiCoLSectionModel()
+        sectionModel.style = .textPicHistory
+        sectionModel.name = "History".localized
+        for model in listModelArray {
+            let itemModel = TSGenmojiCoLItemModel()
+            itemModel.style = sectionModel.style
+            itemModel.dataModel = model
+            sectionModel.items.append(itemModel)
+        }
+        return sectionModel
+    }()
+    
+    
+
+    init() {
+        combinedData()
+    }
+    
+    func combinedData(){
+        colDataArray.removeAll()
+        colDataArray.append(generateSectionModel)
+        if enmojiHistorySeciton.items.count > 0 {
+            colDataArray.append(enmojiHistorySeciton)
+        }
+    }
+    
+}
+ 
+extension TSTextGeneralPictureVM {
+    //历史记录
+    var modelArray:[TSGenmojiModel]{
+        get{
+            let sectionModel = TSGenmojiCoLSectionModel()
+            sectionModel.style = .textPicHistory
+            sectionModel.name = "History".localized
+        
+            if let modelArray = Mapper<TSGenmojiModel>().mapArray(JSONString: enmojiHistoryListString){
+                return modelArray
+            }
+            return []
+        }
+        set{
+            if let jsonString = newValue.toJSONString() {
+                enmojiHistoryListString = jsonString
+            }
+        }
+    }
+    
+    //返回值,是否需要清空后刷新
+    func saveModel(model:TSGenmojiModel)->Bool{
+        listModelArray.insert(model, at: 0)
+        if let jsonString = listModelArray.toJSONString() {
+            enmojiHistoryListString = jsonString
+        }
+        var isNeed = false
+        if enmojiHistorySeciton.items.count == 0 {
+            colDataArray.append(enmojiHistorySeciton)
+            isNeed = true
+        }
+          
+        let colItemModel = TSGenmojiCoLItemModel()
+        colItemModel.style = .textPicHistory
+        colItemModel.dataModel = model
+        enmojiHistorySeciton.items.insert(colItemModel, at: 0)
+        return isNeed
+    }
+    
+    
+    
+    func removeAllHistoryList(){
+        listModelArray.removeAll()
+        if let jsonString = listModelArray.toJSONString() {
+            enmojiHistoryListString = jsonString
+        }
+        
+        enmojiHistorySeciton.items.removeAll()
+        colDataArray.removeLast()
+    }
+    
+}

+ 166 - 0
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVC.swift

@@ -0,0 +1,166 @@
+//
+//  TSTextPicGennerateVC.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/2/20.
+//
+
+class TSTextPicGennerateVC: TSBottomAlertVC {
+    
+    var imageModel:TSGenmojiModel?
+    var complete:((TSGenmojiModel)->Void)
+    var aiText:String
+    init(aiText: String,complete:@escaping ((TSGenmojiModel)->Void)) {
+        self.aiText = aiText
+        self.complete = complete
+        super.init()
+    }
+    
+    var viewModel:TSTextPicGennerateVM = TSTextPicGennerateVM()
+    @MainActor required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+    
+    lazy var netWorkImageView : UIImageView = {
+        let netWorkImageView = UIImageView.createImageView(imageName: "",corner: 24.0)
+        return netWorkImageView
+    }()
+    
+    
+    lazy var generateInView : TSCommonloadingView = {
+        let generateInView = TSCommonloadingView()
+        return generateInView
+    }()
+    
+    override func createView() {
+        super.createView()
+        
+        bottomView.frame = CGRectMake(0, 92, k_ScreenWidth, k_ScreenHeight-92)
+        
+        bottomView.addSubview(generateInView)
+        generateInView.snp.makeConstraints { make in
+            make.center.equalToSuperview()
+        }
+        
+        bottomView.addSubview(netWorkImageView)
+        netWorkImageView.snp.makeConstraints { make in
+            make.top.equalTo(94)
+            make.centerX.equalToSuperview()
+            make.width.equalTo(249*kDesignScale)
+            make.height.equalTo(441*kDesignScale)
+        }
+        
+    }
+    
+    override func closePage() {
+        if let model = imageModel {
+            complete(model)
+        }
+        self.dismiss(animated: true, completion: nil)
+    }
+    
+    
+    
+    @objc override func clickSubmitBtn(){
+        viewModel.creatImageEmoji(text:aiText)
+    }
+    
+    @objc override func clickCancelBtn(){
+        if let image = getSuccessImage() {
+            UIDevice.copyImage(image: image)
+            kSavePhotoSuccesswShared.show(atView: self.view,text: "Copy Successfully".localized,showViewBtn:false)
+        }
+    }
+    
+    @objc override func clickConfirmBtn(){
+        if let image = getSuccessImage() {
+            PhotoManagerShared.saveImageToAlbum(image) { success, error in
+                if success {
+                    kSavePhotoSuccesswShared.show(atView:self.view)
+                }else{
+                    debugPrint(error)
+                }
+            }
+        }
+    }
+    
+    
+    override func dealThings() {
+        viewModel.creatImageEmoji(text: self.aiText)
+        viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self]  (state,model) in
+            guard let self = self else { return }
+            self.upDateView(state: state, model: model)
+        }.store(in: &cancellable)
+    }
+}
+extension TSTextPicGennerateVC {
+    
+    
+    func getSuccessImage()->UIImage?{
+        if let image = netWorkImageView.image {
+            return image.pngImage
+        }
+        return nil
+    }
+    
+}
+extension TSTextPicGennerateVC {
+    func upDateView(state:TSProgressState,model:TSGenmojiModel?){
+        switch state {
+            case .failed(let errorStr):
+            showError(text: errorStr)
+            case .success:
+                if let model = model {
+                    showSuccess(model: model)
+                }else{
+                    showError(text: nil)
+                }
+            default:
+                showLoading()
+        }
+    }
+    
+    func showLoading(){
+        generateInView.isHidden = false
+        generateInView.showLoading(text: "Generating...".localized)
+        generateInView.isRotating = true
+        submitBtn.isHidden = true
+        cancelBtn.isHidden = true
+        confirmBtn.isHidden = true
+        xBtn.isHidden = false
+        isClickTheBlankClosePage = false
+    }
+    
+    func showError(text:String?){
+        let msg = "Failed to Generate, please try later".localized
+        generateInView.isHidden = false
+        generateInView.showError(text: msg)
+        generateInView.isRotating = false
+        submitBtn.isHidden = false
+        cancelBtn.isHidden = true
+        confirmBtn.isHidden = true
+        xBtn.isHidden = false
+        isClickTheBlankClosePage = true
+    }
+    
+    func showSuccess(model:TSGenmojiModel){
+        generateInView.isHidden = true
+        generateInView.isRotating = false
+        submitBtn.isHidden = true
+        cancelBtn.isHidden = false
+        confirmBtn.isHidden = false
+        xBtn.isHidden = false
+        imageModel = model
+        isClickTheBlankClosePage = true
+        
+        cancelBtn.isEnabled = false
+        confirmBtn.isEnabled = false
+        self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage){ [weak self] image in
+            guard let self = self else { return }
+            cancelBtn.isEnabled = true
+            confirmBtn.isEnabled = true
+        }
+        
+        kPurchaseDefault.useOnceForFree(type: .generatePic)
+    }
+}

+ 57 - 0
AIEmoji/Business/TSTextGeneralPictureVC/TSTextPicGennerateVC/TSTextPicGennerateVM.swift

@@ -0,0 +1,57 @@
+//
+//  TSTextPicGennerateVM.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/2/20.
+//
+
+import Combine
+
+class TSTextPicGennerateVM {
+   
+    @Published var stateDatauPblished:(TSProgressState,TSGenmojiModel?) = (TSProgressState.none,nil)
+    var aiText:String = ""
+    
+    //width 和 height 必须是 32 的倍数
+    func creatImageEmoji(text:String,width:Int = 384 ,height:Int = 832) {
+        aiText = text
+        let postDict:[String : Any] = [
+            "prompt":text,
+            "width":width,
+            "height":height
+        ]
+        stateDatauPblished = (.start,nil)
+        TSNetworkShared.post(urlType: .textPicCreate,parameters: postDict) { data,error in
+            if let dataDict = data as? [String:Any] ,
+               dataDict.safeInt(forKey: "code") == 200,
+               let actionId = dataDict["actionId"] as? Int{
+                self.getActionInfo(action_id:actionId)
+            }else{
+                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+            }
+        }
+    }
+    
+    func getActionInfo(action_id:Int){
+        TSNetworkShared.get(urlType: .actionInfo,parameters: ["action_id":action_id]) { data,error in
+            if let result = kNetWorkResultSuccess(data: data) {
+                if let genmojiModel = TSGenmojiModel(JSON: result) {
+                    switch genmojiModel.actionStatus {
+                    case .success:
+                        TSToastShared.hideLoading()
+                        self.stateDatauPblished = (.success(nil),genmojiModel)
+                    case .failed:
+                        self.stateDatauPblished = (.failed(kNetWorkMessage(data: data) ?? ""),nil)
+                    default:
+                        kDelayOnMainThread(1.0) {
+                            self.getActionInfo(action_id: action_id)
+                        }
+                    }
+                }
+            }else{
+                self.stateDatauPblished = (.failed(error?.localizedDescription ?? ""),nil)
+            }
+        }
+    }
+    
+}

+ 6 - 3
AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift

@@ -10,9 +10,12 @@ private let baseURL = "http://ai.100yearslater.com"
 import Alamofire
 enum TSNeURLType:String {
     
-    case imageEmoji = "/api/image/emoji"
-    case actionInfo = "/api/action/info"
-    case chat = "/api/text/chat"
+    case imageEmoji = "/api/image/emoji"        //文生emoji
+    case actionInfo = "/api/action/info"        //查询生成过程接口
+    case chat = "/api/text/chat"                //AI 对话接口
+    case textPicCreate = "/api/image/create"     //文生图
+    
+    
     
     func getUrlString() -> String {
         return baseURL + self.rawValue

+ 2 - 2
AIEmoji/Common/NetworkManager/TSNetWork/TSNetworkManager.swift

@@ -133,7 +133,7 @@ class TSNetworkManager {
                        response: AFDataResponse<String>,
                        completion: @escaping (Result<Any, Error>) -> Void){
         dePrint("🚗🚗🚗网络请求成功:\(String(describing: response.request?.url?.absoluteString))")
-        dePrint(response)
+        dePrint("🚗🚗🚗网络请求成功:\(response)")
         completion(.success(data))
        }
     
@@ -141,7 +141,7 @@ class TSNetworkManager {
                     response: AFDataResponse<String>,
                     completion: @escaping (Result<Any, Error>) -> Void){
         dePrint("🚗🚗🚗网络请求失败:\(String(describing: response.request?.url?.absoluteString))")
-        dePrint(response)
+        dePrint("🚗🚗🚗网络请求失败:\(response)")
         completion(.failure(error))
     }