TSAIListPhotoGeneratorBaseVC.swift 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. //
  2. // TSAIListPhotoGeneratorBaseVC.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/4/9.
  6. //
  7. class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
  8. var imageModel:TSActionInfoModel?
  9. var complete:((TSActionInfoModel)->Void)
  10. var imageUrl:String?
  11. var upLoadImage:UIImage
  12. var generatorStyle:TSGeneratorImageStyle
  13. var progressState = TSProgressState.none
  14. var isSavePhotoMark:Bool = false
  15. var isNeedSavePhoto:Bool {
  16. if isSavePhotoMark == false,let _ = imageModel {
  17. return true
  18. }
  19. return false
  20. }
  21. init(upLoadImage:UIImage,generatorStyle:TSGeneratorImageStyle,complete:@escaping ((TSActionInfoModel)->Void)) {
  22. self.upLoadImage = upLoadImage
  23. self.generatorStyle = generatorStyle
  24. self.complete = complete
  25. super.init()
  26. }
  27. lazy var viewModel: TSAIListPhotoGeneratorBaseVM = {
  28. let viewModel:TSAIListPhotoGeneratorBaseVM = TSAIListPhotoGeneratorBaseVM(upLoadImage: upLoadImage, generatorStyle: generatorStyle)
  29. return viewModel
  30. }()
  31. @MainActor required init?(coder: NSCoder) {
  32. fatalError("init(coder:) has not been implemented")
  33. }
  34. lazy var generateInView : TSGeneratorloadingView = {
  35. let generateInView = TSGeneratorloadingView()
  36. return generateInView
  37. }()
  38. lazy var switchOriginalPictureBtn: UIButton = {
  39. let switchOriginalPictureBtn = UIButton.createButton(image:UIImage(named: "switch_original_picture"))
  40. switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchDown), for: .touchDown)
  41. switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel])
  42. switchOriginalPictureBtn.isHidden = true
  43. return switchOriginalPictureBtn
  44. }()
  45. override func createView() {
  46. contentView.addSubview(generateInView)
  47. generateInView.snp.makeConstraints { make in
  48. make.edges.equalToSuperview()
  49. }
  50. super.createView()
  51. contentView.addSubview(switchOriginalPictureBtn)
  52. switchOriginalPictureBtn.snp.makeConstraints { make in
  53. make.bottom.equalTo(-k_Height_safeAreaInsetsBottom() - 76)
  54. make.trailing.equalTo(-16)
  55. make.width.equalTo(40)
  56. make.height.equalTo(40)
  57. }
  58. bigSaveBtn.setTitleImageSpace(spacing: 0)
  59. }
  60. override func closePage() {
  61. if progressState.isResult {
  62. if isNeedSavePhoto{
  63. TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
  64. message: "You haven't saved the photo yet. Are you sure to quit?".localized,
  65. messageColor: .white,
  66. messageFont: .systemFont(ofSize: 16),
  67. cancelTitle: "Quit".localized,
  68. cancelColor: .white,
  69. confirmTitle: "Save".localized,
  70. confirmColor: .themeColor,
  71. cancelAction: { [weak self] in
  72. guard let self = self else { return }
  73. print("用户点击了Leave")
  74. viewModel.cancelAllRequest()
  75. self.dismiss(animated: true, completion: nil)
  76. },
  77. confirmAction: { [weak self] in
  78. guard let self = self else { return }
  79. print("用户点击了Stay")
  80. clickSaveBtn()
  81. }
  82. ))
  83. }else{
  84. viewModel.cancelAllRequest()
  85. self.dismiss(animated: true, completion: nil)
  86. }
  87. }else{
  88. TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
  89. message: "As you leave, your generation will be interrupted and no result.".localized,
  90. messageColor: .white,
  91. messageFont: .systemFont(ofSize: 16),
  92. cancelTitle: "Leave".localized,
  93. cancelColor: .white,
  94. confirmTitle: "Wait".localized,
  95. confirmColor: .themeColor,
  96. cancelAction: { [weak self] in
  97. guard let self = self else { return }
  98. print("用户点击了Leave")
  99. viewModel.cancelAllRequest()
  100. self.dismiss(animated: true, completion: nil)
  101. },
  102. confirmAction: {
  103. print("用户点击了Stay")
  104. }
  105. ))
  106. }
  107. }
  108. //重试
  109. @objc override func clickTryAgainBtn(){
  110. clickRegenerateBtn()
  111. }
  112. //重新生成
  113. @objc override func clickRegenerateBtn(){
  114. //判断 vip
  115. if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: .picToPic) == false, vc: self){ return }
  116. viewModel.uploadAndCreatImage()
  117. }
  118. //保存功能
  119. @objc override func clickSaveBtn(){
  120. if let image = getSuccessImage() {
  121. PhotoManagerShared.saveImageToAlbum(image) { [weak self] success, error in
  122. guard let self = self else { return }
  123. if success {
  124. isSavePhotoMark = true
  125. kSavePhotoSuccesswShared.show(atView:self.view)
  126. }else{
  127. debugPrint(error)
  128. }
  129. }
  130. }
  131. }
  132. override func dealThings() {
  133. viewModel.uploadAndCreatImage()
  134. viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
  135. guard let self = self else { return }
  136. self.upDateView(state: state, model: model)
  137. }.store(in: &cancellable)
  138. }
  139. }
  140. extension TSAIListPhotoGeneratorBaseVC {
  141. func getSuccessImage()->UIImage?{
  142. if let image = netWorkImageView.image {
  143. return image.pngImage
  144. }
  145. return nil
  146. }
  147. }
  148. extension TSAIListPhotoGeneratorBaseVC {
  149. func upDateView(state:TSProgressState,model:TSActionInfoModel?){
  150. progressState = state
  151. switch state {
  152. case .failed(let errorStr):
  153. showError(text: errorStr)
  154. case .success:
  155. if let model = model {
  156. showSuccess(model: model)
  157. }else{
  158. showError(text: nil)
  159. }
  160. case .progressString(let string):
  161. showProgress(text: string)
  162. default:
  163. showLoading()
  164. }
  165. }
  166. func showProgress(text:String) {
  167. generateInView.isHidden = false
  168. generateInView.showLoading(text: text)
  169. generateInView.isRotating = true
  170. isClickTheBlankClosePage = false
  171. bottomView.isHidden = true
  172. netWorkImageView.isHidden = true
  173. switchOriginalPictureBtn.isHidden = true
  174. }
  175. func showLoading(){
  176. generateInView.isHidden = false
  177. generateInView.showLoading(text: "Generating".localized + " ...")
  178. generateInView.isRotating = true
  179. isClickTheBlankClosePage = false
  180. bottomView.isHidden = true
  181. netWorkImageView.isHidden = true
  182. switchOriginalPictureBtn.isHidden = true
  183. }
  184. func showError(text:String?){
  185. let msg = "Failed to generate, please try later".localized
  186. generateInView.isHidden = false
  187. generateInView.showError(text: msg)
  188. generateInView.isRotating = false
  189. isClickTheBlankClosePage = true
  190. tryAgainBtn.isHidden = false
  191. bigSaveBtn.isHidden = true
  192. bottomView.isHidden = false
  193. netWorkImageView.isHidden = true
  194. switchOriginalPictureBtn.isHidden = true
  195. }
  196. func showSuccess(model:TSActionInfoModel){
  197. generateInView.isHidden = true
  198. generateInView.isRotating = false
  199. imageModel = model
  200. isClickTheBlankClosePage = true
  201. tryAgainBtn.isHidden = false
  202. bigSaveBtn.isHidden = false
  203. bottomView.isHidden = false
  204. netWorkImageView.isHidden = false
  205. switchOriginalPictureBtn.isHidden = false
  206. isSavePhotoMark = false
  207. self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
  208. kPurchaseDefault.useOnceForFree(type: .picToPic)
  209. if let model = imageModel {
  210. complete(model)
  211. }
  212. }
  213. @objc func switchOriginalPictureTouchDown() {
  214. self.netWorkImageView.image = upLoadImage
  215. }
  216. @objc func switchOriginalPictureTouchUp() {
  217. guard let imageModel = imageModel else { return }
  218. self.netWorkImageView.setAsyncImage(urlString: imageModel.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
  219. }
  220. }