浏览代码

1.新增了会员升级周和年
2.修改了一批 bug

100Years 2 周之前
父节点
当前提交
0146cd6145
共有 88 个文件被更改,包括 663 次插入215 次删除
  1. 2 2
      AIEmoji.xcodeproj/project.pbxproj
  2. 0 0
      AIEmoji/Assets.xcassets/Common/delete_bg_gray.imageset/Contents.json
  3. 二进制
      AIEmoji/Assets.xcassets/Common/delete_bg_gray.imageset/delete_bg_white@2x.png
  4. 二进制
      AIEmoji/Assets.xcassets/Common/delete_bg_gray.imageset/delete_bg_white@3x.png
  5. 二进制
      AIEmoji/Assets.xcassets/Common/delete_bg_white.imageset/delete_bg_white@2x.png
  6. 二进制
      AIEmoji/Assets.xcassets/Common/delete_bg_white.imageset/delete_bg_white@3x.png
  7. 二进制
      AIEmoji/Assets.xcassets/Common/launch_AllImage.imageset/launch_AllImage@2x.png
  8. 二进制
      AIEmoji/Assets.xcassets/Common/launch_AllImage.imageset/launch_AllImage@3x.png
  9. 2 2
      AIEmoji/Assets.xcassets/Common/launch_all.imageset/Contents.json
  10. 二进制
      AIEmoji/Assets.xcassets/Common/launch_all.imageset/launch_all@2x.png
  11. 二进制
      AIEmoji/Assets.xcassets/Common/launch_all.imageset/launch_all@3x.png
  12. 二进制
      AIEmoji/Assets.xcassets/Common/network_error.imageset/network_error@2x.png
  13. 二进制
      AIEmoji/Assets.xcassets/Common/network_error.imageset/network_error@3x.png
  14. 22 0
      AIEmoji/Assets.xcassets/PTP/ptp_selected_check.imageset/Contents.json
  15. 二进制
      AIEmoji/Assets.xcassets/PTP/ptp_selected_check.imageset/ptp_selected_check@2x.png
  16. 二进制
      AIEmoji/Assets.xcassets/PTP/ptp_selected_check.imageset/ptp_selected_check@3x.png
  17. 22 0
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Barbie.imageset/Contents.json
  18. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Barbie.imageset/ptp_style_Barbie@2x.png
  19. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Barbie.imageset/ptp_style_Barbie@3x.png
  20. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_CibiMarukoChan.imageset/ptp_style_CibiMarukoChan@2x.png
  21. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_CibiMarukoChan.imageset/ptp_style_CibiMarukoChan@3x.png
  22. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_DRAGONBALL.imageset/ptp_style_DRAGONBALL@2x.png
  23. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_DRAGONBALL.imageset/ptp_style_DRAGONBALL@3x.png
  24. 22 0
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_JoJo.imageset/Contents.json
  25. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_JoJo.imageset/ptp_style_JoJo@2x.png
  26. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_JoJo.imageset/ptp_style_JoJo@3x.png
  27. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Minecraft.imageset/ptp_style_Minecraft@2x.png
  28. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Minecraft.imageset/ptp_style_Minecraft@3x.png
  29. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_OnePiece.imageset/ptp_style_OnePiece@2x.png
  30. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_OnePiece.imageset/ptp_style_OnePiece@3x.png
  31. 22 0
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Shinchan.imageset/Contents.json
  32. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Shinchan.imageset/ptp_style_Shinchan@2x.png
  33. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Shinchan.imageset/ptp_style_Shinchan@3x.png
  34. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Simpson.imageset/ptp_style_Simpson@2x.png
  35. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Simpson.imageset/ptp_style_Simpson@3x.png
  36. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Smurf.imageset/ptp_style_Smurf@2x.png
  37. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Smurf.imageset/ptp_style_Smurf@3x.png
  38. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Statue.imageset/ptp_style_Statue@2x.png
  39. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_Statue.imageset/ptp_style_Statue@3x.png
  40. 22 0
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_ZackMorty.imageset/Contents.json
  41. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_ZackMorty.imageset/ptp_style_ZackMorty@2x.png
  42. 二进制
      AIEmoji/Assets.xcassets/PTP/style/ptp_style_ZackMorty.imageset/ptp_style_ZackMorty@3x.png
  43. 二进制
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/tabbar_select_pic@2x.png
  44. 二进制
      AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/tabbar_select_pic@3x.png
  45. 2 2
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/Contents.json
  46. 二进制
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_select_pic@2x.png
  47. 二进制
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_select_pic@3x.png
  48. 二进制
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_unSelect_pic@2x.png
  49. 二进制
      AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_unSelect_pic@3x.png
  50. 22 0
      AIEmoji/Assets.xcassets/VIP/setting_Vip_cornerMark.imageset/Contents.json
  51. 二进制
      AIEmoji/Assets.xcassets/VIP/setting_Vip_cornerMark.imageset/setting_Vip_cornerMark@2x.png
  52. 二进制
      AIEmoji/Assets.xcassets/VIP/setting_Vip_cornerMark.imageset/setting_Vip_cornerMark@3x.png
  53. 二进制
      AIEmoji/Assets.xcassets/boot/comparison/boot_img_premium_photos_2.imageset/boot_img_premium_photos_2@2x.png
  54. 二进制
      AIEmoji/Assets.xcassets/boot/comparison/boot_img_premium_photos_2.imageset/boot_img_premium_photos_2@3x.png
  55. 1 1
      AIEmoji/Assets.xcassets/boot/comparison/boot_img_premium_photos_4.imageset/Contents.json
  56. 7 7
      AIEmoji/Base.lproj/LaunchScreen.storyboard
  57. 1 1
      AIEmoji/Business/AIChat/TSAIChatHistoryVC/TSAIChatHistoryVC.swift
  58. 1 1
      AIEmoji/Business/AIChat/TSChatViewController/TSChatViewController/TSChatViewController+NaviBar.swift
  59. 2 0
      AIEmoji/Business/LaunchVC/TSBootPageVC.swift
  60. 1 1
      AIEmoji/Business/TSPTPGeneratorVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoBrowseVC.swift
  61. 16 1
      AIEmoji/Business/TSPTPGeneratorVC/TSGennertatorSelectStyleVC/TSGennertatorSelectStyleVC.swift
  62. 1 1
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPHistoryVC/TSPTPHistoryVC.swift
  63. 1 3
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/TSPTPInputVC.swift
  64. 1 1
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/VM/TSPTPInputVM.swift
  65. 185 11
      AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/View/TSPTPSelectStyleView.swift
  66. 36 99
      AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift
  67. 7 1
      AIEmoji/Business/TSSetingVC/SetingVC/TSSetingVC.swift
  68. 2 2
      AIEmoji/Business/TSSetingVC/SetingVC/TSSetingViewModel.swift
  69. 70 27
      AIEmoji/Business/TSSetingVC/SetingVC/View/SettingPurchaseTopView.swift
  70. 5 8
      AIEmoji/Business/TSSetingVC/SetingVC/View/TSSettingListView.swift
  71. 2 2
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorErrorView.swift
  72. 6 0
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratoringAnimationView.swift
  73. 1 1
      AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorloadingView.swift
  74. 1 1
      AIEmoji/Business/VIewTool/TSViewTool.swift
  75. 1 1
      AIEmoji/Common/NetworkManager/TSNetWork/TSNetWork+Business.swift
  76. 28 6
      AIEmoji/Common/Purchase/TSPurchaseManager.swift
  77. 28 16
      AIEmoji/Common/View/TSImageComparisonView.swift
  78. 3 3
      AIEmoji/Common/View/TYCycleImageComparisonView.swift
  79. 55 14
      AIEmoji/Res/photo_to_photo_style.json
  80. 7 0
      AIEmoji/de.lproj/Localizable.strings
  81. 7 0
      AIEmoji/en.lproj/Localizable.strings
  82. 7 0
      AIEmoji/es.lproj/Localizable.strings
  83. 7 0
      AIEmoji/ja.lproj/Localizable.strings
  84. 7 0
      AIEmoji/ko.lproj/Localizable.strings
  85. 7 0
      AIEmoji/pt-BR.lproj/Localizable.strings
  86. 7 0
      AIEmoji/pt-PT.lproj/Localizable.strings
  87. 7 0
      AIEmoji/zh-Hans.lproj/Localizable.strings
  88. 7 0
      AIEmoji/zh-Hant.lproj/Localizable.strings

+ 2 - 2
AIEmoji.xcodeproj/project.pbxproj

