Browse Source

首页开发完毕

100Years 2 months ago
parent
commit
84dbdfacbc

+ 80 - 0
AIEmoji.xcodeproj/project.pbxproj

@@ -91,6 +91,20 @@
 		A8F776482D3DE9F600AA6E93 /* TSSmallIconBrowseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F776472D3DE9C200AA6E93 /* TSSmallIconBrowseCell.swift */; };
 		A8F7764B2D3E008500AA6E93 /* TSEmojisChildColViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7764A2D3E007100AA6E93 /* TSEmojisChildColViewModel.swift */; };
 		A8F7764E2D3E00A800AA6E93 /* TSEmojisColViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8F7764D2D3E00A000AA6E93 /* TSEmojisColViewModel.swift */; };
+		A8FB02B02D3E39080031A396 /* Universe🌍.json in Resources */ = {isa = PBXBuildFile; fileRef = A8FB02AF2D3E39010031A396 /* Universe🌍.json */; };
+		A8FB02B32D3E39A40031A396 /* TSEmojisModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FB02B22D3E399F0031A396 /* TSEmojisModel.swift */; };
+		A8FB02B72D3E3A3D0031A396 /* TSEmojisChildViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FB02B62D3E3A3B0031A396 /* TSEmojisChildViewModel.swift */; };
+		A8FB02BA2D3E3BB20031A396 /* TSEmojisCoLItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8FB02B92D3E3BB00031A396 /* TSEmojisCoLItemCell.swift */; };
+		A8FB02BC2D3E4D8E0031A396 /* Cat🐱.json in Sources */ = {isa = PBXBuildFile; fileRef = A8FB02BB2D3E4D8D0031A396 /* Cat🐱.json */; };
+		A8FB02BE2D3E4DA10031A396 /* Flower💐.json in Sources */ = {isa = PBXBuildFile; fileRef = A8FB02BD2D3E4D9C0031A396 /* Flower💐.json */; };
+		A8FB02C02D3E4DC50031A396 /* Fish🐠.json in Sources */ = {isa = PBXBuildFile; fileRef = A8FB02BF2D3E4DC20031A396 /* Fish🐠.json */; };
+		A8FB02C82D3E4ED70031A396 /* Beauty👸.json in Resources */ = {isa = PBXBuildFile; fileRef = A8FB02C12D3E4ED70031A396 /* Beauty👸.json */; };
+		A8FB02C92D3E4ED70031A396 /* Fruit🍊.json in Resources */ = {isa = PBXBuildFile; fileRef = A8FB02C62D3E4ED70031A396 /* Fruit🍊.json */; };
+		A8FB02CA2D3E4ED70031A396 /* Crystal🔮.json in Resources */ = {isa = PBXBuildFile; fileRef = A8FB02C22D3E4ED70031A396 /* Crystal🔮.json */; };
+		A8FB02CB2D3E4ED70031A396 /* Drink🥤.json in Resources */ = {isa = PBXBuildFile; fileRef = A8FB02C42D3E4ED70031A396 /* Drink🥤.json */; };
+		A8FB02CC2D3E4ED70031A396 /* Pink🩷.json in Resources */ = {isa = PBXBuildFile; fileRef = A8FB02C72D3E4ED70031A396 /* Pink🩷.json */; };
+		A8FB02CD2D3E4ED70031A396 /* Food🍔.json in Resources */ = {isa = PBXBuildFile; fileRef = A8FB02C52D3E4ED70031A396 /* Food🍔.json */; };
+		A8FB02CE2D3E4ED70031A396 /* Dog🐕.json in Resources */ = {isa = PBXBuildFile; fileRef = A8FB02C32D3E4ED70031A396 /* Dog🐕.json */; };
 		D34BB2B8FE0DBF83E06A3FC4 /* Pods_AIEmoji.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86FB4D6AEFDDA7A2017F307C /* Pods_AIEmoji.framework */; };
 /* End PBXBuildFile section */
 
