123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- //
- // TSAIListPhotoGeneratorBaseVC.swift
- // AIEmoji
- //
- // Created by 100Years on 2025/4/9.
- //
- struct TSAIListPhotoGeneratorModel {
- var upLoadImage:UIImage
- var generatorStyle:TSGeneratorImageStyle
- var expandEdge:UIEdgeInsets
- var expandViewSizes:(CGSize,CGSize)?
- init(upLoadImage: UIImage,
- generatorStyle: TSGeneratorImageStyle,
- expandEdge:UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0),
- expandViewSizes:(CGSize,CGSize)? = nil
- ) {
- self.upLoadImage = upLoadImage
- self.generatorStyle = generatorStyle
- self.expandEdge = expandEdge
- self.expandViewSizes = expandViewSizes
- }
- }
- class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
- init(generatorModel:TSAIListPhotoGeneratorModel,complete:@escaping ((TSActionInfoModel)->Void)) {
- self.complete = complete
- self.viewModel = TSAIListPhotoGeneratorBaseVM(generatorModel: generatorModel)
- super.init()
- }
- @MainActor required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
-
- var imageModel:TSActionInfoModel?
- var complete:((TSActionInfoModel)->Void)
- var progressState = TSProgressState.none
-
- var isSavePhotoMark:Bool = false
- var isNeedSavePhoto:Bool {
- if isSavePhotoMark == false,let _ = imageModel {
- return true
- }
- return false
- }
-
- var viewModel: TSAIListPhotoGeneratorBaseVM!
- var videoPlayerVC: TSAIListVideoPlayerVC = TSAIListVideoPlayerVC(videoURL: URL(string: "www.baidu.com")!)
-
- lazy var generateInView : TSGeneratorloadingView = {
- let generateInView = TSGeneratorloadingView()
- return generateInView
- }()
-
- lazy var expandAreaView: TSAIExpandChangeView = {
- let view = TSAIExpandChangeView()
- return view
- }()
-
- lazy var switchOriginalPictureBtn: TSUIExpandedTouchButton = {
- let switchOriginalPictureBtn = TSUIExpandedTouchButton()
- switchOriginalPictureBtn.setUpButton(image:UIImage(named: "switch_original_picture"))
- switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchDown), for: .touchDown)
- switchOriginalPictureBtn.addTarget(self, action: #selector(switchOriginalPictureTouchUp), for: [.touchUpInside, .touchUpOutside, .touchCancel])
- switchOriginalPictureBtn.isHidden = true
- return switchOriginalPictureBtn
- }()
-
- override func createView() {
- contentView.addSubview(generateInView)
- generateInView.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
- super.createView()
-
- contentView.addSubview(switchOriginalPictureBtn)
- switchOriginalPictureBtn.snp.makeConstraints { make in
- make.bottom.equalTo(-k_Height_safeAreaInsetsBottom() - 76)
- make.trailing.equalTo(-16)
- make.width.equalTo(40)
- make.height.equalTo(40)
- }
-
- bigSaveBtn.setTitleImageSpace(spacing: 0)
-
- if viewModel.generatorModel.generatorStyle == .photoExpand {
- setUpExpandAreaView()
- }
- }
-
- func setUpExpandAreaView(){
- netWorkImageView.addSubview(expandAreaView)
- expandAreaView.snp.makeConstraints { make in
- make.top.leading.trailing.bottom.equalTo(0)
- }
-
- expandAreaView.showImageView.isHidden = true
- expandAreaView.boardView.isHidden = true
-
- if let sizes = self.viewModel.generatorModel.expandViewSizes {
- expandAreaView.updateExpandAreaView(width: sizes.0.width, height: sizes.0.height)
- expandAreaView.updateImageView(width: sizes.1.width, height: sizes.1.height)
- }
- }
-
- override func closePage() {
-
- if progressState.isResult {
- if isNeedSavePhoto{
- TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
- message: "You haven't saved the photo yet. Are you sure to quit?".localized,
- messageColor: .white,
- messageFont: .systemFont(ofSize: 16),
-
- cancelTitle: "Quit".localized,
- cancelColor: .white,
-
- confirmTitle: "Save".localized,
- confirmColor: .themeColor,
-
- cancelAction: { [weak self] in
- guard let self = self else { return }
- print("用户点击了Leave")
- viewModel.cancelAllRequest()
- self.dismiss(animated: true, completion: nil)
- },
- confirmAction: { [weak self] in
- guard let self = self else { return }
- print("用户点击了Stay")
- clickSaveBtn()
- }
- ))
- }else{
- viewModel.cancelAllRequest()
- self.dismiss(animated: true, completion: nil)
- }
- }else{
- TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
- message: "As you leave, your generation will be interrupted and no result.".localized,
- messageColor: .white,
- messageFont: .systemFont(ofSize: 16),
-
- cancelTitle: "Leave".localized,
- cancelColor: .white,
-
- confirmTitle: "Wait".localized,
- confirmColor: .themeColor,
-
- cancelAction: { [weak self] in
- guard let self = self else { return }
- print("用户点击了Leave")
- viewModel.cancelAllRequest()
- self.dismiss(animated: true, completion: nil)
- },
- confirmAction: {
- print("用户点击了Stay")
- }
- ))
- }
- }
-
- //重试
- @objc override func clickTryAgainBtn(){
- clickRegenerateBtn()
- }
-
- //重新生成
- @objc override func clickRegenerateBtn(){
- //判断 vip
- if kJudgeVip(externalBool: kPurchaseDefault.freeNumAvailable(type: .picToPic) == false, vc: self){ return }
-
- viewModel.uploadAndCreatImage()
- }
-
- //保存功能
- @objc override func clickSaveBtn(){
- guard let imageModel = imageModel else { return }
- if viewModel.generatorModel.generatorStyle == .photoLive{
- TSDownloadManager.getDownLoadVideo(urlString: imageModel.response.resultUrl) { url, success in
- if let url = url {
- PhotoManagerShared.saveVideoToAlbum(videoURL: url) { [weak self] success, error in
- guard let self = self else { return }
- if success {
- isSavePhotoMark = true
- kSavePhotoSuccesswShared.show(atView:self.view)
- }else{
- debugPrint(error)
- }
- }
- }
- }
- }else{
- UIImageView.downloadImageWithProgress(urlString: imageModel.response.resultUrl) { image in
- if let image = image {
- PhotoManagerShared.saveImageToAlbum(image) { [weak self] success, error in
- guard let self = self else { return }
- if success {
- isSavePhotoMark = true
- kSavePhotoSuccesswShared.show(atView:self.view)
- }else{
- debugPrint(error)
- }
- }
- }
- }
- }
- }
-
- override func dealThings() {
- viewModel.uploadAndCreatImage()
- viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
- guard let self = self else { return }
- self.upDateView(state: state, model: model)
- }.store(in: &cancellable)
- }
-
- }
- extension TSAIListPhotoGeneratorBaseVC {
-
- func getSuccessImage()->UIImage?{
- if let image = netWorkImageView.image {
- return image.pngImage
- }
- return nil
- }
-
- }
- extension TSAIListPhotoGeneratorBaseVC {
-
- func upDateView(state:TSProgressState,model:TSActionInfoModel?){
- progressState = state
- switch state {
- case .failed(let errorStr):
- showError(text: errorStr)
- case .success:
- if let model = model {
- showSuccess(model: model)
- }else{
- showError(text: nil)
- }
- case .progressString(let string):
- showProgress(text: string)
- default:
- showLoading()
- }
- }
-
- func showProgress(text:String) {
- generateInView.updateShowProgress(text: text)
-
- isClickTheBlankClosePage = false
- bottomView.isHidden = true
- netWorkImageView.isHidden = true
- switchOriginalPictureBtn.isHidden = true
-
- setVideoHidden()
- }
-
- func showLoading(){
- generateInView.updateShowLoading(text: "Generating".localized + " ...".localized)
- isClickTheBlankClosePage = false
- bottomView.isHidden = true
- netWorkImageView.isHidden = true
- switchOriginalPictureBtn.isHidden = true
-
- setVideoHidden()
- }
-
- func showError(text:String?){
- let msg = "Failed to generate, please try later".localized
- generateInView.updateShowError(text: msg)
- isClickTheBlankClosePage = true
-
- tryAgainBtn.isHidden = false
- bigSaveBtn.isHidden = true
- bottomView.isHidden = false
- netWorkImageView.isHidden = true
- switchOriginalPictureBtn.isHidden = true
-
- setVideoHidden()
- }
-
- func showSuccess(model:TSActionInfoModel){
- generateInView.updateShowSuccess()
- imageModel = model
- isClickTheBlankClosePage = true
-
- tryAgainBtn.isHidden = false
- bigSaveBtn.isHidden = false
- bottomView.isHidden = false
- netWorkImageView.isHidden = false
- switchOriginalPictureBtn.isHidden = false
- isSavePhotoMark = false
- self.netWorkImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
-
- kPurchaseDefault.useOnceForFree(type: .picToPic)
- if let model = imageModel {
- complete(model)
- }
-
- setVideoURL()
- setExpandAreaImage()
- }
-
- @objc func switchOriginalPictureTouchDown() {
- if viewModel.generatorModel.generatorStyle == .photoExpand {
- expandAreaView.onlyBgImage(only: false)
- }else{
- self.netWorkImageView.image = self.viewModel.generatorModel.upLoadImage
- }
- }
-
- @objc func switchOriginalPictureTouchUp() {
- guard let imageModel = imageModel else { return }
-
- if viewModel.generatorModel.generatorStyle == .photoExpand {
- expandAreaView.onlyBgImage(only: true)
- }else{
- self.netWorkImageView.setAsyncImage(urlString: imageModel.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
- }
- }
- }
- extension TSAIListPhotoGeneratorBaseVC {
- func setVideoHidden(){
- if viewModel.generatorModel.generatorStyle == .photoLive {
- videoPlayerVC.removeFromParent()
- videoPlayerVC.view.removeFromSuperview()
- }
- }
-
- func setVideoURL(){
- if viewModel.generatorModel.generatorStyle == .photoLive {
- if let model = imageModel {
- switchOriginalPictureBtn.isHidden = true
- self.videoPlayerVC = TSAIListVideoPlayerVC(videoURL: model.videoURL)
- self.addChild(self.videoPlayerVC)
- self.videoPlayerVC.view.frame = self.netWorkImageView.bounds
- self.netWorkImageView.addSubview(self.videoPlayerVC.view)
- self.videoPlayerVC.setControlsBottom(bottem: -20)
- }
- }
- }
- }
- extension TSAIListPhotoGeneratorBaseVC {
-
- func setExpandAreaImage(){
- if viewModel.generatorModel.generatorStyle == .photoExpand {
- netWorkImageView.image = nil
- expandAreaView.bgImageView.setAsyncImage(urlString: imageModel?.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
- expandAreaView.showImageView.image = self.viewModel.generatorModel.upLoadImage
- }
- }
- }
|