Browse Source

3.3(3)提测

100Years 4 days ago
parent
commit
c24be22643
46 changed files with 316 additions and 106 deletions
  1. 2 2
      AIEmoji.xcodeproj/project.pbxproj
  2. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_emoji.imageset/aiList_emoji@2x.png
  3. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_emoji.imageset/aiList_emoji@3x.png
  4. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_emote.imageset/aiList_emote@2x.png
  5. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_emote.imageset/aiList_emote@3x.png
  6. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_hair.imageset/aiList_hair@2x.png
  7. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_hair.imageset/aiList_hair@3x.png
  8. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_hairColor.imageset/aiList_hairColor@2x.png
  9. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_hairColor.imageset/aiList_hairColor@3x.png
  10. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_oldPeople.imageset/aiList_oldPeople@2x.png
  11. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_oldPeople.imageset/aiList_oldPeople@3x.png
  12. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_restOldPhoto.imageset/aiList_restOldPhoto@2x.png
  13. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_restOldPhoto.imageset/aiList_restOldPhoto@3x.png
  14. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_ttp.imageset/aiList_ttp@2x.png
  15. BIN
      AIEmoji/Assets.xcassets/AIList/aiList_ttp.imageset/aiList_ttp@3x.png
  16. BIN
      AIEmoji/Assets.xcassets/AIList/ailist_child.imageset/ailist_child@2x.png
  17. BIN
      AIEmoji/Assets.xcassets/AIList/ailist_child.imageset/ailist_child@3x.png
  18. 22 0
      AIEmoji/Assets.xcassets/AIList/ailist_eyeOpen.imageset/Contents.json
  19. BIN
      AIEmoji/Assets.xcassets/AIList/ailist_eyeOpen.imageset/ailist_eyeOpen@2x.png
  20. BIN
      AIEmoji/Assets.xcassets/AIList/ailist_eyeOpen.imageset/ailist_eyeOpen@3x.png
  21. 2 2
      AIEmoji/Assets.xcassets/AIList/ailist_pretty.imageset/Contents.json
  22. BIN
      AIEmoji/Assets.xcassets/AIList/ailist_pretty.imageset/ailist_pretty@2x.png
  23. BIN
      AIEmoji/Assets.xcassets/AIList/ailist_pretty.imageset/ailist_pretty@3x.png
  24. BIN
      AIEmoji/Assets.xcassets/AIList/alList_shadow.imageset/alList_shadow@2x.png
  25. BIN
      AIEmoji/Assets.xcassets/AIList/alList_shadow.imageset/alList_shadow@3x.png
  26. 24 1
      AIEmoji/Business/Data/TSUserDefaultData.swift
  27. 34 36
      AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstCell.swift
  28. 104 47
      AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstVC.swift
  29. 8 1
      AIEmoji/Business/TSAILIstVC/TSAIListHistoryBaseVC/TSAIListHistoryBaseVM.swift
  30. 20 4
      AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift
  31. 11 5
      AIEmoji/Business/TSAILIstVC/TSAIUploadPhotoBaseVC/TSAIUploadPhotoBaseVC.swift
  32. 10 1
      AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift
  33. 7 0
      AIEmoji/Business/VIewTool/TSViewTool.swift
  34. 11 1
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift
  35. 20 3
      AIEmoji/Common/Purchase/TSPurchaseManager.swift
  36. 1 1
      AIEmoji/Common/Tool/TSCommonTool/TSCommonTool.swift
  37. 4 2
      AIEmoji/Common/View/TSPhotoPickerManager/TSPhotoPickerManager.swift
  38. 4 0
      AIEmoji/de.lproj/Localizable.strings
  39. 4 0
      AIEmoji/en.lproj/Localizable.strings
  40. 4 0
      AIEmoji/es.lproj/Localizable.strings
  41. 4 0
      AIEmoji/ja.lproj/Localizable.strings
  42. 4 0
      AIEmoji/ko.lproj/Localizable.strings
  43. 4 0
      AIEmoji/pt-BR.lproj/Localizable.strings
  44. 4 0
      AIEmoji/pt-PT.lproj/Localizable.strings
  45. 4 0
      AIEmoji/zh-Hans.lproj/Localizable.strings
  46. 4 0
      AIEmoji/zh-Hant.lproj/Localizable.strings

+ 2 - 2
AIEmoji.xcodeproj/project.pbxproj

@@ -2250,7 +2250,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 3;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -2289,7 +2289,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 3;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;

BIN
AIEmoji/Assets.xcassets/AIList/aiList_emoji.imageset/aiList_emoji@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_emoji.imageset/aiList_emoji@3x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_emote.imageset/aiList_emote@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_emote.imageset/aiList_emote@3x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_hair.imageset/aiList_hair@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_hair.imageset/aiList_hair@3x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_hairColor.imageset/aiList_hairColor@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_hairColor.imageset/aiList_hairColor@3x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_oldPeople.imageset/aiList_oldPeople@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_oldPeople.imageset/aiList_oldPeople@3x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_restOldPhoto.imageset/aiList_restOldPhoto@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_restOldPhoto.imageset/aiList_restOldPhoto@3x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_ttp.imageset/aiList_ttp@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/aiList_ttp.imageset/aiList_ttp@3x.png