@@ -2508,7 +2508,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;
@@ -2547,7 +2547,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CLANG_ENABLE_MODULES = YES;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 1;
+				CURRENT_PROJECT_VERSION = 2;
 				DEVELOPMENT_TEAM = 65UD255J84;
 				ENABLE_USER_SCRIPT_SANDBOXING = NO;
 				GENERATE_INFOPLIST_FILE = YES;

+ 0 - 0
AIEmoji/Assets.xcassets/Common/delete_bg_white.imageset/Contents.json → AIEmoji/Assets.xcassets/Common/delete_bg_gray.imageset/Contents.json


二进制
AIEmoji/Assets.xcassets/Common/delete_bg_gray.imageset/delete_bg_white@2x.png


二进制
AIEmoji/Assets.xcassets/Common/delete_bg_gray.imageset/delete_bg_white@3x.png


二进制
AIEmoji/Assets.xcassets/Common/delete_bg_white.imageset/delete_bg_white@2x.png


二进制
AIEmoji/Assets.xcassets/Common/delete_bg_white.imageset/delete_bg_white@3x.png


二进制
AIEmoji/Assets.xcassets/Common/launch_AllImage.imageset/launch_AllImage@2x.png


二进制
AIEmoji/Assets.xcassets/Common/launch_AllImage.imageset/launch_AllImage@3x.png


+ 2 - 2
AIEmoji/Assets.xcassets/Common/launch_AllImage.imageset/Contents.json → AIEmoji/Assets.xcassets/Common/launch_all.imageset/Contents.json

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

二进制
AIEmoji/Assets.xcassets/Common/launch_all.imageset/launch_all@2x.png


二进制
AIEmoji/Assets.xcassets/Common/launch_all.imageset/launch_all@3x.png


二进制
AIEmoji/Assets.xcassets/Common/network_error.imageset/network_error@2x.png


二进制
AIEmoji/Assets.xcassets/Common/network_error.imageset/network_error@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/PTP/ptp_selected_check.imageset/Contents.json

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

二进制
AIEmoji/Assets.xcassets/PTP/ptp_selected_check.imageset/ptp_selected_check@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/ptp_selected_check.imageset/ptp_selected_check@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Barbie.imageset/Contents.json

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

二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Barbie.imageset/ptp_style_Barbie@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Barbie.imageset/ptp_style_Barbie@3x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_CibiMarukoChan.imageset/ptp_style_CibiMarukoChan@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_CibiMarukoChan.imageset/ptp_style_CibiMarukoChan@3x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_DRAGONBALL.imageset/ptp_style_DRAGONBALL@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_DRAGONBALL.imageset/ptp_style_DRAGONBALL@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/PTP/style/ptp_style_JoJo.imageset/Contents.json

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

二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_JoJo.imageset/ptp_style_JoJo@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_JoJo.imageset/ptp_style_JoJo@3x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Minecraft.imageset/ptp_style_Minecraft@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Minecraft.imageset/ptp_style_Minecraft@3x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_OnePiece.imageset/ptp_style_OnePiece@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_OnePiece.imageset/ptp_style_OnePiece@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Shinchan.imageset/Contents.json

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

二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Shinchan.imageset/ptp_style_Shinchan@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Shinchan.imageset/ptp_style_Shinchan@3x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Simpson.imageset/ptp_style_Simpson@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Simpson.imageset/ptp_style_Simpson@3x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Smurf.imageset/ptp_style_Smurf@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Smurf.imageset/ptp_style_Smurf@3x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Statue.imageset/ptp_style_Statue@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_Statue.imageset/ptp_style_Statue@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/PTP/style/ptp_style_ZackMorty.imageset/Contents.json

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

二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_ZackMorty.imageset/ptp_style_ZackMorty@2x.png


二进制
AIEmoji/Assets.xcassets/PTP/style/ptp_style_ZackMorty.imageset/ptp_style_ZackMorty@3x.png


二进制
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/tabbar_select_pic@2x.png


二进制
AIEmoji/Assets.xcassets/Tabbar/tabbar_select_pic.imageset/tabbar_select_pic@3x.png


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

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

二进制
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_select_pic@2x.png


二进制
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_select_pic@3x.png


二进制
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_unSelect_pic@2x.png


二进制
AIEmoji/Assets.xcassets/Tabbar/tabbar_unSelect_pic.imageset/tabbar_unSelect_pic@3x.png


+ 22 - 0
AIEmoji/Assets.xcassets/VIP/setting_Vip_cornerMark.imageset/Contents.json

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

二进制
AIEmoji/Assets.xcassets/VIP/setting_Vip_cornerMark.imageset/setting_Vip_cornerMark@2x.png


二进制
AIEmoji/Assets.xcassets/VIP/setting_Vip_cornerMark.imageset/setting_Vip_cornerMark@3x.png


二进制
AIEmoji/Assets.xcassets/boot/comparison/boot_img_premium_photos_2.imageset/boot_img_premium_photos_2@2x.png


二进制
AIEmoji/Assets.xcassets/boot/comparison/boot_img_premium_photos_2.imageset/boot_img_premium_photos_2@3x.png


+ 1 - 1
AIEmoji/Assets.xcassets/boot/comparison/boot_img_premium_photos_4.imageset/Contents.json

