TSAIListPhotoGeneratorBaseVC.swift 13 KB

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