|
@@ -0,0 +1,258 @@
|
|
|
+//
|
|
|
+// TSAIChangeEmoteVC.swift
|
|
|
+// AIEmoji
|
|
|
+//
|
|
|
+// Created by 100Years on 2025/4/10.
|
|
|
+//
|
|
|
+
|
|
|
+import PhotosUI
|
|
|
+
|
|
|
+class TSAIChangeEmoteVC: TSBaseVC {
|
|
|
+
|
|
|
+ lazy var viewModel: TSAIChangeEmoteVM = {
|
|
|
+ let viewModel:TSAIChangeEmoteVM = TSAIChangeEmoteVM()
|
|
|
+ return viewModel
|
|
|
+ }()
|
|
|
+
|
|
|
+ var upLoadImage:UIImage?{
|
|
|
+ didSet{
|
|
|
+ topImageView.image = upLoadImage
|
|
|
+ }
|
|
|
+ }
|
|
|
+ lazy var photoPickerManager: TSPhotoPickerManager = {
|
|
|
+ let photoPickerManager = TSPhotoPickerManager(viewController: self)
|
|
|
+ return photoPickerManager
|
|
|
+ }()
|
|
|
+
|
|
|
+ //###################################### topImageView ######################################
|
|
|
+ lazy var topImageView: UIImageView = {
|
|
|
+ let imageView = UIImageView()
|
|
|
+ imageView.contentMode = .scaleAspectFit
|
|
|
+ return imageView
|
|
|
+ }()
|
|
|
+
|
|
|
+ //###################################### style类型 ######################################
|
|
|
+ lazy var styleView: TSAIChangeEmoteStyleView = {
|
|
|
+ let styleView = TSAIChangeEmoteStyleView()
|
|
|
+ styleView.currentIndexPath = IndexPath(item: viewModel.selectedStyleIndex, section: 0)
|
|
|
+ styleView.dataArray = viewModel.selectStyleModels
|
|
|
+ styleView.selectedValueBlock = { [weak self] model in
|
|
|
+ guard let self = self else { return }
|
|
|
+ handelSelectedValueBlock(model: model)
|
|
|
+ }
|
|
|
+ return styleView
|
|
|
+ }()
|
|
|
+ //###################################### 按钮 ######################################
|
|
|
+
|
|
|
+ lazy var saveBtn: UIButton = {
|
|
|
+ let btn = UIButton.createButton(title: "Save".localized,backgroundColor: .themeColor,font: .font(size: 12),titleColor: "#111111".uiColor,corner: 14){ [weak self] in
|
|
|
+ guard let self = self else { return }
|
|
|
+
|
|
|
+ if let img = topImageView.image, let image = img.pngImage{
|
|
|
+ PhotoManagerShared.saveImageToAlbum(image) { success, error in
|
|
|
+ if success {
|
|
|
+ kSavePhotoSuccesswShared.show(atView:self.view)
|
|
|
+ }else{
|
|
|
+ debugPrint(error)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ btn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 25, bottom: 0, right: 25)
|
|
|
+ return btn
|
|
|
+ }()
|
|
|
+
|
|
|
+ lazy var switchOriginalPictureBtn: UIButton = {
|
|
|
+ let switchOriginalPictureBtn = UIButton.createButton(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
|
|
|
+ }()
|
|
|
+
|
|
|
+ lazy var generateInView : TSGeneratorloadingView = {
|
|
|
+ let generateInView = TSGeneratorloadingView()
|
|
|
+ generateInView.setBackgroundColor(color: UIColor.black.withAlphaComponent(0.8))
|
|
|
+ generateInView.isHidden = true
|
|
|
+ return generateInView
|
|
|
+ }()
|
|
|
+
|
|
|
+ override func createView() {
|
|
|
+ setUpView()
|
|
|
+
|
|
|
+ view.addSubview(generateInView)
|
|
|
+ generateInView.snp.makeConstraints { make in
|
|
|
+ make.edges.equalToSuperview()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override func dealThings() {
|
|
|
+ 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)
|
|
|
+
|
|
|
+ TSAIAgeImageHintVC.userDefaultsKey = "isFirstAIChangeEmote"
|
|
|
+
|
|
|
+ if TSAIAgeImageHintVC.isShowUploadImageHint{
|
|
|
+ TSAIAgeImageHintVC.isShowUploadImageHint = false
|
|
|
+ self.presentModalHintVC()
|
|
|
+ }else {
|
|
|
+ self.pickSinglePhoto()
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+extension TSAIChangeEmoteVC {
|
|
|
+
|
|
|
+ func setUpView() {
|
|
|
+
|
|
|
+ addNormalNavBarView()
|
|
|
+ setPageTitle("")
|
|
|
+ normalNavBarView.barView.addSubview(saveBtn)
|
|
|
+ saveBtn.snp.makeConstraints { make in
|
|
|
+ make.centerY.equalToSuperview()
|
|
|
+ make.trailing.equalTo(-16)
|
|
|
+ make.height.equalTo(28)
|
|
|
+ }
|
|
|
+
|
|
|
+ contentView.addSubview(styleView)
|
|
|
+ contentView.addSubview(topImageView)
|
|
|
+
|
|
|
+ styleView.snp.makeConstraints { make in
|
|
|
+ make.bottom.equalTo(-10-k_Height_safeAreaInsetsBottom())
|
|
|
+ make.leading.trailing.equalTo(0)
|
|
|
+ make.height.equalTo(100)
|
|
|
+ }
|
|
|
+
|
|
|
+ topImageView.snp.makeConstraints { make in
|
|
|
+ make.bottom.equalTo(styleView.snp.top).offset(-10)
|
|
|
+ make.leading.equalTo(0)
|
|
|
+ make.trailing.equalTo(0)
|
|
|
+ make.top.equalTo(0)
|
|
|
+ }
|
|
|
+
|
|
|
+ topImageView.addSubview(switchOriginalPictureBtn)
|
|
|
+ switchOriginalPictureBtn.snp.makeConstraints { make in
|
|
|
+ make.bottom.equalTo(-16)
|
|
|
+ make.trailing.equalTo(-16)
|
|
|
+ make.width.equalTo(40)
|
|
|
+ make.height.equalTo(40)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+extension TSAIChangeEmoteVC {
|
|
|
+ func handelSelectedValueBlock(model:TSGenerateStyleModel) {
|
|
|
+ switchOriginalPictureBtn.isHidden = true
|
|
|
+ if model.clickType == 1 { //无类型
|
|
|
+ topImageView.image = upLoadImage
|
|
|
+ styleView.agreeWillSelectIndexPath()
|
|
|
+ }else if model.clickType == 2 { //换图
|
|
|
+ self.pickSinglePhoto()
|
|
|
+ }else{
|
|
|
+ if kJudgeVip(externalBool: true, vc: self){ return }//判断 vip
|
|
|
+ viewModel.selectStyleModel = model
|
|
|
+ viewModel.uploadAndCreatImage()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func switchOriginalPictureTouchDown() {
|
|
|
+ self.topImageView.image = upLoadImage
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc func switchOriginalPictureTouchUp() {
|
|
|
+ guard let selectStyleModel = viewModel.selectStyleModel else { return }
|
|
|
+ guard let actionInfoModel = selectStyleModel.actionInfoModel else { return }
|
|
|
+ self.topImageView.setAsyncImage(urlString: actionInfoModel.response.resultUrl,placeholder:upLoadImage)
|
|
|
+ }
|
|
|
+}
|
|
|
+extension TSAIChangeEmoteVC {
|
|
|
+
|
|
|
+ func pickSinglePhoto() {
|
|
|
+ photoPickerManager.pickSinglePhoto(maxBitSize: kUploadImageMaxBitSize) { [weak self] image, errorString in
|
|
|
+ guard let self = self else { return }
|
|
|
+ if let errorString = errorString {
|
|
|
+ TSToastShared.showToast(text: errorString)
|
|
|
+ }else{
|
|
|
+ handlePhotoPicke(image: image)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ func presentModalHintVC(){
|
|
|
+ let vc = TSAIAgeImageHintVC()
|
|
|
+ vc.clickUpImageHandle = { [weak self] image in
|
|
|
+ guard let self = self else { return }
|
|
|
+ handlePhotoPicke(image: image)
|
|
|
+ }
|
|
|
+ kPresentModalVC(target: self, modelVC: vc,transitionStyle: .crossDissolve)
|
|
|
+ }
|
|
|
+
|
|
|
+ func handlePhotoPicke(image:UIImage?){
|
|
|
+ if let image = image {
|
|
|
+ upLoadImage = image
|
|
|
+ viewModel.upLoadImage = image
|
|
|
+ styleView.agreeWillSelectIndexPath()
|
|
|
+ }
|
|
|
+
|
|
|
+ if upLoadImage == nil {
|
|
|
+ pop()
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+extension TSAIChangeEmoteVC {
|
|
|
+ func upDateView(state:TSProgressState,model:TSActionInfoModel?){
|
|
|
+ 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)
|
|
|
+ case .none:
|
|
|
+ generateInView.isHidden = true
|
|
|
+ generateInView.isRotating = false
|
|
|
+ default:
|
|
|
+ showLoading()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ func showProgress(text:String) {
|
|
|
+ generateInView.isHidden = false
|
|
|
+ generateInView.showLoading(text: text)
|
|
|
+ generateInView.isRotating = true
|
|
|
+ }
|
|
|
+
|
|
|
+ func showLoading(){
|
|
|
+ generateInView.isHidden = false
|
|
|
+ generateInView.showLoading(text: "Generating".localized + " ...".localized)
|
|
|
+ generateInView.isRotating = true
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ func showError(text:String?){
|
|
|
+ let msg = "Failed to generate, please try later".localized
|
|
|
+ generateInView.isHidden = false
|
|
|
+ generateInView.showError(text: msg)
|
|
|
+ generateInView.isRotating = false
|
|
|
+ }
|
|
|
+
|
|
|
+ func showSuccess(model:TSActionInfoModel){
|
|
|
+ generateInView.isHidden = true
|
|
|
+ generateInView.isRotating = false
|
|
|
+
|
|
|
+ viewModel.selectStyleModel?.actionInfoModel = model
|
|
|
+
|
|
|
+ self.topImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder:upLoadImage)
|
|
|
+
|
|
|
+ styleView.agreeWillSelectIndexPath()
|
|
|
+ switchOriginalPictureBtn.isHidden = false
|
|
|
+ }
|
|
|
+}
|