@@ -182,6 +196,20 @@
 		A8F776472D3DE9C200AA6E93 /* TSSmallIconBrowseCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSSmallIconBrowseCell.swift; sourceTree = "<group>"; };
 		A8F7764A2D3E007100AA6E93 /* TSEmojisChildColViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisChildColViewModel.swift; sourceTree = "<group>"; };
 		A8F7764D2D3E00A000AA6E93 /* TSEmojisColViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisColViewModel.swift; sourceTree = "<group>"; };
+		A8FB02AF2D3E39010031A396 /* Universe🌍.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Universe🌍.json"; sourceTree = "<group>"; };
+		A8FB02B22D3E399F0031A396 /* TSEmojisModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisModel.swift; sourceTree = "<group>"; };
+		A8FB02B62D3E3A3B0031A396 /* TSEmojisChildViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisChildViewModel.swift; sourceTree = "<group>"; };
+		A8FB02B92D3E3BB00031A396 /* TSEmojisCoLItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSEmojisCoLItemCell.swift; sourceTree = "<group>"; };
+		A8FB02BB2D3E4D8D0031A396 /* Cat🐱.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Cat🐱.json"; sourceTree = "<group>"; };
+		A8FB02BD2D3E4D9C0031A396 /* Flower💐.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Flower💐.json"; sourceTree = "<group>"; };
+		A8FB02BF2D3E4DC20031A396 /* Fish🐠.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Fish🐠.json"; sourceTree = "<group>"; };
+		A8FB02C12D3E4ED70031A396 /* Beauty👸.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Beauty👸.json"; sourceTree = "<group>"; };
+		A8FB02C22D3E4ED70031A396 /* Crystal🔮.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Crystal🔮.json"; sourceTree = "<group>"; };
+		A8FB02C32D3E4ED70031A396 /* Dog🐕.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Dog🐕.json"; sourceTree = "<group>"; };
+		A8FB02C42D3E4ED70031A396 /* Drink🥤.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Drink🥤.json"; sourceTree = "<group>"; };
+		A8FB02C52D3E4ED70031A396 /* Food🍔.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Food🍔.json"; sourceTree = "<group>"; };
+		A8FB02C62D3E4ED70031A396 /* Fruit🍊.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Fruit🍊.json"; sourceTree = "<group>"; };
+		A8FB02C72D3E4ED70031A396 /* Pink🩷.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = "Pink🩷.json"; sourceTree = "<group>"; };
 		CA9B99CBEC45A6004629E790 /* Pods-AIEmoji.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIEmoji.debug.xcconfig"; path = "Target Support Files/Pods-AIEmoji/Pods-AIEmoji.debug.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -236,6 +264,7 @@
 		A8F7748A2D38E8B700AA6E93 /* AIEmoji */ = {
 			isa = PBXGroup;
 			children = (
+				A8FB02AE2D3E38FA0031A396 /* Res */,
 				A8F7751E2D38ED4500AA6E93 /* DataManger */,
 				A8F774922D38EA8C00AA6E93 /* Business */,
 				A8F774D82D38EA8C00AA6E93 /* Common */,
@@ -532,6 +561,8 @@
 		A8F7761E2D3A3DB400AA6E93 /* TSEmojisChildVC */ = {
 			isa = PBXGroup;
 			children = (
+				A8FB02B82D3E3B970031A396 /* VIew */,
+				A8FB02B12D3E39750031A396 /* Model */,
 				A8F776492D3E006200AA6E93 /* ViewModel */,
 				A8F776202D3A3F0100AA6E93 /* TSEmojisChildVC.swift */,
 			);
@@ -631,6 +662,7 @@
 		A8F776492D3E006200AA6E93 /* ViewModel */ = {
 			isa = PBXGroup;
 			children = (
+				A8FB02B62D3E3A3B0031A396 /* TSEmojisChildViewModel.swift */,
 				A8F7764A2D3E007100AA6E93 /* TSEmojisChildColViewModel.swift */,
 			);
 			path = ViewModel;
@@ -644,6 +676,40 @@
 			path = ViewModel;
 			sourceTree = "<group>";
 		};
+		A8FB02AE2D3E38FA0031A396 /* Res */ = {
+			isa = PBXGroup;
+			children = (
+				A8FB02C12D3E4ED70031A396 /* Beauty👸.json */,
+				A8FB02C22D3E4ED70031A396 /* Crystal🔮.json */,
+				A8FB02C32D3E4ED70031A396 /* Dog🐕.json */,
+				A8FB02C42D3E4ED70031A396 /* Drink🥤.json */,
+				A8FB02C52D3E4ED70031A396 /* Food🍔.json */,
+				A8FB02C62D3E4ED70031A396 /* Fruit🍊.json */,
+				A8FB02C72D3E4ED70031A396 /* Pink🩷.json */,
+				A8FB02BF2D3E4DC20031A396 /* Fish🐠.json */,
+				A8FB02BD2D3E4D9C0031A396 /* Flower💐.json */,
+				A8FB02BB2D3E4D8D0031A396 /* Cat🐱.json */,
+				A8FB02AF2D3E39010031A396 /* Universe🌍.json */,
+			);
+			path = Res;
+			sourceTree = "<group>";
+		};
+		A8FB02B12D3E39750031A396 /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				A8FB02B22D3E399F0031A396 /* TSEmojisModel.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
+		A8FB02B82D3E3B970031A396 /* VIew */ = {
+			isa = PBXGroup;
+			children = (
+				A8FB02B92D3E3BB00031A396 /* TSEmojisCoLItemCell.swift */,
+			);
+			path = VIew;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -708,6 +774,14 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				A8FB02C82D3E4ED70031A396 /* Beauty👸.json in Resources */,
+				A8FB02C92D3E4ED70031A396 /* Fruit🍊.json in Resources */,
+				A8FB02CA2D3E4ED70031A396 /* Crystal🔮.json in Resources */,
+				A8FB02CB2D3E4ED70031A396 /* Drink🥤.json in Resources */,
+				A8FB02CC2D3E4ED70031A396 /* Pink🩷.json in Resources */,
+				A8FB02CD2D3E4ED70031A396 /* Food🍔.json in Resources */,
+				A8FB02CE2D3E4ED70031A396 /* Dog🐕.json in Resources */,
+				A8FB02B02D3E39080031A396 /* Universe🌍.json in Resources */,
 				A8F7748E2D38E8B700AA6E93 /* Assets.xcassets in Resources */,
 				A8F774902D38E8B700AA6E93 /* LaunchScreen.storyboard in Resources */,
 			);
@@ -765,7 +839,9 @@
 				A8F775252D38ED8300AA6E93 /* TSConfig.swift in Sources */,
 				A8F774D92D38EA8C00AA6E93 /* UICollectionView+More.swift in Sources */,
 				A8F774DA2D38EA8C00AA6E93 /* UIFont+Ex.swift in Sources */,
+				A8FB02B32D3E39A40031A396 /* TSEmojisModel.swift in Sources */,
 				A8F774DB2D38EA8C00AA6E93 /* AVAsset+Ex.swift in Sources */,
+				A8FB02BE2D3E4DA10031A396 /* Flower💐.json in Sources */,
 				A8F7764E2D3E00A800AA6E93 /* TSEmojisColViewModel.swift in Sources */,
 				A8F776422D3B75FC00AA6E93 /* TSBottomAlertVC.swift in Sources */,
 				A8F774DC2D38EA8C00AA6E93 /* NSString+Ex.swift in Sources */,
@@ -793,6 +869,7 @@
 				A8F775502D39ECED00AA6E93 /* PhotoManager.swift in Sources */,
 				A8F7763F2D3B68E100AA6E93 /* TSGenmojiGennerateViewModel.swift in Sources */,
 				A8F775352D38FC9A00AA6E93 /* TSViewTool.swift in Sources */,
+				A8FB02C02D3E4DC50031A396 /* Fish🐠.json in Sources */,
 				A8F774ED2D38EA8C00AA6E93 /* Font+Ex.swift in Sources */,
 				A8F774EE2D38EA8C00AA6E93 /* UIViewController+Ex.swift in Sources */,
 				A8F774EF2D38EA8C00AA6E93 /* UIImage+Ex.swift in Sources */,
@@ -800,6 +877,7 @@
 				A8F774F12D38EA8C00AA6E93 /* CGFloat+Ex.swift in Sources */,
 				A8F774F22D38EA8C00AA6E93 /* TSBaseView.swift in Sources */,
 				A8F774F42D38EA8C00AA6E93 /* TSBaseNavigationBarView.swift in Sources */,
+				A8FB02BC2D3E4D8E0031A396 /* Cat🐱.json in Sources */,
 				A8F774F52D38EA8C00AA6E93 /* Array+Ex.swift in Sources */,
 				A8F775172D38EB7400AA6E93 /* TSTabBarController.swift in Sources */,
 				A8F774F62D38EA8C00AA6E93 /* UIImageView+Ex.swift in Sources */,
@@ -823,6 +901,7 @@
 				A8F776482D3DE9F600AA6E93 /* TSSmallIconBrowseCell.swift in Sources */,
 				A8F7753D2D3918F800AA6E93 /* TSNetWork+Business.swift in Sources */,
 				A8F775282D38F08C00AA6E93 /* IBaseResponse.swift in Sources */,
+				A8FB02BA2D3E3BB20031A396 /* TSEmojisCoLItemCell.swift in Sources */,
 				A8F775292D38F08C00AA6E93 /* INetConfiguration.swift in Sources */,
 				A8F7751D2D38ECA700AA6E93 /* TSWallpaperVC.swift in Sources */,
 				A8F775032D38EA8C00AA6E93 /* GlobalImports.swift in Sources */,
@@ -841,6 +920,7 @@
 				A8F775382D390C3C00AA6E93 /* TSNetworkManager.swift in Sources */,
 				A8F7750B2D38EA8C00AA6E93 /* TSBaseTabViewCell.swift in Sources */,
 				A8F7750D2D38EA8C00AA6E93 /* TSBaseVC.swift in Sources */,
+				A8FB02B72D3E3A3D0031A396 /* TSEmojisChildViewModel.swift in Sources */,
 				A8F7754B2D39376800AA6E93 /* TSSettingListView.swift in Sources */,
 				A8F7748B2D38E8B700AA6E93 /* AppDelegate.swift in Sources */,
 			);

+ 22 - 0
AIEmoji/Assets.xcassets/Emojis/emojis_banner.imageset/Contents.json

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

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


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


+ 2 - 4
AIEmoji/Business/General/TSSmallIconBrowseVC/TSSmallIconBrowseVC.swift

@@ -34,8 +34,7 @@ class TSSmallIconBrowseVC: TSBottomAlertVC {
     lazy var leftBtn: UIButton = {
         let leftBtn = UIButton.createButton(image: UIImage(named: "page_left")){ [weak self]  in
             guard let self = self else { return }
-            self.collectionView.setContentOffset(CGPoint(x: CGFloat(self.currentIndex-1) * self.collectionView.frame.size.width, y: 0), animated: false)
-            
+            self.collectionView.scrollToItem(at:  IndexPath(item: self.currentIndex+1, section: 0), at: .left, animated: true)
         }
         return leftBtn
     }()
@@ -43,8 +42,7 @@ class TSSmallIconBrowseVC: TSBottomAlertVC {
     lazy var rightBtn: UIButton = {
         let rightBtn = UIButton.createButton(image: UIImage(named: "page_right")){ [weak self]  in
             guard let self = self else { return }
-            
-            self.collectionView.setContentOffset(CGPoint(x: CGFloat(self.currentIndex+1) * self.collectionView.frame.size.width, y: 0), animated: false)
+            self.collectionView.scrollToItem(at: IndexPath(item: self.currentIndex+1, section: 0), at: .left, animated: true)
         }
         return rightBtn
     }()

+ 20 - 0
AIEmoji/Business/TSEmojisVC/TSEmojisChildVC/Model/TSEmojisModel.swift

@@ -0,0 +1,20 @@
+//
+//  TSEmojisModel.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/19.
+//
+
+import ObjectMapper
+class TSEmojisModel: TSBaseModel {
+    
+    var name:String = ""
+    var imageUrl:String = ""
+    var vip:Bool = false
+
+    override func mapping(map: ObjectMapper.Map) {
+        name            <- map["name"]
+        imageUrl        <- map["imageUrl"]
+        vip             <- map["vip"]
+    }
+}

+ 62 - 91
AIEmoji/Business/TSEmojisVC/TSEmojisChildVC/TSEmojisChildVC.swift

@@ -7,114 +7,80 @@
 
 import JXSegmentedView
 import JXPagingView
-import MJRefresh
 
-class TSEmojisChildVC: UIViewController {
+class TSEmojisChildVC: TSBaseVC {
     
-    
-    var listViewDidScrollCallback: ((UIScrollView) -> ())?
-    let collectionView: UICollectionView
-    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
-        let itemMargin: CGFloat = 10
-        let itemWidth = floor((UIScreen.main.bounds.size.width - itemMargin*4)/3)
-        let layout = UICollectionViewFlowLayout()
-        layout.itemSize = CGSize(width: itemWidth, height: itemWidth)
-        layout.sectionInset = UIEdgeInsets.init(top: itemMargin, left: itemMargin, bottom: itemMargin, right: itemMargin)
-        layout.scrollDirection = .vertical
-        collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
-        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
-
+    var emojisType:String
+    init(emojisType:String) {
+        self.emojisType = emojisType
+        super.init()
     }
-
+    
+    lazy var viewModel: TSEmojisChildViewModel = {
+        var viewModel = TSEmojisChildViewModel(emojisType: emojisType)
+        return viewModel
+    }()
+    
     required init?(coder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }
-
-    override func viewDidLoad() {
-        super.viewDidLoad()
-
-        collectionView.alwaysBounceHorizontal = false
-        collectionView.backgroundColor = .white
-        collectionView.dataSource = self
-        collectionView.delegate = self
-        collectionView.register(ListCollectionViewCell.self, forCellWithReuseIdentifier: "cell")
-        //列表的contentInsetAdjustmentBehavior失效,需要自己设置底部inset
-        collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
-        view.addSubview(collectionView)
-        
-        collectionView.mj_header = MJRefreshNormalHeader(refreshingTarget: self, refreshingAction: #selector(headerRefresh))
-        collectionView.mj_footer = MJRefreshAutoNormalFooter(refreshingTarget: self, refreshingAction: #selector(loadMore))
-        collectionView.contentInsetAdjustmentBehavior = .never
-        
-   
-    }
     
-    override func viewDidLayoutSubviews() {
-        super.viewDidLayoutSubviews()
-
-        collectionView.frame = view.bounds
-    }
+    //联动滚动回调
+    var listViewDidScrollCallback: ((UIScrollView) -> ())?
     
-    @objc func headerRefresh() {
-        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(2)) {
-            self.collectionView.mj_header?.endRefreshing()
-     
-            self.collectionView.reloadData()
-        }
-    }
+    lazy var collectionComponent: CollectionViewComponent = {
+        let layout = UICollectionViewFlowLayout()
+        let cp = CollectionViewComponent(frame: CGRect.zero, layout: layout, attributes: [ :])
+        cp.collectionView.frame = self.view.bounds
+        cp.collectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: k_Height_TabBar, right: 0)
 
-    @objc func loadMore() {
-        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(2)) {
-  
-            self.collectionView.reloadData()
-            self.collectionView.mj_footer?.endRefreshing()
+        cp.didScrollHandler = { [weak self] scrollView in
+            guard let self = self else { return }
+            listViewDidScrollCallback?(scrollView)
+        }
+        
+        cp.itemDidSelectedHandler = { [weak self] (object, indexPath) in
+            guard let self = self else { return }
+            
+            if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSEmojisColSectionModel{
+                var dataModelArray:[TSGenmojiModel] = []
+                for itemModel in sections.items {
+                    let model = TSGenmojiModel()
+                    model.response.resultUrl = itemModel.dataModel.imageUrl
+                    dataModelArray.append(model)
+                }
+                
+                let browseVC = TSSmallIconBrowseVC()
+                browseVC.dataModelArray = dataModelArray
+                browseVC.currentIndex = indexPath.item
+                kPresentModalVC(target: self, modelVC: browseVC,transitionStyle: .crossDissolve)
+            }
         }
-    }
-}
-
-extension TSEmojisChildVC: UICollectionViewDataSource, UICollectionViewDelegate {
-    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
-        return 20
-    }
-
-    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
-        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! ListCollectionViewCell
-        cell.contentView.backgroundColor = .lightGray
-        cell.titleLabel.text = String(format: "%d", indexPath.item)
-        return cell
-    }
-}
 
-class ListCollectionViewCell: UICollectionViewCell {
-    lazy var titleLabel: UILabel = UILabel()
+        return cp
+    }()
 
-    override init(frame: CGRect) {
-        super.init(frame: frame)
 
-        titleLabel.textAlignment = .center
-        addSubview(titleLabel)
-    }
 
-    required init?(coder aDecoder: NSCoder) {
-        fatalError("init(coder:) has not been implemented")
+    override func createView() {
+        edgesForExtendedLayout = []
+        setNavBarViewHidden(true)
+        contentView.addSubview(collectionComponent.collectionView)
+        reloadView()
     }
-
-    override func layoutSubviews() {
-        super.layoutSubviews()
-
-        titleLabel.frame = self.contentView.bounds
+    
+    func reloadView(){
+        collectionComponent.clear()
+        collectionComponent.reloadView(with:viewModel.colDataArray)
     }
 }
 
 extension TSEmojisChildVC: JXPagingViewListViewDelegate {
     
-    func listScrollView() -> UIScrollView { collectionView }
-    
-    func scrollViewDidScroll(_ scrollView: UIScrollView) {
-        listViewDidScrollCallback?(scrollView)
+    func listScrollView() -> UIScrollView {
+        collectionComponent.collectionView
     }
-    
-    
+
     func listViewDidScrollCallback(callback: @escaping (UIScrollView) -> ()) {
         listViewDidScrollCallback = callback
     }
@@ -122,18 +88,23 @@ extension TSEmojisChildVC: JXPagingViewListViewDelegate {
     func listView() -> UIView { view }
     
     func listWillAppear() {
-        print("\(title ?? ""):\(#function)")
+//        print("\(title ?? ""):\(#function)")
+        if collectionComponent.collectionView.visibleCells.count == 0 {
+            debugPrint("遇到空了")
+            reloadView()
+        }
+        
     }
 
     func listDidAppear() {
-        print("\(title ?? ""):\(#function)")
+//        print("\(title ?? ""):\(#function)")
     }
 
     func listWillDisappear() {
-        print("\(title ?? ""):\(#function)")
+//        print("\(title ?? ""):\(#function)")
     }
 
     func listDidDisappear() {
-        print("\(title ?? ""):\(#function)")
+//        print("\(title ?? ""):\(#function)")
     }
 }

+ 33 - 0
AIEmoji/Business/TSEmojisVC/TSEmojisChildVC/VIew/TSEmojisCoLItemCell.swift

@@ -0,0 +1,33 @@
+//
+//  TSEmojisCoLItemCell.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/20.
+//
+
+class TSEmojisCoLItemCell: TSBaseCollectionCell {
+    
+    lazy var showImageView: UIImageView = {
+        let showImageView = UIImageView.createImageView(imageName:"")
+        showImageView.backgroundColor = .gray
+        showImageView.layer.cornerRadius = 18
+        return showImageView
+    }()
+    
+    override func creatUI() {
+        contentView.addSubview(showImageView)
+        showImageView.snp.makeConstraints { make in
+            make.top.equalTo(0)
+            make.leading.equalTo(0)
+            make.trailing.bottom.equalTo(0)
+        }
+    }
+    
+    override func renderView(with object: Any?, component: CollectionViewComponent, attributes: [String : Any]?) {
+        super.renderView(with: object, component: component, attributes: attributes)
+        if let itemModel = object as? TSEmojisColItemModel{
+            showImageView.setAsyncImage(urlString: itemModel.dataModel.imageUrl)
+        }
+    }
+    
+}

+ 93 - 0
AIEmoji/Business/TSEmojisVC/TSEmojisChildVC/ViewModel/TSEmojisChildColViewModel.swift

@@ -5,10 +5,103 @@
 //  Created by 100Years on 2025/1/19.
 //
 
+import ObjectMapper
+
 class TSEmojisChildColViewModel {
     
     
     
+}
+
+
+//MARK: TSEmojisColSectionModel
+class TSEmojisColSectionModel: TSBaseModel {
+    var name:String = ""
+    var items:[TSEmojisColItemModel] = [TSEmojisColItemModel]()
+    override func mapping(map: ObjectMapper.Map) {
+        name    <- map["name"]
+        items   <- map["items"]
+    }
+}
+
+private let emojisColSection = UIEdgeInsets(top: 24, left: 24, bottom: 24, right: 24)
+private let itemW = (k_ScreenWidth - emojisColSection.left - emojisColSection.right - 64 - 1)/3.0
+extension TSEmojisColSectionModel : CollectionViewSectionComponent{
+    var sectionInset: UIEdgeInsets {
+        return emojisColSection
+    }
+    
+    var lineSpacing: CGFloat {
+        return 32
+    }
     
+    var itemSpacing: CGFloat {
+        return 32
+    }
+    var headerComponent: CollectionViewReuseViewComponent? {
+        //暂时没有分区头,但是已经预留有模型了
+        return nil
+    }
     
+    var cells: [CollectionViewCellComponent] {
+        return items
+    }
 }
+
+
+
+//MARK: TSEmojisColItemModel
+class TSEmojisColItemModel: TSBaseModel {
+    var dataModel:TSEmojisModel = TSEmojisModel()
+    override func mapping(map: ObjectMapper.Map) {
+        dataModel    <- map["dataModel"]
+    }
+}
+
+extension TSEmojisColItemModel: CollectionViewCellComponent{
+    var cellClass: UICollectionViewCell.Type {
+        return TSEmojisCoLItemCell.self
+    }
+    
+    func cellSize(with attrubites: [String : Any]?) -> CGSize {
+        return CGSize(width: itemW, height: itemW)
+    }
+}
+
+
+////MARK: 分区头
+//class TSEmojisColComponentReuseViewModel : TSBaseModel ,CollectionViewReuseViewComponent {
+//    var sectionModel:TSGenmojiCoLSectionModel
+//
+//    init(sectionModel:TSGenmojiCoLSectionModel) {
+//        self.sectionModel = sectionModel
+//    }
+//    
+//    required convenience init?(json: [String : Any]) {
+//        fatalError("init(json:) has not been implemented")
+//    }
+//    
+//    required convenience init?(map: ObjectMapper.Map) {
+//        fatalError("init(map:) has not been implemented")
+//    }
+//    
+//    override func mapping(map: ObjectMapper.Map) {
+//        sectionModel    <- map["sectionModel"]
+//    }
+//    
+//    var viewClass: UICollectionReusableView.Type {
+//        return TSGenmojiColSectionView.self
+//    }
+//    
+//    var reuseIdentifier: String{
+//        return viewClass.description()
+//    }
+//    
+//    var viewSize: CGSize {
+//        return sectionModel.style.headerViewSize
+//    }
+//    
+//    var viewType: CollectionViewReuseViewType {
+//        return .header
+//    }
+//}

+ 40 - 0
AIEmoji/Business/TSEmojisVC/TSEmojisChildVC/ViewModel/TSEmojisChildViewModel.swift

@@ -0,0 +1,40 @@
+//
+//  TSEmojisChildViewModel.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/1/20.
+//
+
+import ObjectMapper
+
+class TSEmojisChildViewModel {
+    var emojisType:String
+    init(emojisType:String) {
+        self.emojisType = emojisType
+        creatData()
+    }
+    
+    var dataArray:[TSEmojisModel] = [TSEmojisModel]()
+    var colDataArray:[Component] = [Component]()
+}
+
+extension TSEmojisChildViewModel {
+    
+    func creatData(){
+        if let dataArray = Mapper<TSEmojisModel>().mapArray(JSONfile: "\(emojisType).json"){
+            self.dataArray = dataArray
+            creatOneSection()
+        }
+        
+    }
+    
+    func creatOneSection(){
+        let sectionModel = TSEmojisColSectionModel()
+        for model in dataArray {
+            let itemModel = TSEmojisColItemModel()
+            itemModel.dataModel = model
+            sectionModel.items.append(itemModel)
+        }
+        colDataArray.append(sectionModel)
+    }
+}

+ 78 - 59
AIEmoji/Business/TSEmojisVC/TSEmojisVC/TSEmojisVC.swift

@@ -10,17 +10,78 @@ import JXPagingView
 class TSEmojisVC: TSBaseVC {
     
     let viewModel = TSEmojisColViewModel()
+    var tableHeaderViewHeight: Int = 150
+    var headerInSectionHeight: Int = 50
+    
+    lazy var navBarView: TSBaseNavContentBarView = {
+        let navBarView = TSBaseNavContentBarView()
+        
+        let titleImageView = UIImageView.createImageView(imageName: "nav_title_emojis",contentMode: .scaleToFill)
+        navBarView.barView.addSubview(titleImageView)
+        titleImageView.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            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)
+        }
+        
+        return navBarView
+    }()
+    
+    //头 view
+    lazy var headerView: UIView = {
+        let view = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat(tableHeaderViewHeight)))
+        view.clipsToBounds = true
+        let imageView = UIImageView.createImageView(imageName: "emojis_banner")
+        view.addSubview(imageView)
+        imageView.snp.makeConstraints { make in
+            make.centerY.equalToSuperview()
+            make.leading.top.equalTo(16)
+            make.trailing.equalTo(-16)
+            make.height.equalTo(117*kDesignScale)
+        }
+        
+        let closeBtn = UIButton.createButton{ [weak self]  in
+            guard let self = self else { return }
+            viewModel.isHiddenBanner = true
+            pagingView.reloadData()
+        }
+        view.addSubview(closeBtn)
+        closeBtn.snp.makeConstraints { make in
+            make.top.equalTo(8)
+            make.trailing.equalTo(-8)
+            make.width.height.equalTo(24)
+        }
+        return view
+    }()
     
     lazy var pagingView: JXPagingView = {
         //lazy var pagingView: JXPagingView = JXPagingListRefreshView(delegate: self) //整个刷新
-//        let pagingView = JXPagingListRefreshView(delegate: self) //list 刷新
-        let pagingView = JXPagingView(delegate: self) //list 刷新
+        let pagingView = JXPagingListRefreshView(delegate: self) //list 刷新
+//        let pagingView = JXPagingView(delegate: self) //list 刷新
         pagingView.mainTableView.backgroundColor = .clear
+        pagingView.frame = self.view.bounds
+    
+        //扣边返回处理,下面的代码要加上
+        pagingView.listContainerView.scrollView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
+        pagingView.mainTableView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
+        
         return pagingView
     }()
 
+    
     lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
-        let titles = ["Solid Color".localized, "Gradient Color".localized, "Shape".localized]
         let dataSource = JXSegmentedTitleDataSource()
         dataSource.isTitleColorGradientEnabled = true
         dataSource.titles = viewModel.emojisTypes
@@ -34,12 +95,12 @@ class TSEmojisVC: TSBaseVC {
     lazy var indicator: JXSegmentedIndicatorBackgroundView = {
         let indicator = JXSegmentedIndicatorBackgroundView()
         indicator.isIndicatorConvertToItemFrameEnabled = true
-        indicator.indicatorHeight = 30
+        indicator.indicatorHeight = 32
         indicator.indicatorColor = .white
         return indicator
     }()
     
-    //头 view
+
     lazy var segmentedView: JXSegmentedView = {
         let segmentedView = JXSegmentedView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat(headerInSectionHeight)))
         segmentedView.delegate = self
@@ -47,67 +108,18 @@ class TSEmojisVC: TSBaseVC {
         segmentedView.dataSource = segmentedDataSource
         segmentedView.backgroundColor = .clear
         
-        segmentedView.listContainer = pagingView.listContainerView as? any JXSegmentedViewListContainer
+        segmentedView.listContainer = pagingView.listContainerView
         return segmentedView
     }()
-
-    var tableHeaderViewHeight: Int = 200
-    var headerInSectionHeight: Int = 50
-    
-    lazy var headerView: UIView = {
-        let view = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: CGFloat(tableHeaderViewHeight)))
-        view.backgroundColor = .gray
-        return view
-    }()
-    
-    lazy var navBarView: TSBaseNavContentBarView = {
-        let navBarView = TSBaseNavContentBarView()
-        
-        let titleImageView = UIImageView.createImageView(imageName: "nav_title_emojis",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)
-        }
-        
-        return navBarView
-    }()
-    
+ 
     override func createView() {
-
         navBarContentView.addSubview(navBarView)
         navBarView.snp.makeConstraints { make in
             make.edges.equalToSuperview()
         }
         
         contentView.addSubview(segmentedView)
-      
-        pagingView.frame = self.view.bounds
         contentView.addSubview(pagingView)
-
-        //扣边返回处理,下面的代码要加上
-        pagingView.listContainerView.scrollView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
-        pagingView.mainTableView.panGestureRecognizer.require(toFail: self.navigationController!.interactivePopGestureRecognizer!)
-        
-        
-        
-//        kDelayOnMainThread(2) {
-//            self.tableHeaderViewHeight = 0
-//            self.pagingView.reloadData()
-//        }
     }
 }
 