BIN
AIEmoji/Assets.xcassets/AIList/ailist_child.imageset/ailist_child@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/ailist_child.imageset/ailist_child@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/AIList/ailist_eyeOpen.imageset/Contents.json

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

BIN
AIEmoji/Assets.xcassets/AIList/ailist_eyeOpen.imageset/ailist_eyeOpen@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/ailist_eyeOpen.imageset/ailist_eyeOpen@3x.png


+ 2 - 2
AIEmoji/Assets.xcassets/AIList/alList_shadow.imageset/Contents.json → AIEmoji/Assets.xcassets/AIList/ailist_pretty.imageset/Contents.json

@@ -5,12 +5,12 @@
       "scale" : "1x"
     },
     {
-      "filename" : "alList_shadow@2x.png",
+      "filename" : "ailist_pretty@2x.png",
       "idiom" : "universal",
       "scale" : "2x"
     },
     {
-      "filename" : "alList_shadow@3x.png",
+      "filename" : "ailist_pretty@3x.png",
       "idiom" : "universal",
       "scale" : "3x"
     }

BIN
AIEmoji/Assets.xcassets/AIList/ailist_pretty.imageset/ailist_pretty@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/ailist_pretty.imageset/ailist_pretty@3x.png


BIN
AIEmoji/Assets.xcassets/AIList/alList_shadow.imageset/alList_shadow@2x.png


BIN
AIEmoji/Assets.xcassets/AIList/alList_shadow.imageset/alList_shadow@3x.png


+ 24 - 1
AIEmoji/Business/Data/TSUserDefaultData.swift

@@ -209,8 +209,31 @@ final class TSChangeOldPhotoHistory: TSBaseHistoryManager<TSActionInfoModel> {
     }
 }
 
+// MARK: - 睁眼
+final class TSAIEyeOpenHistory: TSBaseHistoryManager<TSActionInfoModel> {
+    static let shared = TSAIEyeOpenHistory()
+    override var historyKey: String { "kTSAIEyeOpenHistoryListString" }
+    
+    override var exampleModels: [TSActionInfoModel] {
+        []
+    }
+    override func findModelID(modelID: Int) -> Int? {
+        return listModels.firstIndex(where: {$0.id == modelID})
+    }
+}
 
-
+// MARK: - 美容
+final class TSAIPhotoPrettyHistory: TSBaseHistoryManager<TSActionInfoModel> {
+    static let shared = TSAIPhotoPrettyHistory()
+    override var historyKey: String { "kTSAIPhotoPrettyHistoryListString" }
+    
+    override var exampleModels: [TSActionInfoModel] {
+        []
+    }
+    override func findModelID(modelID: Int) -> Int? {
+        return listModels.firstIndex(where: {$0.id == modelID})
+    }
+}
 
 
 

+ 34 - 36
AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstCell.swift

