TSAIListPhotoGeneratorBaseVC.swift 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  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. var videoPlayerVC: TSAIListVideoPlayerVC = TSAIListVideoPlayerVC(videoURL: URL(string: "www.baidu.com")!)
  28. lazy var viewModel: TSAIListPhotoGeneratorBaseVM = {
  29. let viewModel:TSAIListPhotoGeneratorBaseVM = TSAIListPhotoGeneratorBaseVM(upLoadImage: upLoadImage, generatorStyle: generatorStyle)
  30. return viewModel
  31. }()
  32. @MainActor required init?(coder: NSCoder) {
  33. fatalError("init(coder:) has not been implemented")
  34. }
  35. lazy var generateInView : TSGeneratorloadingView = {
  36. let generateInView = TSGeneratorloadingView()
  37. return generateInView
  38. }()
  39. lazy var switchOriginalPictureBtn: TSUIExpandedTouchButton = {
  40. let switchOriginalPictureBtn = TSUIExpandedTouchButton()
  41. switchOriginalPictureBtn.setUpButton(image:UIImage(named: "switch_original_picture"))
  42. switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchDown), for: .touchDown)
  43. switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel])
  44. switchOriginalPictureBtn.isHidden = true
  45. return switchOriginalPictureBtn
  46. }()
  47. override func createView() {
  48. contentView.addSubview(generateInView)
  49. generateInView.snp.makeConstraints { make in
  50. make.edges.equalToSuperview()
  51. }
  52. super.createView()
  53. contentView.addSubview(switchOriginalPictureBtn)
  54. switchOriginalPictureBtn.snp.makeConstraints { make in
  55. make.bottom.equalTo(-k_Height_safeAreaInsetsBottom() - 76)
  56. make.trailing.equalTo(-16)
  57. make.width.equalTo(40)
  58. make.height.equalTo(40)
  59. }
  60. bigSaveBtn.setTitleImageSpace(spacing: 0)
  61. }
  62. override func closePage() {
  63. if progressState.isResult {
  64. if isNeedSavePhoto{
  65. TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
  66. message: "You haven't saved the photo yet. Are you sure to quit?".localized,
  67. messageColor: .white,
  68. messageFont: .systemFont(ofSize: 16),
  69. cancelTitle: "Quit".localized,
  70. cancelColor: .white,
  71. confirmTitle: "Save".localized,
  72. confirmColor: .themeColor,
  73. cancelAction: { [weak self] in
  74. guard let self = self else { return }
  75. print("用户点击了Leave")
  76. viewModel.cancelAllRequest()
  77. self.dismiss(animated: true, completion: nil)
  78. },
  79. confirmAction: { [weak self] in
  80. guard let self = self else { return }
  81. print("用户点击了Stay")
  82. clickSaveBtn()
  83. }
  84. ))
  85. }else{
  86. viewModel.cancelAllRequest()
  87. self.dismiss(animated: true, completion: nil)
  88. }
  89. }else{
  90. TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
  91. message: "As you leave, your generation will be interrupted and no result.".localized,
  92. messageColor: .white,
  93. messageFont: .systemFont(ofSize: 16),
  94. cancelTitle: "Leave".localized,
  95. cancelColor: .white,
  96. confirmTitle: "Wait".localized,
  97. confirmColor: .themeColor,
  98. cancelAction: { [weak self] in
  99. guard let self = self else { return }
  100. print("用户点击了Leave")
  101. viewModel.cancelAllRequest()
  102. self.dismiss(animated: true, completion: nil)
  103. },
  104. confirmAction: {
  105. print("用户点击了Stay")
  106. }
  107. ))
  108. }
  109. }
  110. //重试
  111. @objc override func clickTryAgainBtn(){
  112. clickRegenerateBtn()
  113. }
  114. //重新生成
  115. @objc override func clickRegenerateBtn(){
  116. //判断 vip
  117. if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: .picToPic) == false, vc: self){ return }
  118. viewModel.uploadAndCreatImage()
  119. }
  120. //保存功能
  121. @objc override func clickSaveBtn(){
  122. if generatorStyle == .photoLive,let imageModel = imageModel {
  123. TSDownloadManager.getDownLoadVideo(urlString: imageModel.response.resultUrl) { url, success in
  124. if let url = url {
  125. PhotoManagerShared.saveVideoToAlbum(videoURL: url) { [weak self] success, error in
  126. guard let self = self else { return }
  127. if success {
  128. isSavePhotoMark = true
  129. kSavePhotoSuccesswShared.show(atView:self.view)
  130. }else{
  131. debugPrint(error)
  132. }
  133. }
  134. }
  135. }
  136. }else{
  137. if let image = getSuccessImage() {
  138. PhotoManagerShared.saveImageToAlbum(image) { [weak self] success, error in
  139. guard let self = self else { return }
  140. if success {
  141. isSavePhotoMark = true
  142. kSavePhotoSuccesswShared.show(atView:self.view)
  143. }else{
  144. debugPrint(error)
  145. }
  146. }
  147. }
  148. }
  149. }
  150. override func dealThings() {
  151. viewModel.uploadAndCreatImage()
  152. viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
  153. guard let self = self else { return }
  154. self.upDateView(state: state, model: model)
  155. }.store(in: &cancellable)
  156. }
  157. }
  158. extension TSAIListPhotoGeneratorBaseVC {
  159. func getSuccessImage()->UIImage?{
  160. if let image = netWorkImageView.image {
  161. return image.pngImage
  162. }
  163. return nil
  164. }
  165. }
  166. extension TSAIListPhotoGeneratorBaseVC {
  167. func upDateView(state:TSProgressState,model:TSActionInfoModel?){
  168. progressState = state
  169. switch state {
  170. case .failed(let errorStr):
  171. showError(text: errorStr)
  172. case .success:
  173. if let model = model {
  174. showSuccess(model: model)
  175. }else{
  176. showError(text: nil)
  177. }
  178. case .progressString(let string):
  179. showProgress(text: string)
  180. default:
  181. showLoading()
  182. }
  183. }
  184. func showProgress(text:String) {
  185. generateInView.updateShowProgress(text: text)
  186. isClickTheBlankClosePage = false
  187. bottomView.isHidden = true
  188. netWorkImageView.isHidden = true
  189. switchOriginalPictureBtn.isHidden = true
  190. setVideoHidden()
  191. }
  192. func showLoading(){
  193. generateInView.updateShowLoading(text: "Generating".localized + " ...".localized)
  194. isClickTheBlankClosePage = false
  195. bottomView.isHidden = true
  196. netWorkImageView.isHidden = true
  197. switchOriginalPictureBtn.isHidden = true
  198. setVideoHidden()
  199. }
  200. func showError(text:String?){
  201. let msg = "Failed to generate, please try later".localized
  202. generateInView.updateShowError(text: msg)
  203. isClickTheBlankClosePage = true
  204. tryAgainBtn.isHidden = false
  205. bigSaveBtn.isHidden = true
  206. bottomView.isHidden = false
  207. netWorkImageView.isHidden = true
  208. switchOriginalPictureBtn.isHidden = true
  209. setVideoHidden()
  210. }
  211. func showSuccess(model:TSActionInfoModel){
  212. generateInView.updateShowSuccess()
  213. imageModel = model
  214. isClickTheBlankClosePage = true
  215. tryAgainBtn.isHidden = false
  216. bigSaveBtn.isHidden = false
  217. bottomView.isHidden = false
  218. netWorkImageView.isHidden = false
  219. switchOriginalPictureBtn.isHidden = false
  220. isSavePhotoMark = false
  221. self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
  222. kPurchaseDefault.useOnceForFree(type: .picToPic)
  223. if let model = imageModel {
  224. complete(model)
  225. }
  226. setVideoURL()
  227. }
  228. @objc func switchOriginalPictureTouchDown() {
  229. self.netWorkImageView.image = upLoadImage
  230. }
  231. @objc func switchOriginalPictureTouchUp() {
  232. guard let imageModel = imageModel else { return }
  233. self.netWorkImageView.setAsyncImage(urlString: imageModel.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
  234. }
  235. func setVideoHidden(){
  236. if generatorStyle == .photoLive {
  237. videoPlayerVC.removeFromParent()
  238. videoPlayerVC.view.removeFromSuperview()
  239. }
  240. }
  241. func setVideoURL(){
  242. if generatorStyle == .photoLive {
  243. if let model = imageModel {
  244. switchOriginalPictureBtn.isHidden = true
  245. self.videoPlayerVC = TSAIListVideoPlayerVC(videoURL: model.videoURL)
  246. self.addChild(self.videoPlayerVC)
  247. self.videoPlayerVC.view.frame = self.netWorkImageView.bounds
  248. self.netWorkImageView.addSubview(self.videoPlayerVC.view)
  249. self.videoPlayerVC.setControlsBottom(bottem: -20)
  250. }
  251. }
  252. }
  253. }