@@ -116,11 +128,11 @@ class TSEmojisVC: TSBaseVC {
 extension TSEmojisVC: JXPagingViewDelegate {
 
     func tableHeaderViewHeight(in pagingView: JXPagingView) -> Int {
-        return tableHeaderViewHeight
+        return viewModel.isHiddenBanner ? 0 : tableHeaderViewHeight
     }
 
     func tableHeaderView(in pagingView: JXPagingView) -> UIView {
-        return headerView
+        return viewModel.isHiddenBanner ? UIView() : headerView
     }
 
     func heightForPinSectionHeader(in pagingView: JXPagingView) -> Int {
@@ -136,7 +148,11 @@ extension TSEmojisVC: JXPagingViewDelegate {
     }
 
     func pagingView(_ pagingView: JXPagingView, initListAtIndex index: Int) -> JXPagingViewListViewDelegate {
-        return TSEmojisChildVC()
+        if let emojisType = viewModel.emojisTypes.safeObj(At: index) {
+            return TSEmojisChildVC(emojisType: emojisType)
+        }else{
+            return TSEmojisChildVC(emojisType: "Universe🌍")
+        }
     }
 }
 
@@ -145,3 +161,6 @@ extension TSEmojisVC: JXSegmentedViewDelegate {
         self.navigationController?.interactivePopGestureRecognizer?.isEnabled = (index == 0)
     }
 }
+
+//联动的关键代码
+extension JXPagingListContainerView: @retroactive JXSegmentedViewListContainer {}

+ 12 - 4
AIEmoji/Business/TSEmojisVC/TSEmojisVC/ViewModel/TSEmojisColViewModel.swift

@@ -10,13 +10,21 @@
 class TSEmojisColViewModel {
 
     lazy var emojisTypes: [String] = {
-        let titles = ["Universe🌍","Food🍔","Beauty👸","Drink🥤","Dog🐕"]
+        let titles = ["Cat🐱","Flower💐","Fish🐠","Pink🩷","Fruit🍊","Crystal🔮","Dog🐕","Food🍔","Drink🥤","Universe🌍","Beauty👸"]
         return titles
     }()
     
-    
-    
-    
+
+    lazy var isHiddenBanner: Bool = {
+        let hidden = UserDefaults.standard.bool(forKey: "kHiddenBanner")
+        return hidden
+    }()
+    {
+        didSet{
+            UserDefaults.standard.setValue(isHiddenBanner, forKey: "kHiddenBanner")
+            UserDefaults.standard.synchronize()
+        }
+    }
     
     
 }

+ 0 - 6
AIEmoji/Business/TSGenmojiVC/TSGenmojiVC/TSGenmojiVC.swift

@@ -109,10 +109,4 @@ extension TSGenmojiVC {
         
         kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
     }
-    
-    
-    func browseImage(){
-        
-        
-    }
 }