@@ -9,18 +9,11 @@
 class TSAILIstCell: TSBaseCollectionCell {
     
     static let cellID = "TSAILIstCell"
-
-    override var isSelected: Bool{
-        didSet{
-            
-        }
-    }
-    
     var itemModel:TSBasicItemModel = TSBasicItemModel(){
         didSet{
             bgImageView.image = UIImage(named: itemModel.leftImageName ?? "")
             titleLab.text = itemModel.leftTitle
-            leftSubLab.text = itemModel.leftSubTitle
+//            leftSubLab.text = itemModel.leftSubTitle
         }
     }
     
@@ -42,17 +35,17 @@ class TSAILIstCell: TSBaseCollectionCell {
         return titleLab
     }()
     
-    lazy var leftSubLab: UILabel = {
-        return UILabel.createLabel(font: .font(size: 14),textColor: .white.withAlphaComponent(0.8),numberOfLines: 0)
-    }()
+//    lazy var leftSubLab: UILabel = {
+//        return UILabel.createLabel(font: .font(size: 14),textColor: .white.withAlphaComponent(0.8),numberOfLines: 0)
+//    }()
 
-    lazy var submitBtn: UIButton = {
-        let submitBtn = UIButton.createButton(title: "Try Now".localized,backgroundColor: .themeColor,font: .font(size: 12),titleColor: "#111111".uiColor)
-        submitBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12)
-        submitBtn.cornerRadius = 12
-        submitBtn.isUserInteractionEnabled = false
-        return submitBtn
-    }()
+//    lazy var submitBtn: UIButton = {
+//        let submitBtn = UIButton.createButton(title: "Try Now".localized,backgroundColor: .themeColor,font: .font(size: 12),titleColor: "#111111".uiColor)
+//        submitBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12)
+//        submitBtn.cornerRadius = 12
+//        submitBtn.isUserInteractionEnabled = false
+//        return submitBtn
+//    }()
     
 
     override func creatUI() {
@@ -68,29 +61,34 @@ class TSAILIstCell: TSBaseCollectionCell {
 //            make.height.equalTo(90*kDesignScale)
 //        }
 
-        bgContentView.addSubview(submitBtn)
-        submitBtn.snp.makeConstraints { make in
-            make.trailing.equalTo(-16)
-            make.bottom.equalTo(-27)
-            make.height.equalTo(24)
-            make.width.equalTo(submitBtn.intrinsicContentSize.width)
-        }
+//        bgContentView.addSubview(submitBtn)
+//        submitBtn.snp.makeConstraints { make in
+//            make.trailing.equalTo(-16)
+//            make.bottom.equalTo(-27)
+//            make.height.equalTo(24)
+//            make.width.equalTo(submitBtn.intrinsicContentSize.width)
+//        }
         
-        bgContentView.addSubview(leftSubLab)
-        leftSubLab.snp.makeConstraints { make in
-            make.trailing.equalTo(submitBtn.snp.leading).offset(-15)
-            make.leading.equalTo(16)
-            make.bottom.equalTo(-12)
-        }
+//        bgContentView.addSubview(leftSubLab)
+//        leftSubLab.snp.makeConstraints { make in
+//            make.trailing.equalTo(submitBtn.snp.leading).offset(-15)
+//            make.leading.equalTo(16)
+//            make.bottom.equalTo(-12)
+//        }
+//        
+//        bgContentView.addSubview(titleLab)
+//        titleLab.snp.makeConstraints { make in
+//            make.trailing.equalTo(leftSubLab.snp.trailing)
+//            make.leading.equalTo(leftSubLab.snp.leading)
+//            make.bottom.equalTo(leftSubLab.snp.top).offset(-8)
+//        }
         
         bgContentView.addSubview(titleLab)
         titleLab.snp.makeConstraints { make in
-            make.trailing.equalTo(leftSubLab.snp.trailing)
-            make.leading.equalTo(leftSubLab.snp.leading)
-            make.bottom.equalTo(leftSubLab.snp.top).offset(-8)
+            make.trailing.equalTo(14)
+            make.leading.equalTo(12)
+            make.bottom.equalTo(-16)
         }
-        
-
     }
     
 }

+ 104 - 47
AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstVC.swift

@@ -24,6 +24,45 @@ class TSAILIstVC: TSBaseVC {
                     kPushVC(target: self, modelVC: TSTextGeneralPictureVC())
         }))
         