@@ -1,11 +1,11 @@
 {
   "images" : [
     {
-      "filename" : "boot_img_premium_photos_4.png",
       "idiom" : "universal",
       "scale" : "1x"
     },
     {
+      "filename" : "boot_img_premium_photos_4.png",
       "idiom" : "universal",
       "scale" : "2x"
     },

+ 7 - 7
AIEmoji/Base.lproj/LaunchScreen.storyboard

@@ -16,17 +16,17 @@
                         <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch_AllImage" highlighted="YES" translatesAutoresizingMaskIntoConstraints="NO" id="FfL-7D-71P">
-                                <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch_all" highlighted="YES" translatesAutoresizingMaskIntoConstraints="NO" id="FfL-7D-71P">
+                                <rect key="frame" x="-1" y="-1" width="393" height="854"/>
                             </imageView>
                         </subviews>
                         <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
                         <color key="backgroundColor" red="0.027450980392156862" green="0.031372549019607843" blue="0.047058823529411764" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                         <constraints>
-                            <constraint firstItem="FfL-7D-71P" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="8Gj-dY-fqQ"/>
-                            <constraint firstAttribute="bottom" secondItem="FfL-7D-71P" secondAttribute="bottom" id="8ZS-ob-UGd"/>
-                            <constraint firstItem="FfL-7D-71P" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="Mrk-rv-06S"/>
-                            <constraint firstItem="FfL-7D-71P" firstAttribute="trailing" secondItem="6Tk-OE-BBY" secondAttribute="trailing" id="bxL-Ck-xdu"/>
+                            <constraint firstItem="FfL-7D-71P" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" constant="-1" id="8Gj-dY-fqQ"/>
+                            <constraint firstAttribute="bottom" secondItem="FfL-7D-71P" secondAttribute="bottom" constant="-1" id="8ZS-ob-UGd"/>
+                            <constraint firstItem="FfL-7D-71P" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" constant="-1" id="Mrk-rv-06S"/>
+                            <constraint firstItem="FfL-7D-71P" firstAttribute="trailing" secondItem="6Tk-OE-BBY" secondAttribute="trailing" constant="-1" id="bxL-Ck-xdu"/>
                         </constraints>
                     </view>
                 </viewController>
@@ -36,6 +36,6 @@
         </scene>
     </scenes>
     <resources>
-        <image name="launch_AllImage" width="375" height="812"/>
+        <image name="launch_all" width="375" height="812"/>
     </resources>
 </document>

+ 1 - 1
AIEmoji/Business/AIChat/TSAIChatHistoryVC/TSAIChatHistoryVC.swift

@@ -52,7 +52,7 @@ class TSAIChatHistoryVC: TSBaseVC {
         addNormalNavBarView()
         setPageTitle("History".localized)
         
-        deleteAllBtn = setNavigationItem("", imageName: "delete_white", direction: .right, action: #selector(deleteAll))
+        deleteAllBtn = setNavigationItem("", imageName: "delete", direction: .right, action: #selector(deleteAll))
         
         contentView.addSubview(pageNullView)
         contentView.addSubview(collectionView)

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

@@ -149,7 +149,7 @@ extension TSChatViewController {
         case .history:
             addNormalNavBarView()
             setPageTitle("History".localized)
-            _ = setNavigationItem("", imageName: "delete_white", direction: .right, action: #selector(clickDelete))
+            _ = setNavigationItem("", imageName: "delete", direction: .right, action: #selector(clickDelete))
         case .perfectHint:
             addNormalNavBarView()
             setPageTitle("AI Assistant".localized)

+ 2 - 0
AIEmoji/Business/LaunchVC/TSBootPageVC.swift

@@ -47,6 +47,7 @@ class TSBootPageVC: TSBaseVC {
     
     lazy var comparisonView0: TSImageComparisonView = {
         let comparisonView = TSImageComparisonView(frame: UIScreen.main.bounds)
+        comparisonView.isRunloop = true
         comparisonView.configure(
             oldImage: UIImage(named: "boot_comparison_old_0"),
             newImage: UIImage(named: "boot_comparison_new_0")
@@ -61,6 +62,7 @@ class TSBootPageVC: TSBaseVC {
     
     lazy var comparisonView1: TSImageComparisonView = {
         let comparisonView = TSImageComparisonView(frame: UIScreen.main.bounds)
+        comparisonView.isRunloop = true
         comparisonView.configure(
             oldImage: UIImage(named: "boot_comparison_old_1"),
             newImage: UIImage(named: "boot_comparison_new_1")

+ 1 - 1
AIEmoji/Business/TSPTPGeneratorVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoBrowseVC.swift

@@ -81,7 +81,7 @@ class TSAIPhotoBrowseVC: TSBaseVC {
     }()
     
     lazy var deleteBtn: UIButton = {
-        let deleteBtn = UIButton.createButton(image: UIImage(named: "delete_bg_white")) { [weak self]  in
+        let deleteBtn = UIButton.createButton(image: UIImage(named: "delete_bg_gray")) { [weak self]  in
             guard let self = self else { return }
             showCustomAlert(message: "Are you sure to delete".localized, deleteHandler:  { [weak self]  in
                 guard let self = self else { return }

+ 16 - 1
AIEmoji/Business/TSPTPGeneratorVC/TSGennertatorSelectStyleVC/TSGennertatorSelectStyleVC.swift

@@ -165,6 +165,7 @@ class TSGennertatorSelectStyleCell: TSBaseCollectionCell {
     override var isSelected: Bool{
         didSet{
             boardImageView.isHidden = isSelected ? false : true
+            checkImageView.isHidden = style == .ptp ? boardImageView.isHidden : true
             textLabel.textColor = isSelected ? .themeColor : .white.withAlphaComponent(0.8)
         }
     }
@@ -208,7 +209,6 @@ class TSGennertatorSelectStyleCell: TSBaseCollectionCell {
     var itemModel:TSGenerateStyleModel = TSGenerateStyleModel(){
         didSet{
             imageView.image = UIImage(named: itemModel.imageName)
-            
             let hotImageNamed = getSpecialStyleImageNamed(specialStyle: itemModel.specialStyle)
             if hotImageNamed.count > 0 {
                 hotImageView.image = UIImage(named: hotImageNamed)
@@ -255,6 +255,13 @@ class TSGennertatorSelectStyleCell: TSBaseCollectionCell {
         return imageView
     }()
     
+    lazy var checkImageView: UIImageView = {
+        let checkImageView = UIImageView.createImageView(imageName: "ptp_selected_check")
+        checkImageView.isHidden = true
+        return checkImageView
+    }()
+    
+    
     lazy var hotImageView: UIImageView = {
         let hotImageView = UIImageView.createImageView(imageName: "ptp_style_hot")
         hotImageView.isHidden = true
@@ -290,6 +297,14 @@ class TSGennertatorSelectStyleCell: TSBaseCollectionCell {
             make.width.height.equalTo(36)
         }
         
+        imageView.addSubview(checkImageView)
+        checkImageView.snp.makeConstraints { make in
+            make.trailing.equalTo(-1.0)
+            make.top.equalTo(1.0)
+            make.width.height.equalTo(20)
+        }
+        
+        
         bgContentView.addSubview(textLabel)
         textLabel.snp.makeConstraints { make in
             make.top.equalTo(imageView.snp.bottom).offset(2)

+ 1 - 1
AIEmoji/Business/TSPTPGeneratorVC/TSPTPHistoryVC/TSPTPHistoryVC.swift

@@ -139,7 +139,7 @@ extension TSPTPHistoryVC: TSSimpleCollectionViewDelegate {
                 }
             }
             else if string == "delete_task_sensitive" {
-                showCustomAlert(message: "Delete this error history?".localized, deleteHandler:  { [weak self]  in
+                showDeleteErrorAlert(message: "Delete this error history?".localized, deleteHandler:  { [weak self]  in
                     guard let self = self else { return }
                     if let model = event.data as? TSActionInfoModel{
                         dbHistory.deleteListModel(id: model.id)

+ 1 - 3
AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/TSPTPInputVC.swift

@@ -214,7 +214,7 @@ class TSPTPInputVC: TSBaseVC {
                         updataCollectionView()
                     }
                 }else if cmd == "delete_task_sensitive" {
-                    showCustomAlert(message: "Delete this error history?".localized, deleteHandler:  { [weak self]  in
+                    showDeleteErrorAlert(message: "Delete this error history?".localized, deleteHandler:  { [weak self]  in
                         guard let self = self else { return }
                         if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel,
                            let currentActionInfoModel = sections.items.safeObj(At: indexPath.item) {
@@ -489,8 +489,6 @@ extension TSPTPInputVC {
     }
 
     func generateImage() {
-//        viewModel.selectedPTPStyleModel.upLoadImage = viewModel.upLoadImage
-//        viewModel.selectedPTPStyleModel.upLoadImageUrl = nil
         let gennerateVC = TSPTPGeneratorVC(generateStyleModel: viewModel.generateStyleModel) { [weak self] _ in
             guard let self = self else { return }
             updateVipView()

+ 1 - 1
AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/VM/TSPTPInputVM.swift

@@ -92,7 +92,7 @@ class TSPTPInputVM {
     
     //用户生成图片的TSGenerateStyleModel
     var generateStyleModel:TSGenerateStyleModel{
-        let generateStyleModel = selectedPTPStyleModel.copy() as! TSGenerateStyleModel
+        let generateStyleModel = selectedPTPStyleModel
         generateStyleModel.upLoadImage = upLoadImage
         generateStyleModel.upLoadImageUrl = nil
         return generateStyleModel

+ 185 - 11
AIEmoji/Business/TSPTPGeneratorVC/TSPTPInputVC/View/TSPTPSelectStyleView.swift

@@ -4,37 +4,211 @@
 //
 //  Created by 100Years on 2025/4/7.
 //
+class CustomHorizontalPageLayout: UICollectionViewFlowLayout {
+    
+    // MARK: - 可配置属性
+    
+    /// 每页行数(默认2行)
+    var rowsPerPage: Int = 2 {
+        didSet { invalidateLayout() }
+    }
+    
+    /// 每页列数(默认4列)
+    var columnsPerPage: Int = 4 {
+        didSet { invalidateLayout() }
+    }
+    
+    /// 是否启用Z字形排列(默认开启)
+    var isZLayoutEnabled: Bool = true {
+        didSet { invalidateLayout() }
+    }
+    
+    /// 每页单元格数量(自动计算)
+    private var itemsPerPage: Int {
+        rowsPerPage * columnsPerPage
+    }
+    
+    // MARK: - 布局计算
+    
+    override var collectionViewContentSize: CGSize {
+        guard let collectionView = collectionView else { return .zero }
+        
+        let itemCount = CGFloat(collectionView.numberOfItems(inSection: 0))
+        let pageCount = ceil(itemCount / CGFloat(itemsPerPage))
+        return CGSize(
+            width: collectionView.bounds.width * pageCount,
+            height: collectionView.bounds.height
+        )
+    }
+    
+    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
+        guard let collectionView = collectionView else { return nil }
+        
+        return (0..<collectionView.numberOfItems(inSection: 0)).compactMap {
+            layoutAttributesForItem(at: IndexPath(item: $0, section: 0))
+        }.filter { rect.intersects($0.frame) }
+    }
+    
+    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
+        guard let collectionView = collectionView else { return nil }
+        
+        let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
+        
+        // 计算页面信息
+        let pageWidth = collectionView.bounds.width
+        let pageIndex = indexPath.item / itemsPerPage
+        let itemInPage = indexPath.item % itemsPerPage
+        
+        // 计算单元格行列位置
+        let (row, column) = positionForItem(itemInPage)
+        
+        // 计算单元格尺寸
+        let itemWidth = (pageWidth - sectionInset.left - sectionInset.right -
+                        CGFloat(columnsPerPage - 1) * minimumInteritemSpacing) / CGFloat(columnsPerPage)
+        let itemHeight = (collectionView.bounds.height - sectionInset.top - sectionInset.bottom -
+                         CGFloat(rowsPerPage - 1) * minimumLineSpacing) / CGFloat(rowsPerPage)
+        
+        // 计算位置坐标
+        let x = sectionInset.left + CGFloat(column) * (itemWidth + minimumInteritemSpacing) +
+               CGFloat(pageIndex) * pageWidth
+        let y = sectionInset.top + CGFloat(row) * (itemHeight + minimumLineSpacing)
+        
+        attributes.frame = CGRect(x: x, y: y, width: itemWidth, height: itemHeight)
+        return attributes
+    }
+    
+    // MARK: - 行列位置计算
+    private func positionForItem(_ itemInPage: Int) -> (row: Int, column: Int) {
+        if isZLayoutEnabled {
+            // Z字形排列(从左到右,从上到下)
+            let row = itemInPage / columnsPerPage
+            let column = itemInPage % columnsPerPage
+            return (row, column)
+        } else {
+            // 垂直排列(从上到下,从左到右)
+            let column = itemInPage / rowsPerPage
+            let row = itemInPage % rowsPerPage
+            return (row, column)
+        }
+    }
+}
+//class CustomHorizontalPageLayout: UICollectionViewFlowLayout {
+//    
+//    // 每页显示的单元格数量(2行4列)
+//    private let itemsPerPage = 8
+//    
+//    // 准备布局
+//    override func prepare() {
+//        super.prepare()
+//        setupLayout()
+//    }
+//    
+//    private func setupLayout() {
+//        scrollDirection = .horizontal
+//        minimumLineSpacing = 0
+//        minimumInteritemSpacing = 0
+//    }
+//    
+//    override var collectionViewContentSize: CGSize {
+//          guard let collectionView = collectionView else { return .zero }
+//          
+//          // 关键修改:使用浮点数计算总页数(向上取整)
+//          let totalItems = CGFloat(collectionView.numberOfItems(inSection: 0))
+//          let pageCount = ceil(totalItems / CGFloat(itemsPerPage))
+//          
+//          return CGSize(
+//              width: collectionView.bounds.width * pageCount,
+//              height: collectionView.bounds.height
+//          )
+//      }
+//    
+//    // 布局属性计算
+//    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
+//        guard let collectionView = collectionView else { return nil }
+//        
+//        var allAttributes: [UICollectionViewLayoutAttributes] = []
+//        let totalItems = collectionView.numberOfItems(inSection: 0)
+//        
+//        for item in 0..<totalItems {
+//            let indexPath = IndexPath(item: item, section: 0)
+//            if let attributes = layoutAttributesForItem(at: indexPath) {
+//                if rect.intersects(attributes.frame) {
+//                    allAttributes.append(attributes)
+//                }
+//            }
+//        }
+//        return allAttributes
+//    }
+//    
+//   override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
+//       guard let collectionView = collectionView else { return nil }
+//       
+//       let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
+//       
+//       // 原始页面计算逻辑保持不变
+//       let page = indexPath.item / itemsPerPage
+//       let itemInPage = indexPath.item % itemsPerPage
+//       
+//       // 原始行列计算保持不变
+//       let row: Int
+//       let column: Int
+//       if itemInPage < 4 {
+//           row = 0
+//           column = itemInPage
+//       } else {
+//           row = 1
+//           column = itemInPage - 4
+//       }
+//       
+//       // 原始尺寸计算保持不变
+//       let pageWidth = collectionView.bounds.width
+//       let itemWidth = (pageWidth - sectionInset.left - sectionInset.right) / 4
+//       let itemHeight = (collectionView.bounds.height - sectionInset.top - sectionInset.bottom) / 2
+//       
+//       // 原始位置计算保持不变
+//       let x = sectionInset.left + CGFloat(column) * itemWidth + CGFloat(page) * pageWidth
+//       let y = sectionInset.top + CGFloat(row) * itemHeight
+//       
+//       attributes.frame = CGRect(
+//           x: x,
+//           y: y,
+//           width: itemWidth,
+//           height: itemHeight
+//       )
+//       
+//       return attributes
+//   }
+//    
+//}
 
 class TSPTPSelectStyleView: TSBaseView {
-    var viewH: CGFloat = 108.0
+    var cellH: CGFloat = 108.0
+    lazy var viewH: CGFloat = cellH*2+4.0
     var dataArray: [TSGenerateStyleModel] = [TSGenerateStyleModel]() {
         didSet {
             styleCollectionView.reloadData()
-
             if dataArray.count > 0 {
-//                DispatchQueue.main.async {
                 styleCollectionView.selectItem(at: currentIndexPath, animated: false, scrollPosition: .centeredHorizontally)
-//                }
             }
         }
     }
 
     var clickHandle: ((IndexPath, TSGenerateStyleModel) -> Void)?
-    lazy var layout: UICollectionViewFlowLayout = {
-        let layout = UICollectionViewFlowLayout()
+
+    lazy var layout: CustomHorizontalPageLayout = {
+        let layout = CustomHorizontalPageLayout()
         layout.scrollDirection = .horizontal
-        let w = (k_ScreenWidth - 32.0 - 30.0 - 2.0) / 4.0
-        layout.itemSize = CGSize(width: w, height: viewH)
-        layout.minimumInteritemSpacing = 0.0
-        layout.minimumLineSpacing = 10.0
         layout.sectionInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16)
+        layout.minimumLineSpacing = 4
+        layout.minimumInteritemSpacing = 0
         return layout
     }()
-
+    
     lazy var styleCollectionView: UICollectionView = {
         let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
         collectionView.delegate = self
         collectionView.dataSource = self
+        collectionView.isPagingEnabled = true
         collectionView.showsVerticalScrollIndicator = false
         collectionView.showsHorizontalScrollIndicator = false
         collectionView.backgroundColor = .clear

+ 36 - 99
AIEmoji/Business/TSPurchaseMembershipVC/TSPurchaseVC.swift

@@ -61,69 +61,7 @@ class TSPurchaseVC: TSBaseVC {
     lazy var bgView: UIView = {
         let bgView = UIView()
         bgView.backgroundColor = .clear
-        
-//        let imageScroll1 = createImageScroll(imageName: "img-premium-photos-1", direction: .topToBottom)
-//        let imageScroll2 = createImageScroll(imageName: "img-premium-photos-2", direction: .bottomToTop)
-//        let imageScroll3 = createImageScroll(imageName: "img-premium-photos-3", direction: .topToBottom)
-//        let imageScroll4 = createImageScroll(imageName: "img-premium-photos-4", direction: .bottomToTop)
-//        let imageScroll5 = createImageScroll(imageName: "img-premium-photos-5", direction: .topToBottom)
-//        
-//        bgView.addSubview(imageScroll1)
-//        bgView.addSubview(imageScroll2)
-//        bgView.addSubview(imageScroll3)
-//        bgView.addSubview(imageScroll4)
-//        bgView.addSubview(imageScroll5)
-//        
-//        let top = -40.0
-//        let w = 110.0
-//        let h = 600//554.0
-//        
-//        //中间
-//        imageScroll3.snp.makeConstraints { make in
-//            make.top.equalTo(top)
-//            make.centerX.equalToSuperview()
-//            make.width.equalTo(w)
-//            make.height.equalTo(h)
-//        }
-//        //左边
-//        imageScroll2.snp.makeConstraints { make in
-//            make.top.equalTo(top)
-//            make.trailing.equalTo(imageScroll3.snp.leading).offset(-12)
-//            make.width.equalTo(w)
-//            make.height.equalTo(h)
-//        }
-//        
-//        imageScroll1.snp.makeConstraints { make in
-//            make.top.equalTo(top)
-//            make.trailing.equalTo(imageScroll2.snp.leading).offset(-12)
-//            make.width.equalTo(w)
-//            make.height.equalTo(h)
-//        }
-//        
-//        //右边
-//        imageScroll4.snp.makeConstraints { make in
-//            make.top.equalTo(top)
-//            make.leading.equalTo(imageScroll3.snp.trailing).offset(12)
-//            make.width.equalTo(w)
-//            make.height.equalTo(h)
-//        }
-//        
-//        imageScroll5.snp.makeConstraints { make in
-//            make.top.equalTo(top)
-//            make.leading.equalTo(imageScroll4.snp.trailing).offset(12)
-//            make.width.equalTo(w)
-//            make.height.equalTo(h)
-//        }
-//        
-//        
-//        kDelayMainShort {//0.1 秒后开启动画
-//            imageScroll1.startAnimation()
-//            imageScroll2.startAnimation()
-//            imageScroll3.startAnimation()
-//            imageScroll4.startAnimation()
-//            imageScroll5.startAnimation()
-//        }
-        
+
         let imageView = UIImageView.createImageView(imageName: "purchase_bj",contentMode: .scaleAspectFill)
         bgView.addSubview(imageView)
         
@@ -347,27 +285,33 @@ struct PurchaseView :View {
     
     @ObservedObject var viewModel: PurchaseViewModel
     
+    
     var body: some View {
-        ScrollView {
-            Spacer().frame(height:274*kDesignScale)
+        
+        let vipType = PurchaseManager.default.vipType
+        
+        VStack {
+            Spacer()
+
             VStack {
-                
-                Text("Get PRO Access")
+                let text = vipType == .none ? "Get PRO Access".localized : "Super Offer for Yearly Pro".localized
+                Text(text)
                     .font(.font(name: .PoppinsBlackItalic,size: 26))
                     .foregroundColor(UIColor.white.color)
                     .frame(height: 26*kDesignScale)
                 
-                Spacer().frame(height: 12)
-                
-                HStack {
-                    Text("Unlimited")
-                        .foregroundColor("#FECB34".uiColor.color)
-      
-                    Text("Generation")
-                        .foregroundColor(UIColor.white.color)
-                    
-                }.font(.font(name: .PoppinsBlackItalic,size: 26))
-                    .frame(height: 26*kDesignScale)
+                if vipType == .none {
+                    Spacer().frame(height: 12)
+                    HStack {
+                        Text("Unlimited")
+                            .foregroundColor("#FECB34".uiColor.color)
+                        
+                        Text("Generation")
+                            .foregroundColor(UIColor.white.color)
+                        
+                    }.font(.font(name: .PoppinsBlackItalic,size: 26))
+                        .frame(height: 26*kDesignScale)
+                }
             }
             
             Spacer().frame(height: 32)
@@ -377,30 +321,30 @@ struct PurchaseView :View {
                 ZStack(alignment: .topTrailing) {
                     PurchaseItemView(title: "One Year".localized, type: .year, selectedType: $viewModel.selectedType).onTapGesture {
                         viewModel.selectedType = .year
+                        //playVibration()
                     }
                     TSVipRecView()
                         .offset(x:-30,y:-14)
                 }
-                
-//                HStack {
-//                    PurchaseItemView(title: "One Month".localized, type: .month, selectedType: $viewModel.selectedType).onTapGesture {
-//                        viewModel.selectedType = .month
-//                    }
+
+                if vipType == .none {
                     PurchaseItemView(title: "One Week".localized, type: .week, selectedType: $viewModel.selectedType).onTapGesture {
                         viewModel.selectedType = .week
                     }
-//                }
+                }
+                
+                Spacer().frame(height: 4)
                 
                 Button {
                     viewModel.buyPublisher.send(true)
                 } label: {
                     ZStack {
-                        Color.hex("#FFBD59")
+                        UIColor.themeColor.color
                         Text("Continue")
                             .font(.font(size: 16,weight: .medium))
                             .foregroundColor(.hex("#111111"))
                         
-                    }.frame(maxWidth: .infinity ,minHeight: 48.0)
+                    }.frame(maxWidth: .infinity ,minHeight: 48.0,maxHeight: 48.0)
                         .cornerRadius(24.0)
                 }
                 
@@ -434,6 +378,8 @@ struct PurchaseView :View {
                         }
                 }.font(.system(size: 12)).foregroundColor(.hex("#999999"))
             }.padding(.horizontal)
+            
+            Spacer().frame(height:9+k_Height_safeAreaInsetsBottom())
         }
     }
     
@@ -448,10 +394,7 @@ struct PurchaseView :View {
                 startPoint: UnitPoint.leading,
                 endPoint: UnitPoint.trailing
             )
-        
-        
-//            .shadow(color: gorgeousColor.opacity(0.7), radius: 6, x: 0, y: 0)
-        
+
             .foregroundColor(gorgeousColor)
             .frame(height: 20)
     }
@@ -467,7 +410,7 @@ struct PurchaseItemView: View {
         ZStack {
             Color.white.opacity(0.1)
             HStack {
-                
+                //左边加个
                 VStack(alignment: .leading, spacing: 14) {
                     Text(title).font(.font(size: 14)).foregroundColor(UIColor.white.color)
                     Text(PurchaseManager.default.price(for: type) ?? "--").font(.font(size: 18,weight: .medium)).foregroundColor(UIColor.mainText.color)
@@ -475,15 +418,9 @@ struct PurchaseItemView: View {
 
                 Spacer()
                 
+                //右边每周的💰
                 VStack(alignment: .trailing, spacing: 2) {
-                    if type == .year {
-                        if let price = PurchaseManager.default.averageWeeklyForYear() {
-                            Text("\(price)")
-                        }
-                    }else{
-                        Text("\(PurchaseManager.default.price(for: type) ?? "--")")
-                    }
-                    
+                    Text("\(PurchaseManager.default.averageWeekly(for:type) ?? "--")")
                     Text("Per week".localized)
              
                 }.font(.font(size: 16,weight: .regular)).foregroundColor(Color.white.opacity(0.6))

+ 7 - 1
AIEmoji/Business/TSSetingVC/SetingVC/TSSetingVC.swift

@@ -43,6 +43,12 @@ class TSSetingVC: TSBaseVC {
         
         publisher.enterPurchasePublisher.receive(on: DispatchQueue.main).sink { [weak self] _ in
             guard let self = self else { return }
+   
+            let vipType = kPurchaseDefault.vipType
+            if vipType == .year || vipType == .lifetime {
+                return
+            }
+            
             viewModel.pushVipPurchase(parent: self)
         }.store(in: &cancellable)
         
@@ -85,7 +91,7 @@ class TSSetingVC: TSBaseVC {
     
     @objc func vipInfoChanged() {
         kExecuteOnMainThread {
-            self.viewModel.isViper = PurchaseManager.default.isVip
+            self.viewModel.vipType = PurchaseManager.default.vipType
         }
     }
     

+ 2 - 2
AIEmoji/Business/TSSetingVC/SetingVC/TSSetingViewModel.swift

@@ -11,7 +11,7 @@ let appid = "6740220736"
 class TSSetingViewModel: ObservableObject {
     
     @Published var settingTypes: [SettingType] = SettingType.allCases
-    @Published var isViper: Bool = PurchaseManager.default.isVip
+    @Published var vipType: PremiumPeriod = PurchaseManager.default.vipType
     @Published var isHaveNewVersion: Bool = false
 
     // todo.kailen-privacy
@@ -69,7 +69,7 @@ class TSSetingViewModel: ObservableObject {
     func pushVipPurchase(parent: UIViewController) {
         TSPurchaseVC.show(target: parent) {[weak self]  in
             guard let self = self else { return }
-            isViper = PurchaseManager.default.isVip
+            vipType = PurchaseManager.default.vipType
         }
     }
     

+ 70 - 27
AIEmoji/Business/TSSetingVC/SetingVC/View/SettingPurchaseTopView.swift

@@ -7,28 +7,16 @@
 import SwiftUI
 struct SettingPurchaseTopView: View {
     var eventPublisher: ListEventPublisher
-    @Binding var isViper: Bool
+    @Binding var vipType: PremiumPeriod
     var body: some View {
+        let contentW = 343*kDesignScale
+        let contentH = 118*kDesignScale
+        let vipType = PremiumPeriod.week
         ZStack {
+            Color.clear
+            Image(.settingVipBj).resizable()//.frame(width: contentW, height: contentH)
             
-            Image(.settingVipBj).resizable().frame(width: 343*kDesignScale, height: 118*kDesignScale)
-            
-            if isViper {
-                
-                VStack {
-                    Spacer().frame(height: 20)
-                    customGradientText(text: "\(kAppName) ",fontName: .KelsiFill).frame(height: 50*kDesignScale)
-                    Spacer()
-                    
-                    Text("Due Date:".localized + " \(PurchaseManager.default.expiredDateString)")
-                        .foregroundColor(.white.opacity(0.6))
-                        .font(.font(size: 14,weight: .medium))
-                        .frame(height: 14)
-
-                    Spacer().frame(height: 22)
-                }
-            }else {
-                
+            if vipType == .none {
                 HStack {
                     Spacer().frame(width:20)
                     
@@ -53,17 +41,72 @@ struct SettingPurchaseTopView: View {
                         .foregroundColor("#010101".uiColor.color)
                         .background(UIColor.themeColor.color)
                         .cornerRadius(13.0) // 圆角
-                        .onTapGesture {
-                            if PurchaseManager.default.isVip {
-                                return
+//                        .onTapGesture {
+//                            eventPublisher.enterPurchasePublisher.send(true)
+//                        }
+
+                        Spacer().frame(width: 15)
+                }//.padding(.all,7)
+            }else if vipType == .week {
+                ZStack(){//}(alignment: .topTrailing) { // 对齐到右上角
+                    HStack {
+                        Spacer().frame(width:33)
+                        
+                        VStack(alignment: .leading,spacing: 19) {
+                            customGradientText(text: "Upgrade Yearly Pro".localized, font: .font(name: .PoppinsBlackItalic,size: 22)).frame(height: 26)
+                            HStack {
+                                Text("Due Date:".localized + " \(PurchaseManager.default.expiredDateString)")
+                                    .foregroundColor(.white.opacity(0.6))
+                                    .font(.font(size: 14,weight: .regular))
+                                    .frame(height: 14)
+                                Spacer()
                             }
-                            eventPublisher.enterPurchasePublisher.send(true)
                         }
+                        Spacer()
+                    }
+                    .border(Color.red, width: 1)
+                    //.padding(.all,20)
+                    
 
-                        Spacer().frame(width: 15)
+                  
+                    
+                }
+            }else if vipType == .year {
+                VStack {
+                    Spacer().frame(height: 20)
+                    customGradientText(text: "\(kAppName) ",font: .font(name: .KelsiFill,size: 48)).frame(height: 50*kDesignScale)
+                    Spacer()
+
+                    Text("Due Date:".localized + " \(PurchaseManager.default.expiredDateString)")
+                        .foregroundColor(.white.opacity(0.6))
+                        .font(.font(size: 14,weight: .medium))
+                        .frame(height: 14)
+
+                    Spacer().frame(height: 22)
+                }//.padding(.all,7)
+            }
+
+            
+            ZStack(alignment: .topTrailing){
+                
+                Color.clear
+                ZStack(alignment: .center){
+                    Image(.settingVipCornerMark)
+                    .resizable()
+                    .frame(width: 106, height: 103)
+                    Text("Save-Vip".localized + " 80%")
+                        .foregroundColor(Color.hex("#111111"))
+                        .font(.font(size: 12))
+                        .offset(x: 0, y: -22)
+                        .rotationEffect(.degrees(45)) // 向右旋转45度
                 }
+                //.offset(x: -3, y: -7)
+                .border(Color.yellow, width: 1)
+    
             }
-        }
+            
+        }//.padding(.all,7)
+            .border(Color.blue, width: 1)
     }
     
     // 定义一个返回 View 的方法
@@ -82,9 +125,9 @@ struct SettingPurchaseTopView: View {
 //            .minimumScaleFactor(0.5) // 最小缩放比例(0.5表示最小可缩放到初始大小的50%)
     }
     
-    func customGradientText(text:String,fontName:FontName) -> some View {
+    func customGradientText(text:String,font:Font) -> some View {
         return Text(text)
-            .font(.font(name: fontName,size: 48))
+            .font(font)
             .gradientForeground(
                 colors: [.hex("#FA794F"),.hex("#F8C32A"),.hex("#FEFBF4")],
                 startPoint: UnitPoint.leading,

+ 5 - 8
AIEmoji/Business/TSSetingVC/SetingVC/View/TSSettingListView.swift

@@ -12,16 +12,13 @@ struct TSSettingListView: View {
     var publisher: ListEventPublisher
     var body: some View {
         CocoaScrollView {
-//            Color.clear
             VStack(spacing: 0) {
                 Spacer().frame(height: 16)
                 
-                SettingPurchaseTopView(eventPublisher: publisher, isViper: $viewModel.isViper)
-                    .frame(height: 117*kDesignScale)
+                SettingPurchaseTopView(eventPublisher: publisher, vipType: $viewModel.vipType)
+                    .frame(height: 118*kDesignScale)
+                    .padding(.all,9)
                     .onTapGesture {
-                        if PurchaseManager.default.isVip {
-                            return
-                        }
                         publisher.enterPurchasePublisher.send(true)
                     }
                 
@@ -31,12 +28,12 @@ struct TSSettingListView: View {
                     .onTapGesture {
                         publisher.settingPublisher.send(type)
                     }
-                }
+                }.padding(.horizontal,16)
                 
                 Spacer()
 
             }
-            .padding(.horizontal)
+         
             Spacer().frame(height: 20)
         }
         .alwaysBounceVertical(true)

+ 2 - 2
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorErrorView.swift

@@ -97,10 +97,10 @@ extension TSGeneratorErrorView {
     
     func generalErrorView() {
         submitBtn.setTitle("Got it".localized, for: .normal)
-        errorImageView.image = UIImage(named: "yellow_warning")
+        errorImageView.image = UIImage(named: "failed_big")
         
         errorImageView.snp.updateConstraints { make in
-            make.width.height.equalTo(56)
+            make.width.height.equalTo(120)
         }
         
         textLabel.text = "Sorry there was a slight problem with the image processing, please try again later.".localized

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

@@ -57,6 +57,7 @@ class TSGeneratoringAnimationView : TSBaseView {
     
     lazy var infoLabel: UILabel = {
         let textLabel = UILabel.createLabel(font: .font(size: 14),textColor: .white.withAlphaComponent(0.6),textAlignment: .center,numberOfLines: 0)
+        textLabel.isHidden = true
         return textLabel
     }()
     
@@ -147,4 +148,9 @@ extension TSGeneratoringAnimationView {
         infoLabel.isHidden = info.isEmpty
     }
     
+    func setProgressText(text:String) {
+        textLabel.text = text
+        textLabel.isHidden = text.isEmpty
+    }
+
 }

+ 1 - 1
AIEmoji/Business/VIewTool/TSGeneratorloadingView/TSGeneratorloadingView.swift

@@ -128,7 +128,7 @@ class TSGeneratorView: TSBaseView {
         animationView.isHidden = false
         errorView.isHidden = true
         
-        animationView.textLabel.text = text
+        animationView.setProgressText(text: text)
     }
     
     func showError(text:String){

+ 1 - 1
AIEmoji/Business/VIewTool/TSViewTool.swift

@@ -84,7 +84,7 @@ class TSDynamicBlurView: UIView {
 
     lazy var blurView: DynamicBlurView = {
         let blurView = DynamicBlurView()
-        blurView.blurRadius = 16.0
+        blurView.blurRadius = 18.0//16.0
         blurView.trackingMode = .none // tracking滚动时候会很卡的
         blurView.iterations = 10
         blurView.isDeepRendering = true//ture 从 window 截图,false 从父视图截图

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

@@ -61,7 +61,7 @@ enum TSNetWorkCode : Int {
     var errorMsg:String {
         switch self {
         case .textSensitive,.imageSensitive:
-            return "Your photo may contain nudity, gore or violence that does not comply with the health policy, please replace the photo and try again.".localized
+            return "Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again.".localized
         case .networkError:
             return "No network, please check your network and try again.".localized
         default:

+ 28 - 6
AIEmoji/Common/Purchase/TSPurchaseManager.swift

@@ -208,22 +208,44 @@ 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 averageWeeklyForYear() -> String? {
-        guard let product = product(for: .year) else {
+    public func averageWeekly(for period: PremiumPeriod) -> String? {
+        guard let product = product(for: period) 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)
+        var originPrice = product.price
+        let price = originPrice.doubleValue
+        if period == .year {
+            originPrice = NSDecimalNumber(string: String(format: "%.2f", price / 52.0), locale: product.priceLocale)
+        }else if period == .month {
+            originPrice = NSDecimalNumber(string: String(format: "%.2f", price / 4.0), 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? {

+ 28 - 16
AIEmoji/Common/View/TSImageComparisonView.swift

@@ -15,6 +15,8 @@ class TSImageComparisonView: UIView {
     private var animationStartTime: CFTimeInterval = 0
     var duration: TimeInterval = 3.0
     
+    var isRunloop:Bool = false //是否循环播放,从右到左,在从左到右
+    
     // 动画方向枚举
      enum AnimationDirection {
          case leftToRight  // 从左到右(默认)
@@ -43,14 +45,10 @@ class TSImageComparisonView: UIView {
         // 新图片视图(初始隐藏)
         newImageView.contentMode = .scaleAspectFill
         newImageView.clipsToBounds = true
-        newImageView.alpha = 0
         addSubview(newImageView)
-        
+        resetNewImageView()
         // 分割线样式
         lineView.backgroundColor = .white
-//        lineView.layer.shadowColor = UIColor.black.cgColor
-//        lineView.layer.shadowRadius = 2
-//        lineView.layer.shadowOpacity = 0.8
         lineView.alpha = 0 // 初始隐藏
         addSubview(lineView)
     }
@@ -70,13 +68,12 @@ class TSImageComparisonView: UIView {
         reset()
     }
     
-    func startAnimation(duration: TimeInterval = 3.0,direction:AnimationDirection = .leftToRight) {
+    func startAnimation(duration: TimeInterval = 2.0,direction:AnimationDirection = .leftToRight) {
+
         reset()
+        
         self.duration = duration
         self.direction = direction
-        // 初始状态
-        oldImageView.alpha = 1
-        newImageView.alpha = 0
         lineView.alpha = 1
         
         // 启动动画
@@ -91,19 +88,22 @@ class TSImageComparisonView: UIView {
     }
     
     func animationComplete() {
-        self.stopAnimation()
-        self.newImageView.alpha = 1
-        self.oldImageView.alpha = 0
-        self.lineView.alpha = 0
+        
+        reset()
         self.newImageView.layer.mask = nil
+        
+        if isRunloop {
+            kDelayOnMainThread(0.3) {
+                self.startAnimation(direction: self.direction)
+            }
+        }
     }
  
     func reset() {
         stopAnimation()
-        oldImageView.alpha = 1
-        newImageView.alpha = 0
         lineView.alpha = 0
         lineView.frame.origin.x = 0
+        
     }
     
     // MARK: - 动画更新
@@ -139,11 +139,23 @@ class TSImageComparisonView: UIView {
         let maskLayer = CAShapeLayer()
         maskLayer.path = path.cgPath
         newImageView.layer.mask = maskLayer
-        newImageView.alpha = 1
         
         
         if progress >= 1.0 {
             animationComplete()
         }
     }
+    
+    func resetNewImageView(){
+        var path = UIBezierPath(rect: CGRect(
+            x: 0,
+            y: 0,
+            width: x,
+            height: bounds.height
+        ))
+        
+        let maskLayer = CAShapeLayer()
+        maskLayer.path = path.cgPath
+        newImageView.layer.mask = maskLayer
+    }
 }

+ 3 - 3
AIEmoji/Common/View/TYCycleImageComparisonView.swift

@@ -57,7 +57,7 @@ class TYCycleImageComparisonView: TSBaseView {
     lazy var cyclePagerView: TYCyclePagerView = {
         let pagerView = TYCyclePagerView()
         pagerView.isInfiniteLoop = true
-        pagerView.autoScrollInterval = 3.0
+        pagerView.autoScrollInterval = 2.2
         pagerView.delegate = self
         pagerView.dataSource = self
         pagerView.layout.layoutType = TYCyclePagerTransformLayoutType.linear
@@ -144,7 +144,7 @@ class TSHomeCyclePagerViewCell: TSBaseCollectionCell {
                 newImage: itemModel?.newImage
             )
             comparisonView.frame = self.bounds
-            comparisonView.startAnimation(duration: 3.0, direction: .rightToLeft)
+            comparisonView.startAnimation(direction: .rightToLeft)
         }
     }
     
@@ -162,7 +162,7 @@ class TSHomeCyclePagerViewCell: TSBaseCollectionCell {
     }
     
     func startAnimation() {
-        comparisonView.startAnimation(duration: 3.0, direction: .rightToLeft)
+        comparisonView.startAnimation(direction: .rightToLeft)
     }
     
     func stopAnimation() {

+ 55 - 14
AIEmoji/Res/photo_to_photo_style.json

@@ -1,9 +1,9 @@
 [
     {
         "imageName": "ptp_style_AnimeMax",
-        "imageText": "Anime Pro",
+        "imageText": "Anime",
         "prompt":"Turn uploaded photos into ghibli style",
-        "specialStyle":0,
+        "specialStyle":1,
         "isVip": true,
         "styleId": "ImageToImage-02",
         "advance":true
@@ -19,7 +19,7 @@
         "imageName": "ptp_style_ActionFigure",
         "imageText": "Action Figure",
         "prompt":"将上传的照片转化为一款3D可爱玩偶风格形象,整体造型卡通立体,主角位于画面正中,清哳可见,风格融合插画与 3D 质感。背景为玩具包装盒展示样式:包括透明塑料外壳、纸卡底板,纸卡上印有 「Limited  Edition」字样。包装设计包含玩具插卡元素,如顶部挂孔、边缘裁切线等,呈现真实的商用玩具包装感。包装内右侧竖排另外放置 4 件 “配件” 道具,要根据上传的照片中人物的造型和身份推理出匹配的道具,摆放自然协调,增强整体故事感。色调以照片配色为主,饱和度高,颜色明亮清澈,光线自然温暖,画面风格现代、专业,同时保持可爱、俏皮的趣味性。背景简洁,突出主体,整体视觉呈现应具备真实商品的质感与陈列吸引力。",
-        "input":true,
+        "input":false,
         "specialStyle":1,
         "isVip": true,
         "styleId": "ImageToImage-04",
@@ -36,9 +36,9 @@
     },
     {
         "imageName": "ptp_style_chibi",
-        "imageText": "Chibi",
+        "imageText": "Chibi Sticker",
         "prompt":"Turn the uploaded photo into a chibi sticker set of 4 pictures,every sticker should not cover the other stickers",
-        "specialStyle":2,
+        "specialStyle":0,
         "styleId": "ImageToImage-03",
         "isVip": true,
         "advance":true
@@ -47,7 +47,7 @@
         "imageName": "ptp_style_PolaroidClay",
         "imageText": "Polaroid Clay",
         "prompt":"Q版人物形象,3D黏土风,是真实世界的光影,保留原始人物细节,包括服装和造型。整体放在一张拍立得照片中,有一只手握着拍立得相纸。图中角色从拍立得相纸中,突破边框,延伸进入现实世界的二维空间。背景延续拍立得中的背景,Q版风格,背景不需要再有人物出现,仅作为拍立得中背景的延展,与照片原始场景一致。拍立得底部文字是“Life Moment”。",
-        "specialStyle":2,
+        "specialStyle":0,
         "isVip": true,
         "styleId": "ImageToImage-07",
         "advance":true
@@ -59,6 +59,8 @@
         "styleId": "ImageToImage-08",
         "isVip": false
     },
+    
+    
     {
         "imageName": "ptp_style_Doodle",
         "imageText": "Picture Book",
@@ -79,7 +81,7 @@
     },
     {
         "imageName": "ptp_style_Statue",
-        "imageText": "Simpson",
+        "imageText": "Statue",
         "prompt":"turn photo into Comment Statue style",
         "specialStyle":0,
         "isVip": false,
@@ -88,7 +90,7 @@
     },
     {
         "imageName": "ptp_style_CibiMarukoChan",
-        "imageText": "3D Box",
+        "imageText": "Cibi",
         "prompt":"Please create image in Cibi Maruko Chan Style",
         "specialStyle":0,
         "isVip": true,
@@ -107,7 +109,7 @@
     {
         "imageName": "ptp_style_MusicBox",
         "imageText": "Music Box",
-        "prompt":"根据照片上的内容打造一款细致精美、萌趣可爱的3D渲染收藏摆件,装置在柔和粉彩色调、温馨浪漫的展示盒中。展示盒为浅奶油色搭配柔和的金色装饰,形似精致的便携珠宝盒。打开盒盖,呈现出一幕温暖浪漫的场景:两位Q版角色正甜蜜相望。盒顶雕刻着“FOREVER TOGETHER”(永远在一起)的字样,周围点缀着小巧精致的星星与爱心图案。两人都拥有充满表现力的眼睛,以及柔和、温暖的微笑,传递出浓浓的爱意和迷人的气质。他们身后有一扇圆形窗户,透过窗户能看到阳光明媚的中国古典小镇天际线和轻柔飘浮的云朵。盒内以温暖的柔和光线进行照明,背景中漂浮着花瓣点缀气氛。整个展示盒和角色的色调优雅和谐,营造出一个奢华而梦幻的迷你纪念品场景。",
+        "prompt":"根据照片上的内容打造一款细致精美、萌趣可爱的3D渲染收藏摆件,装置在柔和粉彩色调、温馨浪漫的展示盒中。展示盒为浅奶油色搭配柔和的金色装饰,形似精致的便携珠宝盒。打开盒盖,呈现出一幕温暖浪漫的场景:两位Q版角色正甜蜜相望。盒顶雕刻着“FOREVER/Users/100years/Downloads/download/ptp_style_CibiMarukoChan@3x.png TOGETHER”(永远在一起)的字样,周围点缀着小巧精致的星星与爱心图案。两人都拥有充满表现力的眼睛,以及柔和、温暖的微笑,传递出浓浓的爱意和迷人的气质。他们身后有一扇圆形窗户,透过窗户能看到阳光明媚的中国古典小镇天际线和轻柔飘浮的云朵。盒内以温暖的柔和光线进行照明,背景中漂浮着花瓣点缀气氛。整个展示盒和角色的色调优雅和谐,营造出一个奢华而梦幻的迷你纪念品场景。",
         "specialStyle":0,
         "isVip": true,
         "styleId": "ImageToImage-10",
@@ -179,7 +181,7 @@
     },
     {
         "imageName": "ptp_style_Minecraft",
-        "imageText": "Statue",
+        "imageText": "3D Box",
         "prompt":"turn photo into MINECRAFT style",
         "specialStyle":0,
         "isVip": true,
@@ -206,7 +208,7 @@
     },
     {
         "imageName": "ptp_style_Simpson",
-        "imageText": "Blue Fairy",
+        "imageText": "Simpson",
         "prompt":"请将我的照片转化为辛普森风格",
         "specialStyle":0,
         "isVip": true,
@@ -215,7 +217,7 @@
     },
     {
         "imageName": "ptp_style_Smurf",
-        "imageText": "Mariner King",
+        "imageText": "Blue Fairy",
         "prompt":"Please create image in Smurf Style",
         "specialStyle":0,
         "isVip": true,
@@ -224,7 +226,7 @@
     },
     {
         "imageName": "ptp_style_OnePiece",
-        "imageText": "Son of Dragon",
+        "imageText": "Mariner King",
         "prompt":"Please create image in One Piece style",
         "specialStyle":0,
         "isVip": true,
@@ -242,7 +244,7 @@
     },
     {
         "imageName": "ptp_style_DRAGONBALL",
-        "imageText": "Cibi",
+        "imageText": "Son of Dragon",
         "prompt":"Please create image in DRAGON BALL style",
         "specialStyle":0,
         "isVip": true,
@@ -448,6 +450,45 @@
         "styleId": "ImageToImage-39",
         "isVip": true
     },
+    
+    {
+        "imageName": "ptp_style_ZackMorty",
+        "imageText": "Zack&Morty",
+        "prompt":"Please create image in Rick & Morty style",
+        "specialStyle":0,
+        "isVip": true,
+        "styleId": "",
+        "advance":true
+    },
+    {
+        "imageName": "ptp_style_Shinchan",
+        "imageText": "Shin-chan",
+        "prompt":"Please create image in Crayon Shin-chan style",
+        "specialStyle":0,
+        "isVip": true,
+        "styleId": "",
+        "advance":true
+    },
+    {
+        "imageName": "ptp_style_Barbie",
+        "imageText": "Barbie",
+        "prompt":"Please create image in Barbie style",
+        "specialStyle":0,
+        "isVip": true,
+        "styleId": "",
+        "advance":true
+    },
+    {
+        "imageName": "ptp_style_JoJo",
+        "imageText": "JoJo",
+        "prompt":"Please create image in JOJO style",
+        "specialStyle":0,
+        "isVip": true,
+        "styleId": "",
+        "advance":true
+    },
+    
+    
     {
         "imageName": "ptp_style_none",
         "imageText": "No Style",

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

@@ -387,3 +387,10 @@
 "Super Offer for Yearly Pro" = "Superangebot für Yearly Pro";
 "Only %s per day" = "Nur %s pro Tag";
 "Reselect photos" = "Fotos erneut auswählen";
+"Zack&Morty" = "Rick & Morty";
+"Shin-chan" = "Buntstift Shin-chan";
+"Barbie" = "Barbie";
+"JoJo" = "JoJo";
+"Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again." = "Ihr Foto enthält möglicherweise Urheberrechtsverletzungen, Nacktheit, blutige Szenen oder Gewalt, die nicht mit den Gesundheitsrichtlinien übereinstimmen. Bitte ersetzen Sie das Foto und versuchen Sie es erneut.";
+"Anime" = "Anime";
+"Chibi Sticker" = "Aufkleber";

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

@@ -384,3 +384,10 @@
 "Super Offer for Yearly Pro" = "Super Offer for Yearly Pro";
 "Only %s per day" = "Only %s per day";
 "Reselect photos" = "Reselect photos";
+"Zack&Morty" = "Zack&Morty";
+"Shin-chan" = "Shin-chan";
+"Barbie" = "Barbie";
+"JoJo" = "JoJo";
+"Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again." = "Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again.";
+"Anime" = "Anime";
+"Chibi Sticker" = "Chibi Sticker";

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

@@ -384,3 +384,10 @@
 "Super Offer for Yearly Pro" = "Super Oferta para Yearly Pro";
 "Only %s per day" = "Sólo %s al día";
 "Reselect photos" = "Volver a seleccionar fotos";
+"Zack&Morty" = "Rick & Morty";
+"Shin-chan" = "Crayón Shin-chan";
+"Barbie" = "Barbie";
+"JoJo" = "JoJo";
+"Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again." = "Es posible que tu foto contenga infracciones de derechos de autor, desnudos, escenas sangrientas o violencia que no se ajusten a la Política Sanitaria; sustituye la foto e inténtalo de nuevo.";
+"Anime" = "Anime";
+"Chibi Sticker" = "Pegatina";

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

@@ -383,3 +383,10 @@
 "Super Offer for Yearly Pro" = "年会スーパー特典";
 "Only %s per day" = "1日あたり %s のみ";
 "Reselect photos" = "写真を再選択します";
+"Zack&Morty" = "リック&モーティ";
+"Shin-chan" = "クレヨンしんちゃん";
+"Barbie" = "バービー";
+"JoJo" = "JoJo";
+"Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again." = "あなたの写真には、著作権侵害、ヌード、グロ、暴力など、ヘルスポリシーに準拠しないものが含まれている可能性があります。";
+"Anime" = "アニメ";
+"Chibi Sticker" = "ステッカー";

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

@@ -389,3 +389,10 @@
 "Super Offer for Yearly Pro" = "연간회원권 슈퍼할인";
 "Only %s per day" = "하루에 %s 만";
 "Reselect photos" = "사진 다시 선택";
+"Zack&Morty" = "릭 앤 모티";
+"Shin-chan" = "크레용 신짱";
+"Barbie" = "Barbie";
+"JoJo" = "JoJo";
+"Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again." = "사진에 저작권 침해, 나체, 유혈, 폭력 등 운영원칙에 맞지 않는 내용이 포함되어 있을 수 있으니 사진을 교체하고 다시 시도하세요.";
+"Anime" = "애니메이션";
+"Chibi Sticker" = "스티커";

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

@@ -383,3 +383,10 @@
 "Super Offer for Yearly Pro" = "Super oferta para o Yearly Pro";
 "Only %s per day" = "Apenas %s por dia";
 "Reselect photos" = "Selecionar fotos novamente";
+"Zack&Morty" = "Rick & Morty";
+"Shin-chan" = "Crayon Shin-chan";
+"Barbie" = "Barbie";
+"JoJo" = "JoJo";
+"Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again." = "Sua foto pode conter violação de direitos autorais, nudez, sangue ou violência que não estejam em conformidade com a Política de Saúde.";
+"Anime" = "Anime";
+"Chibi Sticker" = "Adesivo";

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

@@ -383,3 +383,10 @@
 "Super Offer for Yearly Pro" = "Super oferta para o Yearly Pro";
 "Only %s per day" = "Apenas %s por dia";
 "Reselect photos" = "Selecionar fotos novamente";
+"Zack&Morty" = "Rick & Morty";
+"Shin-chan" = "Crayon Shin-chan";
+"Barbie" = "Barbie";
+"JoJo" = "JoJo";
+"Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again." = "Sua foto pode conter violação de direitos autorais, nudez, sangue ou violência que não estejam em conformidade com a Política de Saúde.";
+"Anime" = "Anime";
+"Chibi Sticker" = "Adesivo";

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

@@ -385,3 +385,10 @@
 "Super Offer for Yearly Pro" = "年度会员超级优惠";
 "Only %s per day" = "每日仅需 %s";
 "Reselect photos" = "重新选择照片";
+"Zack&Morty" = "瑞克和莫蒂";
+"Shin-chan" = "蜡笔小新";
+"Barbie" = "芭比";
+"JoJo" = "JoJo";
+"Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again." = "你的照片可能含有不符合健康政策的侵权、裸露、血腥或暴力内容,请更换照片并重试。";
+"Anime" = "动漫";
+"Chibi Sticker" = "Q版贴纸";

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

@@ -375,3 +375,10 @@
 "Super Offer for Yearly Pro" = "年度會員超級優惠";
 "Only %s per day" = "每日僅需 %s";
 "Reselect photos" = "重新選擇照片";
+"Zack&Morty" = "瑞克與莫蒂";
+"Shin-chan" = "蠟筆小新";
+"Barbie" = "芭比";
+"JoJo" = "JoJo";
+"Your photo may contain copyright infringement, nudity, gore or violence that does not comply with the Health Policy, please replace the photo and try again." = "您的照片可能包含侵犯版權、裸露、血腥或暴力等不符合健康政策的內容,請更換照片並重試。";
+"Anime" = "動漫";
+"Chibi Sticker" = "Q版貼紙";