+ 1 - 0
AIEmoji/Res/Beauty👸.json

@@ -0,0 +1 @@
+

+ 202 - 0
AIEmoji/Res/Cat🐱.json

@@ -0,0 +1,202 @@
+[
+    {
+       "name": "AI Emoji Generator-4.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/32b0a4cd-6473-4211-85b3-1aef6bb5221b",
+       "vip": false
+     },
+     {
+       "name": "OHdzZ3doZjUx.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/ffa2ad0e-e80e-4eb5-97fe-c87216b961b6",
+       "vip": false
+     },
+     {
+       "name": "ZjcxdHdnNnJ4.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/dc287a47-884d-417f-816a-74a79342ac7e",
+       "vip": false
+     },
+     {
+       "name": "ZHE2ZnJleHpr.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/9d62fc08-7452-4d7c-96bf-bf1296cdeb2a",
+       "vip": false
+     },
+     {
+       "name": "ZmRneWtuejN6.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/156721b8-1d35-4595-b4d8-86f6067b4731",
+       "vip": false
+     },
+     {
+       "name": "OWZjbzk1dXQx.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/4b5204c1-d69b-419d-887d-15032e522f4d",
+       "vip": false
+     },
+     {
+       "name": "ZDFpeHBneWNv.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/f942bd6d-c61a-46cf-8f75-d2cb8b8bed6a",
+       "vip": false
+     },
+     {
+       "name": "YnRnbm9qZGJy.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/ad239487-14d5-424f-b295-70946fef56ba",
+       "vip": false
+     },
+     {
+       "name": "cGRqdzlzZnI2.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/0642c0f1-c8ff-48f6-a725-b0e35e8e9687",
+       "vip": false
+     },
+     {
+       "name": "b2RydTgyazho.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/a38e610b-25d1-48b0-9f88-57e0e735e82a",
+       "vip": false
+     },
+     {
+       "name": "ZzhwYWpkd3Jv.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/5578369e-cf19-4c72-a5ca-beb41946d904",
+       "vip": false
+     },
+     {
+       "name": "YWNtbmtiOG15.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/aa5b3868-7e83-470c-9d63-5ca262a15e0b",
+       "vip": false
+     },
+     {
+       "name": "ZmxkMTVlNGlz.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/9129bc2a-e9a0-425c-9d78-c23a599025c8",
+       "vip": false
+     },
+     {
+       "name": "bnM2ejJmaTVi.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/6dcf22bc-230b-4cd0-beea-9a7cc93e793a",
+       "vip": false
+     },
+     {
+       "name": "AI Emoji Generator-3.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/e914a9c6-4cf7-4fab-aad7-c0fbc129fa45",
+       "vip": false
+     },
+     {
+       "name": "bHJnZzAzbm51.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/9ee92387-83af-4c8e-a187-f3a857e294d2",
+       "vip": false
+     },
+     {
+       "name": "NTkxNWUxbXFo.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/98763659-39b0-4aa7-9fe0-e2c45d4b3895",
+       "vip": false
+     },
+     {
+       "name": "YjAwazlsYWtu.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/b2d95815-a48a-4461-a110-e41a553d186d",
+       "vip": false
+     },
+     {
+       "name": "M2pseGVmeXFl.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/0cb339d0-85ea-403d-868d-7d21476ead9f",
+       "vip": false
+     },
+     {
+       "name": "AI Emoji Generator-2.webp",
+       "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/28cfef7e-c549-47f5-98f8-f31867c8e836",
+       "vip": false
+     },
+     {
+         "name": "aGxoZTVxYWsy.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/11a57f2d-3175-4f89-bc16-9b5f1ef4b8a2",
+         "vip": false
+       },
+       {
+         "name": "bndlcGg0eWp2.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/88282cfc-987b-40d4-b3a1-19fcbfa73e3e",
+         "vip": false
+       },
+       {
+         "name": "b2NtdDJiY2J4.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/97b3a15c-f417-4d9f-8af4-51e29eae4a74",
+         "vip": false
+       },
+       {
+         "name": "cHBmOWYzMjRz.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/fb9237b6-d46e-46a3-a401-d800453c15cf",
+         "vip": false
+       },
+       {
+         "name": "emZ1MWJ0OHQ5.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/1b927a57-23a3-4562-bfe4-4f63ebcd5a6a",
+         "vip": false
+       },
+       {
+         "name": "ZmN3bTZtdXZq.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/73cf8db7-70d3-4376-a5df-70cf51d4d9dc",
+         "vip": false
+       },
+       {
+         "name": "YWc3czRrZHRo.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/1c86db8a-391b-49b6-b8fa-faadccfcb473",
+         "vip": false
+       },
+       {
+         "name": "c2QzZWljZ21k.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/ee174b11-34d1-49cf-b1d3-8f11ad4c58b1",
+         "vip": false
+       },
+       {
+         "name": "Zm45c3dzbDZo.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/bcd3f2d9-9c78-4f9c-8017-530e88ad62c5",
+         "vip": false
+       },
+       {
+         "name": "eGVmczNjcm9x.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/823f857e-7d5b-46dc-b356-738ca6ec245d",
+         "vip": false
+       },
+       {
+         "name": "dXJqY2xjZzYy.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/c4777a29-5d64-4896-99ea-5dbaf4b98a96",
+         "vip": false
+       },
+       {
+         "name": "Zmhtdm5tdXpy.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/a617c9e8-5761-4d88-b4a6-33f60ffb9c79",
+         "vip": false
+       },
+       {
+         "name": "ZG12cXZxYnR5.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/8a90f26b-fb36-4f9f-8c02-36f230d94f92",
+         "vip": false
+       },
+       {
+         "name": "bGQ4dHd2dndn.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/acee739c-5044-43c6-a84b-3c86ed374ee0",
+         "vip": false
+       },
+       {
+         "name": "dGdoZnN0aXFy.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/3d731e98-f104-4a56-9f8f-0eb64fc3eb45",
+         "vip": false
+       },
+       {
+         "name": "ZG1rZG10cnRl.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/c7ed16ec-7d88-42e1-a9d7-15cb43738bd1",
+         "vip": false
+       },
+       {
+         "name": "ZmY3M3NxZ2Js.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/fc6e313e-9e92-4e1f-b6f3-98765f841c4b",
+         "vip": false
+       },
+       {
+         "name": "bGlrcGtyYWQ5.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/a19b71c5-03cc-4dfb-8b7e-39ec4a2927a2",
+         "vip": false
+       },
+       {
+         "name": "b2dmcnRxaHZn.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/05ab4e26-3f44-42ad-8993-7622e59c7eab",
+         "vip": false
+       },
+       {
+         "name": "dHh2dnQxcmxj.webp",
+         "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/9a73a845-f07b-465d-9531-43fa7a16b43d",
+         "vip": false
+       }
+]