+        sectionModel.addSubItemModel(
+            createItemModel(
+                leftImageName:"ailist_pretty",
+                leftTitle: "Be Pretty".localized,
+                leftSubTitle: "".localized,
+                rightViewStyle: 0,
+                tapBlock: { [weak self] model, _, _ in
+                   guard let self = self else { return }
+ 
+                    var config = TSAIListHintBaseVC.Config.defaultConfig
+                    config.imageMaxBitSize = kUploadImageMaxBit5Size
+                    enterSelectPhotos(
+                        userDefaultsKey: "isFirstAIPrettyPhoto",
+                        maxBitSize: kUploadImageMaxBit5Size,
+                         config:config
+                    ) { image in
+                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit5Size, generatorStyle: .pretty)
+                        kPushVC(target: self, modelVC: baseVc)
+                    }
+        }))
+        
+        sectionModel.addSubItemModel(
+            createItemModel(
+                leftImageName:"ailist_eyeOpen",
+                leftTitle: "Open eyes".localized,
+                leftSubTitle: "".localized,
+                rightViewStyle: 0,
+                tapBlock: { [weak self] model, _, _ in
+                   guard let self = self else { return }
+                    enterSelectPhotos(
+                        userDefaultsKey: "isFirstAIEyeOpenPhoto",
+                        maxBitSize: kUploadImageMaxBit10Size,
+                        config:.defaultConfig
+                    ) { image in
+                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit10Size, generatorStyle: .eyeOpen)
+                        kPushVC(target: self, modelVC: baseVc)
+                    }
+        }))
+        
         sectionModel.addSubItemModel(
             createItemModel(
                 leftImageName:"aiList_restOldPhoto",
@@ -32,86 +71,109 @@ class TSAILIstVC: TSBaseVC {
                 rightViewStyle: 0,
                 tapBlock: { [weak self] model, _, _ in
                    guard let self = self else { return }
-                    enterSelectPhotos(userDefaultsKey: "isFirstAIChangeRestOldPhoto") { image in
-                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image, generatorStyle: .oldPhoto)
+                    enterSelectPhotos(
+                        userDefaultsKey: "isFirstAIChangeRestOldPhoto",
+                        maxBitSize: kUploadImageMaxBit10Size,
+                        config:.defaultConfig
+                    ) { image in
+                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit10Size, generatorStyle: .oldPhoto)
                         kPushVC(target: self, modelVC: baseVc)
                     }
         }))
         
         sectionModel.addSubItemModel(
             createItemModel(
-                leftImageName:"aiList_oldPeople",
-                leftTitle: "Predicting Old Age".localized,
-                leftSubTitle: "AI predicts what you look like in your old age".localized,
+                leftImageName:"aiList_hairColor",
+                leftTitle: "Transform Hair Color".localized,
+                leftSubTitle: "Find out what hair color suits you".localized,
                 rightViewStyle: 0,
                 tapBlock: { [weak self] model, _, _ in
                    guard let self = self else { return }
-                    enterSelectPhotos(userDefaultsKey: "isFirstAIListAgeOldHintVC") { image in
-                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image, generatorStyle: .ageOld)
+                    enterSelectPhotos(
+                        userDefaultsKey: "isFirstAIChangeHairColor",
+                        maxBitSize: kUploadImageMaxBit10Size,
+                        config:.changeHairConfig
+                    ) { image in
+                        let baseVc = TSAIChangeEmoteVC(upLoadImage: image, style: .changehairColor)
                         kPushVC(target: self, modelVC: baseVc)
                     }
         }))
         
         sectionModel.addSubItemModel(
             createItemModel(
-                leftImageName:"ailist_child",
-                leftTitle: "Back to Baby".localized,
-                leftSubTitle: "AI helps you go back to being a baby".localized,
+                leftImageName:"aiList_hair",
+                leftTitle: "Hair Salon".localized,
+                leftSubTitle: "Try new hair looks for every style".localized,
                 rightViewStyle: 0,
                 tapBlock: { [weak self] model, _, _ in
                    guard let self = self else { return }
-                    
-                    enterSelectPhotos(userDefaultsKey: "isFirstAIListAgeChildHintVC") { image in
-                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image, generatorStyle: .ageChild)
+                    enterSelectPhotos(
+                        userDefaultsKey: "isFirstAIChangeHair",
+                        maxBitSize: kUploadImageMaxBit10Size,
+                        config:.changeHairConfig
+                    ) { image in
+                        let baseVc = TSAIChangeEmoteVC(upLoadImage: image, style: .changehair)
                         kPushVC(target: self, modelVC: baseVc)
                     }
-                    
-                                
         }))
         
         sectionModel.addSubItemModel(
             createItemModel(
-                leftImageName:"aiList_emote",
-                leftTitle: "Change Emotion".localized,
-                leftSubTitle: "Change your facial emotion in one click".localized,
+                leftImageName:"aiList_oldPeople",
+                leftTitle: "Predicting Old Age".localized,
+                leftSubTitle: "AI predicts what you look like in your old age".localized,
                 rightViewStyle: 0,
                 tapBlock: { [weak self] model, _, _ in
                    guard let self = self else { return }
-                    enterSelectPhotos(userDefaultsKey: "isFirstAIChangeEmote") { image in
-                        let baseVc = TSAIChangeEmoteVC(upLoadImage: image, style: .changeEmote)
+                    enterSelectPhotos(
+                        userDefaultsKey: "isFirstAIListAgeOldHintVC",
+                        maxBitSize: kUploadImageMaxBit10Size,
+                        config:.defaultConfig
+                    ) { image in
+                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit10Size, generatorStyle: .ageOld)
                         kPushVC(target: self, modelVC: baseVc)
                     }
         }))
         