+ 1 - 0
AIEmoji/Res/Crystal🔮.json

@@ -0,0 +1 @@
+

+ 1 - 0
AIEmoji/Res/Dog🐕.json

@@ -0,0 +1 @@
+

+ 1 - 0
AIEmoji/Res/Drink🥤.json

@@ -0,0 +1 @@
+

+ 1 - 0
AIEmoji/Res/Fish🐠.json

@@ -0,0 +1 @@
+

+ 1 - 0
AIEmoji/Res/Flower💐.json

@@ -0,0 +1 @@
+

+ 1 - 0
AIEmoji/Res/Food🍔.json

@@ -0,0 +1 @@
+

+ 1 - 0
AIEmoji/Res/Fruit🍊.json

@@ -0,0 +1 @@
+

+ 1 - 0
AIEmoji/Res/Pink🩷.json

@@ -0,0 +1 @@
+

+ 302 - 0
AIEmoji/Res/Universe🌍.json

@@ -0,0 +1,302 @@
+[
+  {
+    "name": "bzQyMHozeHUy.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/ea1d61ad-e00d-4f83-9db7-646db2752e45",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (2).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/9c19d57e-cb25-4b02-9896-c1b5fd6f7c12",
+    "vip": false
+  },
+  {
+    "name": "am4xbzdsbHAx.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/2f246a36-886c-4af8-9802-f2d153ae8ff4",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/d940070d-6db6-45aa-9d4d-477a594455b4",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (3).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/42d2ef2e-b9a5-42cd-87a7-21be262cc3c6",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (4).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/80c0e83a-dc36-4ad1-8d4e-b9286c3c1eed",
+    "vip": false
+  },
+  {
+    "name": "eHFmbW16dmxw.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/46d5d921-ff51-4b7c-8bf9-6fdaf6401eb1",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (5).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/b9eeb285-bafd-4199-ad49-c8239ebe76aa",
+    "vip": false
+  },
+  {
+    "name": "ZXd0cTBxNDFt.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/7a85bde9-7dff-4f90-a53e-754f67a16165",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (6).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/39f81897-bde9-4b19-8208-27bee959b562",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (7).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/b951eaf5-abc4-4653-b8a6-a99ac99f95f1",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (8).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/6a907fa1-b7b7-4f19-adac-03e65a67971a",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (9).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/160492b1-af12-4a25-8e94-b218a2814e5c",
+    "vip": false
+  },
+  {
+    "name": "NDV0YzJqNHdk.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/de39ac91-3597-4a6e-b313-3d1b31289e5b",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (10).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/263eb213-11ab-4b16-883f-2624a6c9f9d8",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (11).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/8ca2102a-35a4-4b7d-8fe0-c159054fa6ca",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (12).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/155a8300-1830-4210-96f1-cdfc162cbf02",
+    "vip": false
+  },
+  {
+    "name": "djFnOXNqYmhx.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/3f38d734-c756-4fc5-afa9-28407fd85a8e",
+    "vip": false
+  },
+  {
+    "name": "AI Emoji Generator (13).webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/36293337-5532-49dd-9338-db4603366ac5",
+    "vip": false
+  },
+  {
+    "name": "NGhrcHV3aDUx.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/b4af7d7a-78fb-4597-bd98-a6f7bf7ed1d2",
+    "vip": false
+  },
+  {
+    "name": "amZkZHVvcjE2.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/2d8a6c14-897d-47e1-a678-3ec1e13f5b19",
+    "vip": false
+  },
+  {
+    "name": "YmNodm9scDdo.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/3a4b6d85-f3b1-41b5-9f5e-22bc6b834d6b",
+    "vip": false
+  },
+  {
+    "name": "aXZ3bG93eG51.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/60e73487-04c6-4b8e-87ea-d54dfdc6a00e",
+    "vip": false
+  },
+  {
+    "name": "d2JjZWc0Z3Fu.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/fc2d5e5a-4674-47f5-9462-b29f8c342e8f",
+    "vip": false
+  },
+  {
+    "name": "eGd1ZHV1cnE3.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/35c76a90-4b99-41d5-9f0c-78847e1db5c3",
+    "vip": false
+  },
+  {
+    "name": "cXpoamF1Ympx.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/905b91b5-6e9b-453d-b497-03d362f2829f",
+    "vip": false
+  },
+  {
+    "name": "aHRsa2VybTJn.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/61cf5d48-b77c-4381-88b8-563af92638f4",
+    "vip": false
+  },
+  {
+    "name": "dHdjbG92dWpk.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/baad5e4c-dcb1-489e-8f4c-f5a71d875cb6",
+    "vip": false
+  },
+  {
+    "name": "YmVnbmp2c2tm.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/cff32a76-d9cb-40d5-a63f-b1b4c8655fda",
+    "vip": false
+  },
+  {
+    "name": "bXVvbnBtZG5j.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/43d9d1b3-08a8-4196-9437-142b9861c5d4",
+    "vip": false
+  },
+  {
+    "name": "eHZ4aHZ5amZ4.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/21e53d72-1747-44cf-851b-bbb4b06e71b2",
+    "vip": false
+  },
+  {
+    "name": "dGxmbmp2dmtj.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/20cf3e86-b1a8-464e-8a7d-70b58b9843d2",
+    "vip": false
+  },
+  {
+    "name": "aXZmcHRnbHRs.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/6e51412f-0b5a-4b69-83d1-d416b85787b7",
+    "vip": false
+  },
+  {
+    "name": "bndzZ3RuZmd5.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/84992a8e-8a59-4a4b-b92c-25cfef56371f",
+    "vip": false
+  },
+  {
+    "name": "dmtyd29qcXhw.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/63d62f0a-20cc-4699-8708-935ebdf8e241",
+    "vip": false
+  },
+  {
+    "name": "dGhrdnF3eGZr.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/914dc6a8-92dc-4d5f-9c66-58999c934ac4",
+    "vip": false
+  },
+  {
+    "name": "YmdudGVxZ21s.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/348c5f2d-f51d-4e1b-8519-528bd482a68c",
+    "vip": false
+  },
+  {
+    "name": "ZGp1d3N3amhl.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/597c15f2-dbbc-4ad3-8f7e-d2f4769d4c57",
+    "vip": false
+  },
+  {
+    "name": "aGJ5cXZ2Z2Fq.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/af48b273-739f-4203-a276-158cb59d8f72",
+    "vip": false
+  },
+  {
+    "name": "bHNmY2ptZmtu.webp",
+    "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/4db1cf62-cc5a-4673-93b4-92d75b82c476",
+    "vip": false
+  },
+  {
+      "name": "aGVtYnV6dmh3.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/7cda1342-8325-4f5a-847f-9a8a8b4512d3",
+      "vip": false
+    },
+    {
+      "name": "dGZnY2Rscm1x.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/893adf53-b567-4f7d-82fc-d8f1a71b3a45",
+      "vip": false
+    },
+    {
+      "name": "aW1vbm9qc3Zo.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/f76c91e4-53b2-4516-99f2-4c86d92413b1",
+      "vip": false
+    },
+    {
+      "name": "d2pyZmxzZ21y.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/329db07c-7869-46cb-b95b-7c83467d182f",
+      "vip": false
+    },
+    {
+      "name": "dXFnbXlqcHB5.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/63f52a61-4594-42f4-b314-39476f07f51a",
+      "vip": false
+    },
+    {
+      "name": "eGNscnJybWdo.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/6f7e4d39-7c36-40ab-a2d1-0c86b937e482",
+      "vip": false
+    },
+    {
+      "name": "b21sbmhsbWJz.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/a4d93125-1dc3-403d-8e36-bd2fa21c4729",
+      "vip": false
+    },
+    {
+      "name": "cHJ6bHZ5eGxt.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/d2c416e9-d735-46d9-86b5-9214c7f4391b",
+      "vip": false
+    },
+    {
+      "name": "aWpzZ2Zsa25z.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/835f6c84-ec6e-47b6-a836-fb4e8c27f0a5",
+      "vip": false
+    },
+    {
+      "name": "amhsZmx4eXpo.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/ce9c32f6-b8d8-4ed9-a634-b0d5f841c63a",
+      "vip": false
+    },
+    {
+      "name": "cmV5dmFscXNk.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/6219c4e9-4e59-41d7-a95e-64b3d42c1b9a",
+      "vip": false
+    },
+    {
+      "name": "d3Rmc3V6dm51.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/86f5b6c4-f9cb-48a6-b925-7321b7c31e86",
+      "vip": false
+    },
+    {
+      "name": "eHhtY3VwZGZo.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/925d49f2-d11b-4f83-9d12-d08fcb761524",
+      "vip": false
+    },
+    {
+      "name": "aXhqbHZseHRm.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/74d2b53c-05e7-47dc-bf82-f92536b18b47",
+      "vip": false
+    },
+    {
+      "name": "Y29uc3Zndm9t.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/47b12564-d68f-48b1-a9e3-2c8746f5d8a9",
+      "vip": false
+    },
+    {
+      "name": "bHRucXZudWxk.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/3e82d4f9-f5b4-42cf-938e-47c2b96418b5",
+      "vip": false
+    },
+    {
+      "name": "c2NzdG5odmds.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/85e93c42-fad1-42ea-81d7-b732fa149d6f",
+      "vip": false
+    },
+    {
+      "name": "b2R1cm50eWps.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/c491d723-b58f-4a61-8734-0f48e6c98f34",
+      "vip": false
+    },
+    {
+      "name": "aXJwbXRmcXZt.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/1296c59d-b93f-4c67-82f5-13d276b4c718",
+      "vip": false
+    },
+    {
+      "name": "d2xpYm50aGxj.webp",
+      "imageUrl": "http://d3a93z8fj970a4.cloudfront.net/79e24c71-d926-4932-9358-1e9bdf6a9f85",
+      "vip": false
+    }
+]