-        
         sectionModel.addSubItemModel(
             createItemModel(
-                leftImageName:"aiList_hairColor",
-                leftTitle: "Transform Hair Color".localized,
-                leftSubTitle: "Find out what hair color suits you".localized,
+                leftImageName:"ailist_child",
+                leftTitle: "Back to Baby".localized,
+                leftSubTitle: "AI helps you go back to being a baby".localized,
                 rightViewStyle: 0,
                 tapBlock: { [weak self] model, _, _ in
                    guard let self = self else { return }
-                    enterSelectPhotos(userDefaultsKey: "isFirstAIChangeHairColor") { image in
-                        let baseVc = TSAIChangeEmoteVC(upLoadImage: image, style: .changehairColor)
+                    enterSelectPhotos(
+                        userDefaultsKey: "isFirstAIListAgeChildHintVC",
+                        maxBitSize: kUploadImageMaxBit10Size,
+                        config:.defaultConfig
+                    ) { image in
+                        let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: image,imageMaxBitSize: kUploadImageMaxBit10Size, generatorStyle: .ageChild)
                         kPushVC(target: self, modelVC: baseVc)
                     }
+                    
+                                
         }))
         
         sectionModel.addSubItemModel(
             createItemModel(
-                leftImageName:"aiList_hair",
-                leftTitle: "Hair Salon".localized,
-                leftSubTitle: "Try new hair looks for every style".localized,
+                leftImageName:"aiList_emote",
+                leftTitle: "Change Emotion".localized,
+                leftSubTitle: "Change your facial emotion in one click".localized,
                 rightViewStyle: 0,
                 tapBlock: { [weak self] model, _, _ in
                    guard let self = self else { return }
-                    enterSelectPhotos(userDefaultsKey: "isFirstAIChangeHair") { image in
-                        let baseVc = TSAIChangeEmoteVC(upLoadImage: image, style: .changehair)
+                    enterSelectPhotos(
+                        userDefaultsKey: "isFirstAIChangeEmote",
+                        maxBitSize: kUploadImageMaxBit10Size,
+                        config:.defaultConfig
+                    ) { image in
+                        let baseVc = TSAIChangeEmoteVC(upLoadImage: image, style: .changeEmote)
                         kPushVC(target: self, modelVC: baseVc)
                     }
         }))
         
+
         sectionModel.addSubItemModel(
             createItemModel(
                 leftImageName:"aiList_emoji",
@@ -161,9 +223,11 @@ class TSAILIstVC: TSBaseVC {
     lazy var layout: UICollectionViewFlowLayout = {
         let layout = UICollectionViewFlowLayout()
         layout.scrollDirection = .vertical
-        layout.itemSize = CGSize(width: k_ScreenWidth-32, height: 180*kDesignScale)
-        layout.minimumInteritemSpacing = 0.0
-        layout.minimumLineSpacing = 16.0
+        let w = (k_ScreenWidth-32-10)/2
+        let h = kGetScaleHeight(originalSize: CGSizeMake(167, 236), width: w)
+        layout.itemSize = CGSize(width: w, height: h)
+        layout.minimumInteritemSpacing = 9.0
+        layout.minimumLineSpacing = 12.0
         
         layout.sectionInset = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16)
         return layout
@@ -265,25 +329,18 @@ extension TSAILIstVC: UICollectionViewDataSource ,UICollectionViewDelegate {
 
 extension TSAILIstVC{
     
-    func enterSelectPhotos(userDefaultsKey:String,complete: @escaping (UIImage)->Void){
+    func enterSelectPhotos(userDefaultsKey:String,maxBitSize:Int,config:TSAIListHintBaseVC.Config,complete: @escaping (UIImage)->Void){
         TSAIListHintBaseVC.userDefaultsKey = userDefaultsKey
-        
         if TSAIListHintBaseVC.isShowUploadImageHint{
             TSAIListHintBaseVC.isShowUploadImageHint = false
-            self.presentModalHintVC(userDefaultsKey: userDefaultsKey,complete:complete)
+            self.presentModalHintVC(config:config,complete:complete)
         }else {
-            self.pickSinglePhoto(complete:complete)
+            self.pickSinglePhoto(maxBitSize:maxBitSize,complete:complete)
         }
     }
     
     
-    func presentModalHintVC(userDefaultsKey:String,complete:@escaping (UIImage)->Void){
-        
-        var config: TSAIListHintBaseVC.Config = .defaultConfig
-        if userDefaultsKey == "isFirstAIChangeHair" || userDefaultsKey == "isFirstAIChangeHairColor"{
-            config = .changeHairConfig
-        }
-
+    func presentModalHintVC(config:TSAIListHintBaseVC.Config,complete:@escaping (UIImage)->Void){
         let vc = TSAIListHintBaseVC(config: config) { image in
             if let image = image {
                 complete(image)
@@ -294,8 +351,8 @@ extension TSAILIstVC{
         kPresentModalVC(target: self, modelVC: vc,transitionStyle: .crossDissolve)
     }
     
-    func pickSinglePhoto(complete: @escaping (UIImage)->Void)  {
-        photoPickerManager.pickSinglePhoto(maxBitSize: kUploadImageMaxBit10Size) { image, errorString in
+    func pickSinglePhoto(maxBitSize:Int,complete: @escaping (UIImage)->Void)  {
+        photoPickerManager.pickSinglePhoto(maxBitSize: maxBitSize) { image, errorString in
             if let errorString = errorString {
                 TSToastShared.showToast(text: errorString)
             }else if let image = image {

+ 8 - 1
AIEmoji/Business/TSAILIstVC/TSAIListHistoryBaseVC/TSAIListHistoryBaseVM.swift

@@ -38,7 +38,6 @@ class TSAIListHistoryBaseVM {
     }
     
     func removeAllHistoryList(){
-
         switch generatorStyle {
         case .ageOld:
             TSChangeOldAgeHistory.shared.removeALLModel()
@@ -46,6 +45,10 @@ class TSAIListHistoryBaseVM {
             TSChangeBabyAgeHistory.shared.removeALLModel()
         case .oldPhoto:
             TSChangeOldPhotoHistory.shared.removeALLModel()
+        case .eyeOpen:
+            TSAIEyeOpenHistory.shared.removeALLModel()
+        case .pretty:
+            TSAIPhotoPrettyHistory.shared.removeALLModel()
         }
         
         colDataArray.removeAll()
@@ -62,6 +65,10 @@ extension TSAIListHistoryBaseVM {
             TSChangeBabyAgeHistory.shared.listModels
         case .oldPhoto:
             TSChangeOldPhotoHistory.shared.listModels
+        case .eyeOpen:
+            TSAIEyeOpenHistory.shared.listModels
+        case .pretty:
+            TSAIPhotoPrettyHistory.shared.listModels
         }
     }
 }

+ 20 - 4
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift

@@ -76,10 +76,26 @@ class TSAIListPhotoGeneratorBaseVM {
                         "device":getUserInfoJsonString()
                        ]
             case .oldPhoto:
-            urlType = .imageRewrite
-            postDict = ["prompt":"修复上传的老照片,保持人物表情和动作100%不变,去除划痕、污渍和折痕,修复褪色发黄,增强清晰度(超分辨率)",
-                        "imageUrl":imageUrl,
-                        "style":"No Style",
+//            urlType = .imageRewrite
+//            postDict = ["prompt":"修复上传的老照片,保持人物表情和动作100%不变,去除划痕、污渍和折痕,修复褪色发黄,增强清晰度(超分辨率)",
+//                        "imageUrl":imageUrl,
+//                        "style":"No Style",
+//                        "device":getUserInfoJsonString()
+//                       ]
+            
+            urlType = .imageRestore
+            postDict = ["imageUrl":imageUrl,
+                        "device":getUserInfoJsonString()
+                       ]
+            case .eyeOpen:
+            urlType = .eyeOpen
+            postDict = ["imageUrl":imageUrl,
+                        "device":getUserInfoJsonString()
+                       ]
+            case .pretty:
+            urlType = .pretty
+            postDict = ["imageUrl":imageUrl,
+                        "level":1.0,
                         "device":getUserInfoJsonString()
                        ]
         }

+ 11 - 5
AIEmoji/Business/TSAILIstVC/TSAIUploadPhotoBaseVC/TSAIUploadPhotoBaseVC.swift

@@ -10,14 +10,18 @@ enum TSGeneratorImageStyle {
     case ageOld
     case ageChild
     case oldPhoto
+    case eyeOpen
+    case pretty
 }
 
 class TSAIUploadPhotoBaseVC: TSBaseVC {
     var generatorStyle:TSGeneratorImageStyle
     var titleString:String
-    init(titleString:String,upLoadImage:UIImage,generatorStyle:TSGeneratorImageStyle) {
+    var imageMaxBitSize:Int
+    init(titleString:String,upLoadImage:UIImage,imageMaxBitSize:Int,generatorStyle:TSGeneratorImageStyle) {
         self.titleString = titleString
         self.upLoadImage = upLoadImage
+        self.imageMaxBitSize = imageMaxBitSize
         self.generatorStyle = generatorStyle
         super.init()
     }
@@ -56,8 +60,6 @@ class TSAIUploadPhotoBaseVC: TSBaseVC {
                 uploadImageView.isHidden = false
                 deleteBtn.isHidden = false
                 uploadImageView.image = image
-                
-                
                 submitBtn.isEnabled = true
             }else {
                 upLoadView.isHidden = false
@@ -195,7 +197,7 @@ extension TSAIUploadPhotoBaseVC {
         
         
         //文字信息区域
-        cusStackView.addSubviewToStack(getTextInfoCell(text: "Size ≤ 10MB".localized))
+        cusStackView.addSubviewToStack(getTextInfoCell(text: String(format: "Size ≤ %dMB".localized, imageMaxBitSize/1024/1024)))
         cusStackView.addSpacing(height: lineSpacing)
         cusStackView.addSubviewToStack(getTextInfoCell(text: "Single photo with face fully visible".localized))
         cusStackView.addSpacing(height: lineSpacing)
@@ -238,7 +240,7 @@ extension TSAIUploadPhotoBaseVC {
     }
     
     func pickSinglePhoto()  {
-        photoPickerManager.pickSinglePhoto(maxBitSize: kUploadImageMaxBit10Size) { [weak self] image, errorString in
+        photoPickerManager.pickSinglePhoto(maxBitSize: imageMaxBitSize) { [weak self] image, errorString in
             guard let self = self else { return }
             if let errorString = errorString {
                 TSToastShared.showToast(text: errorString)
@@ -272,6 +274,10 @@ extension TSAIUploadPhotoBaseVC {
             TSChangeBabyAgeHistory.shared.saveModel(model: model)
         case .oldPhoto:
             TSChangeOldPhotoHistory.shared.saveModel(model: model)
+        case .eyeOpen:
+            TSAIEyeOpenHistory.shared.saveModel(model: model)
+        case .pretty:
+            TSAIPhotoPrettyHistory.shared.saveModel(model: model)
         }
     }
 

+ 10 - 1
AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -476,7 +476,16 @@ struct PurchaseItemView: View {
             HStack {
                 VStack(alignment: .leading, spacing: 8) {
                     Text(title).font(.font(size: 14)).foregroundColor(UIColor.textAssist.color)
-                    Text(PurchaseManager.default.price(for: type) ?? "--").font(.font(size: 18,weight: .medium)).foregroundColor(UIColor.mainText.color)
+//                    Text(PurchaseManager.default.price(for: type) ?? "--").font(.font(size: 18,weight: .medium)).foregroundColor(UIColor.mainText.color)
+                    
+                    HStack{
+                        Text(PurchaseManager.default.price(for: type) ?? "--").font(.font(size: 18,weight: .medium)).foregroundColor(UIColor.mainText.color)
+                        if type == .year {
+                            if let price = PurchaseManager.default.averageWeeklyForYear() {
+                                Text("(≈\(price)/" + "Week".localized + ")").font(.font(size: 12,weight: .medium)).foregroundColor(Color.white.opacity(0.6))
+                            }
+                        }
+                    }
                 }
                 Spacer()
                 if type == selectedType {

+ 7 - 0
AIEmoji/Business/VIewTool/TSViewTool.swift

@@ -166,3 +166,10 @@ class TSSavePhotoSuccessTool {
     
     
 }
+
+
+func kGetScaleHeight(originalSize:CGSize,width:CGFloat) -> CGFloat {
+    let originalScale = originalSize.width/originalSize.height
+    let height = width/originalScale
+    return height
+}

+ 11 - 1
AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift

@@ -7,6 +7,7 @@
 
 /// 基础 URL(根据需求修改)
 private let baseURL = "http://ai.100yearslater.com"
+private let baseChinaURL = "http://ai.100yearslater100.com"
 import Alamofire
 enum TSNeURLType:String {
     
@@ -24,8 +25,17 @@ enum TSNeURLType:String {
     case subscriptionApple = "/api/subscription/apple"       //苹果订阅
     case changeEmotion = "/api/image/change-emotion"       //更换表情
     case changeHair = "/api/image/change-hair"       //更换头发
+    case imageRestore = "/api/image/restore"          //老照片修复
+    case eyeOpen = "/api/image/eye-open"          //睁眼
+    case pretty = "/api/image/pretty"          //美容
+    
+    
     func getUrlString() -> String {
-        return baseURL + self.rawValue
+        if Locale.current.identifier.contains("_CN") {//中国区
+            return baseChinaURL + self.rawValue
+        }else{
+            return baseURL + self.rawValue
+        }
     }
 }
 

+ 20 - 3
AIEmoji/Common/Purchase/TSPurchaseManager.swift

@@ -143,9 +143,9 @@ public class PurchaseManager: NSObject {
     }
 
     @objc public var isVip: Bool {
-        #if DEBUG
-            return true
-        #endif
+//        #if DEBUG
+//            return true
+//        #endif
         guard let expiresDate = expiredDate else {
             return false
         }
@@ -207,6 +207,23 @@ extension PurchaseManager {
         return formatter.string(from: product.price)
     }
 
+    // 平局每周的金额,对于年来说
+    public func averageWeeklyForYear() -> String? {
+        guard let product = product(for: .year) else {
+            return nil
+        }
+        
+        let price = product.price.doubleValue
+        let calculatePrice = price / 52.0
+        let originStr = String(format: "%.2f", calculatePrice)
+        let originPrice = NSDecimalNumber(string: originStr, locale: product.priceLocale)
+        
+        let formatter = NumberFormatter()
+        formatter.formatterBehavior = NumberFormatter.Behavior.behavior10_4
+        formatter.numberStyle = .currency
+        formatter.locale = product.priceLocale
+        return formatter.string(from: originPrice)
+    }
     
 //    public func originalPrice(for period: PremiumPeriod) -> String? {
 //        guard let product = product(for: period) else {

+ 1 - 1
AIEmoji/Common/Tool/TSCommonTool/TSCommonTool.swift

@@ -223,4 +223,4 @@ func kExecuteOnMainThread(_ block: @escaping () -> Void) {
 
 let kAppName:String = "Chibii" //Chibi Ghiblii
 let kUploadImageMaxBit10Size:Int = 10 * 1024 * 1024 //10M
-let kUploadImageMaxBit5Size:Int = 10 * 1024 * 1024 //10M
+let kUploadImageMaxBit5Size:Int = 5 * 1024 * 1024 //5M

+ 4 - 2
AIEmoji/Common/View/TSPhotoPickerManager/TSPhotoPickerManager.swift

@@ -117,6 +117,8 @@ extension TSPhotoPickerManager{
     /// 打开照片选择器,单选一张照片
     func pickSinglePhoto(maxBitSize:Int, completion: @escaping (UIImage?,String?) -> Void) {
         self.completionSizeHandler = completion
+
+        let maxmbSize = Int(Double(maxBitSize) / (1024 * 1024))
         pickSinglePhoto { [weak self] image,phAsset in
             guard let self = self else { return }
             if let image = image,let phAsset = phAsset {
@@ -127,7 +129,7 @@ extension TSPhotoPickerManager{
                     let mbSize = Double(size) / (1024 * 1024)
                     print("精确大小: \(mbSize) MB,size = \(size)")
                     if size > maxBitSize {
-                        self.completionSizeHandler?(nil,"Photo must be smaller than 10MB.".localized)
+                        self.completionSizeHandler?(nil,String(format: "Photo must be smaller than %dMB.".localized, maxmbSize))
                     }else{
                         self.completionSizeHandler?(image,nil)
                         self.completionSizeHandler = nil
@@ -136,7 +138,7 @@ extension TSPhotoPickerManager{
                 }
             }else if let image = image {
                 if image.isLargerThan(byteSize: maxBitSize) {
-                    self.completionSizeHandler?(nil,"Photo must be smaller than 10MB.".localized)
+                    self.completionSizeHandler?(nil,String(format: "Photo must be smaller than %dMB.".localized, maxmbSize))
                 }else{
                     self.completionSizeHandler?(image,nil)
                     self.completionSizeHandler = nil

+ 4 - 0
AIEmoji/de.lproj/Localizable.strings

@@ -220,3 +220,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "Offensichtliche Frisur, völlig klares und sichtbares Gesicht";
 "Group photos, covered faces, skinhead" = "Gruppenfotos, verdeckte Gesichter, Skinhead";
 "Hair Salon" = "Friseursalon";
+"Be Pretty" = "Sei hübsch";
+"Week" = "Woche";
+"Open eyes" = "Augen auf";
+"Photo must be smaller than %dMB." = "Foto muss unter %dMB sein";

+ 4 - 0
AIEmoji/en.lproj/Localizable.strings

@@ -217,3 +217,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "Obvious hairstyle, Fully clear and visible face";
 "Group photos, covered faces, skinhead" = "Group photos, covered faces, skinhead";
 "Hair Salon" = "Hair Salon";
+"Be Pretty" = "Be Pretty";
+"Week" = "Week";
+"Open eyes" = "Open eyes";
+"Photo must be smaller than %dMB." = "Photo must be smaller than %dMB.";

+ 4 - 0
AIEmoji/es.lproj/Localizable.strings

@@ -216,3 +216,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "Peinado evidente, Rostro totalmente claro y visible.";
 "Group photos, covered faces, skinhead" = "Fotos de grupo, caras cubiertas, skinhead.";
 "Hair Salon" = "Peluquería";
+"Be Pretty" = "ser bonita";
+"Week" = "Semana";
+"Open eyes" = "ojos abiertos";
+"Photo must be smaller than %dMB." = "La foto debe ser menor a %dMB";

+ 4 - 0
AIEmoji/ja.lproj/Localizable.strings

@@ -216,3 +216,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "明らかな髪型、完全にはっきりと見える顔";
 "Group photos, covered faces, skinhead" = "集合写真、顔を隠した、スキンヘッド";
 "Hair Salon" = "ヘアサロン";
+"Be Pretty" = "簡単に美しくなる";
+"Week" = "週";
+"Open eyes" = "目を開けて";
+"Photo must be smaller than %dMB." = "%dMB以下の写真が必要";

+ 4 - 0
AIEmoji/ko.lproj/Localizable.strings

@@ -216,3 +216,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "눈에 띄는 헤어스타일, 또렷하고 눈에 띄는 얼굴";
 "Group photos, covered faces, skinhead" = "단체 사진, 가린 얼굴, 스킨헤드";
 "Hair Salon" = "미용실";
+"Be Pretty" = "예뻐지세요";
+"Week" = "주";
+"Open eyes" = "눈을 뜨다";
+"Photo must be smaller than %dMB." = "%dMB 미만 사진만 가능";

+ 4 - 0
AIEmoji/pt-BR.lproj/Localizable.strings

@@ -216,3 +216,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "Penteado óbvio, rosto totalmente claro e visível";
 "Group photos, covered faces, skinhead" = "Fotos de grupo, rostos cobertos, skinhead";
 "Hair Salon" = "Salão de cabeleireiro";
+"Be Pretty" = "Seja bonito";
+"Week" = "Semana";
+"Open eyes" = "Olhos abertos";
+"Photo must be smaller than %dMB." = "A foto deve ter menos de %dMB";

+ 4 - 0
AIEmoji/pt-PT.lproj/Localizable.strings

@@ -216,3 +216,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "Penteado óbvio, rosto totalmente claro e visível";
 "Group photos, covered faces, skinhead" = "Fotos de grupo, rostos cobertos, skinhead";
 "Hair Salon" = "Salão de cabeleireiro";
+"Be Pretty" = "Seja bonito";
+"Week" = "Semana";
+"Open eyes" = "Olhos abertos";
+"Photo must be smaller than %dMB." = "A foto deve ter menos de %dMB";

+ 4 - 0
AIEmoji/zh-Hans.lproj/Localizable.strings

@@ -216,3 +216,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "发型明显,脸部清晰可见";
 "Group photos, covered faces, skinhead" = "集体照、遮脸、光头";
 "Hair Salon" = "美发沙龙";
+"Be Pretty" = "轻松变美";
+"Week" = "周";
+"Open eyes" = "睁开眼睛";
+"Photo must be smaller than %dMB." = "照片必须小于 %dMB";

+ 4 - 0
AIEmoji/zh-Hant.lproj/Localizable.strings

@@ -208,3 +208,7 @@
 "Obvious hairstyle, Fully clear and visible face" = "髮型明顯,臉部清晰可見";
 "Group photos, covered faces, skinhead" = "集體照、遮臉、光頭";
 "Hair Salon" = "美髮沙龍";
+"Be Pretty" = "輕鬆變美";
+"Week" = "週";
+"Open eyes" = "睜開眼睛";
+"Photo must be smaller than %dMB." = "照片必須小於 %dMB";