|
@@ -12,7 +12,8 @@ class TSPTPInputVC: TSBaseVC {
|
|
|
let viewModel = TSPTPInputVM()
|
|
|
viewModel.isCanGennerateBlock = { [weak self] isCan in
|
|
|
guard let self = self else { return }
|
|
|
- submitBtn.isEnabled = isCan
|
|
|
+// submitBtn.isEnabled = isCan
|
|
|
+ creatBtnView.setBtnEnabled(isEnabled: isCan)
|
|
|
}
|
|
|
return viewModel
|
|
|
}()
|
|
@@ -191,6 +192,8 @@ class TSPTPInputVC: TSBaseVC {
|
|
|
automaticallyAdjustsScrollViewInsets = false
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
cp.sectionActionHandler = { [weak self] cellCp, indexPath in
|
|
|
guard let self = self else { return }
|
|
|
if let cmd = cellCp as? String, cmd == "delete" {
|
|
@@ -202,9 +205,48 @@ class TSPTPInputVC: TSBaseVC {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ cp.itemActionHandler = { [weak self] (object, indexPath) in
|
|
|
+ guard let self = self else { return }
|
|
|
+ //删除过期的任务
|
|
|
+ if let cmd = object as? String, cmd == "delete_task_expired" {
|
|
|
+// TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
|
|
|
+// message: "This task has expired".localized,
|
|
|
+// messageColor: .white,
|
|
|
+// messageFont: .systemFont(ofSize: 16),
|
|
|
+//
|
|
|
+// cancelTitle: "Cancel".localized,
|
|
|
+// cancelColor: .white,
|
|
|
+//
|
|
|
+// confirmTitle: "Delete".localized,
|
|
|
+// confirmColor: .themeColor,
|
|
|
+//
|
|
|
+// cancelAction: {},
|
|
|
+// confirmAction: {
|
|
|
+ TSPTPHistory.shared.removeModel(index: indexPath.item)
|
|
|
+ self.viewModel.updateRecentData()
|
|
|
+ self.collectionComponent.clear()
|
|
|
+ self.collectionComponent.reloadView(with: self.viewModel.colDataArray)
|
|
|
+// }
|
|
|
+// ))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
cp.itemDidSelectedHandler = { [weak self] (object, indexPath) in
|
|
|
guard let self = self else { return }
|
|
|
-
|
|
|
+// if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel{
|
|
|
+// if let currentActionInfoModel = sections.items.safeObj(At: indexPath.item) {
|
|
|
+// let gennerateVC = TSPTPGeneratorVC(generateStyleModel: TSGenerateStyleModel(),infoModel: currentActionInfoModel.dataModel) { model in }
|
|
|
+// gennerateVC.modalPresentationStyle = .overFullScreen
|
|
|
+// gennerateVC.modalTransitionStyle = .crossDissolve
|
|
|
+// self.present(gennerateVC, animated: true)
|
|
|
+//
|
|
|
+// }
|
|
|
+//
|
|
|
+// }
|
|
|
+
|
|
|
if let sections = viewModel.colDataArray.safeObj(At: indexPath.section) as? TSGenmojiCoLSectionModel{
|
|
|
var dataModelArray:[TSActionInfoModel] = []
|
|
|
for itemModel in sections.items {
|
|
@@ -221,15 +263,31 @@ class TSPTPInputVC: TSBaseVC {
|
|
|
return cp
|
|
|
}()
|
|
|
|
|
|
- //###################################### 按钮 ######################################
|
|
|
- lazy var submitBtn: UIButton = {
|
|
|
- let submitBtn = kCreateNormalSubmitBtn(title: getVipText()) { [weak self] in
|
|
|
+ //###################################### Button ######################################
|
|
|
+ lazy var creatBtnView:TSAppBtnView = {
|
|
|
+ let creatBtnView = TSAppBtnView()
|
|
|
+ creatBtnView.setUpButton(style: .generate, vipFreeNumType: .picToPic) { [weak self] in
|
|
|
guard let self = self else { return }
|
|
|
generateImage()
|
|
|
}
|
|
|
- submitBtn.cornerRadius = 24.0
|
|
|
- submitBtn.isEnabled = false
|
|
|
- return submitBtn
|
|
|
+ creatBtnView.setBtnEnabled(isEnabled: false)
|
|
|
+ creatBtnView.isIconVipBlock = { [weak self] in
|
|
|
+ guard let self = self else { return false}
|
|
|
+ var showVip = kPurchaseDefault.generateVipShow(type: .picToPic)
|
|
|
+ if showVip == false {
|
|
|
+ showVip = self.viewModel.selectedPTPStyleModel.isVip
|
|
|
+ }
|
|
|
+ return showVip
|
|
|
+ }
|
|
|
+ creatBtnView.isClickVipBlock = { [weak self] in
|
|
|
+ guard let self = self else { return false}
|
|
|
+ var isVip = kPurchaseDefault.freeNumAvailable(type: .picToPic) == false
|
|
|
+ if viewModel.selectedPTPStyleModel.isVip == true {
|
|
|
+ isVip = true
|
|
|
+ }
|
|
|
+ return isVip
|
|
|
+ }
|
|
|
+ return creatBtnView
|
|
|
}()
|
|
|
|
|
|
|
|
@@ -249,8 +307,8 @@ class TSPTPInputVC: TSBaseVC {
|
|
|
make.edges.equalToSuperview()
|
|
|
}
|
|
|
|
|
|
- contentView.addSubview(submitBtn)
|
|
|
- submitBtn.snp.makeConstraints { make in
|
|
|
+ contentView.addSubview(creatBtnView)
|
|
|
+ creatBtnView.snp.makeConstraints { make in
|
|
|
make.bottom.equalTo(-16)
|
|
|
make.leading.equalTo(16)
|
|
|
make.trailing.equalTo(-16)
|
|
@@ -260,28 +318,23 @@ class TSPTPInputVC: TSBaseVC {
|
|
|
setUpCusStackView()
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
override func dealThings() {
|
|
|
|
|
|
+ //设置colDataArray 数据
|
|
|
collectionComponent.clear()
|
|
|
collectionComponent.reloadView(with:viewModel.colDataArray)
|
|
|
|
|
|
+ //监听 vip 变化
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(vipInfoChanged), name: .kPurchaseDidChanged, object: nil)
|
|
|
updateVipView()
|
|
|
+
|
|
|
TSAIListHintBaseVC.userDefaultsKey = "isFirstUploadImagePTP"
|
|
|
|
|
|
// // 监听键盘事件
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
|
|
|
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
|
|
|
|
|
|
-// kDelayMainShort {
|
|
|
-// let contentSize = self.collectionComponent.collectionView.collectionViewLayout.collectionViewContentSize
|
|
|
-// self.collectionComponent.collectionView.snp.updateConstraints { make in
|
|
|
-// make.height.equalTo(contentSize.height)
|
|
|
-// }
|
|
|
-// }
|
|
|
-
|
|
|
+ //监听collectionView 的 contentSize
|
|
|
collectionViewObserver = CollectionViewObserver(collectionView: collectionComponent.collectionView)
|
|
|
collectionViewObserver.onContentSizeChange = {[weak self] size in
|
|
|
guard let self = self else { return }
|
|
@@ -290,6 +343,25 @@ class TSPTPInputVC: TSBaseVC {
|
|
|
make.height.equalTo(size.height)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ //监听按钮任务生成中
|
|
|
+ NotificationCenter.default.addObserver(forName: .kBaseOperationQueueCountChanged, object: nil, queue: nil) { [weak self] notification in
|
|
|
+ guard let self = self else { return }
|
|
|
+ setCreatBtnEnabled()
|
|
|
+ }
|
|
|
+
|
|
|
+ NotificationCenter.default.addObserver(forName: .kGeneratePTPOperationChanged, object: nil, queue: nil) { [weak self] notification in
|
|
|
+ guard let self = self else { return }
|
|
|
+ if let userInfo = notification.userInfo as? [String: Any],let state = userInfo["state"] as? TSProgressState {
|
|
|
+ dePrint("TSBaseOperation stateDatauPblished 收到 = \(state)")
|
|
|
+ if state.reloadNewData {
|
|
|
+ self.viewModel.updateRecentData()
|
|
|
+ collectionComponent.clear()
|
|
|
+ collectionComponent.reloadView(with:viewModel.colDataArray)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -389,13 +461,7 @@ extension TSPTPInputVC {
|
|
|
func updateVipView() {
|
|
|
kExecuteOnMainThread {
|
|
|
self.vipBtn.isHidden = PurchaseManager.default.isVip
|
|
|
-
|
|
|
- var showVip = kPurchaseDefault.generateVipShow(type: .picToPic)
|
|
|
- if showVip == false {
|
|
|
- showVip = self.viewModel.selectedPTPStyleModel.isVip
|
|
|
- }
|
|
|
-
|
|
|
- kSetBtnVipIcon(btn: self.submitBtn, show: showVip)
|
|
|
+ self.creatBtnView.updateVipView()
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -413,22 +479,22 @@ extension TSPTPInputVC {
|
|
|
|
|
|
func generateImage() {
|
|
|
|
|
|
- var isVip = kPurchaseDefault.freeNumAvailable(type: .picToPic) == false
|
|
|
- if viewModel.selectedPTPStyleModel.isVip == true {
|
|
|
- isVip = true
|
|
|
- }
|
|
|
- if kJudgeVip(externalBool: isVip, vc: self) { return } //判断 vip
|
|
|
+// var isVip = kPurchaseDefault.freeNumAvailable(type: .picToPic) == false
|
|
|
+// if viewModel.selectedPTPStyleModel.isVip == true {
|
|
|
+// isVip = true
|
|
|
+// }
|
|
|
+// if kJudgeVip(externalBool: isVip, vc: self) { return } //判断 vip
|
|
|
|
|
|
viewModel.selectedPTPStyleModel.upLoadImage = viewModel.upLoadImage
|
|
|
viewModel.selectedPTPStyleModel.upLoadImageUrl = nil
|
|
|
let gennerateVC = TSPTPGeneratorVC(generateStyleModel: viewModel.selectedPTPStyleModel) { [weak self] model in
|
|
|
guard let self = self else { return }
|
|
|
- if viewModel.saveModel(model:model) {
|
|
|
- collectionComponent.clear()
|
|
|
- collectionComponent.reloadView(with:viewModel.colDataArray)
|
|
|
- }else{
|
|
|
- collectionComponent.reloadData()
|
|
|
- }
|
|
|
+// if viewModel.saveModel(model:model) {
|
|
|
+// collectionComponent.clear()
|
|
|
+// collectionComponent.reloadView(with:viewModel.colDataArray)
|
|
|
+// }else{
|
|
|
+// collectionComponent.reloadData()
|
|
|
+// }
|
|
|
|
|
|
updateVipView()
|
|
|
}
|
|
@@ -439,26 +505,30 @@ extension TSPTPInputVC {
|
|
|
}
|
|
|
kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
|
|
|
}
|
|
|
+
|
|
|
+ func setCreatBtnEnabled() {
|
|
|
+ let isAvailability = TSGeneratePTPOperationQueue.shared.isAvailability
|
|
|
+ if viewModel.isCanGennerate,isAvailability {
|
|
|
+ creatBtnView.setBtnEnabled(isEnabled: true)
|
|
|
+ creatBtnView.loadingAnimation(loading: false)
|
|
|
+ dePrint("TSTextGeneralPicVC setCreatBtnEnabled false")
|
|
|
+ }else{
|
|
|
+ dePrint("TSTextGeneralPicVC setCreatBtnEnabled = \(isAvailability)")
|
|
|
+ creatBtnView.setBtnEnabled(isEnabled: false)
|
|
|
+ creatBtnView.loadingAnimation(loading: !isAvailability)
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
extension TSPTPInputVC {
|
|
|
@objc func keyboardWillShow(_ notification: Notification) {
|
|
|
guard let keyboardFrame = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return }
|
|
|
- let textView = customTextView
|
|
|
-// guard let scrollView = cusStackView.scrollView else { return }
|
|
|
let scrollView = cusStackView.scrollView
|
|
|
- // 1. 计算键盘高度(减去安全区域)
|
|
|
let keyboardHeight = keyboardFrame.height - view.safeAreaInsets.bottom
|
|
|
-// dePrint("keyboardHeight = \(keyboardHeight )")
|
|
|
- // 2. 直接获取 TextView 在 ScrollView 中的位置
|
|
|
- let textViewFrame = scrollView.convert(textView.frame, from: textView.superview)
|
|
|
-// dePrint("textViewFrame = \(textViewFrame)")
|
|
|
- // 3. 计算需要滚动的距离(TextView 底部 - (屏幕高度 - 键盘高度))
|
|
|
- var scrollDistance = textViewFrame.maxY - (scrollView.bounds.height - keyboardHeight)
|
|
|
-// dePrint("scrollDistance = \(scrollDistance)")
|
|
|
- // 4. 如果需要滚动,调整 contentOffset
|
|
|
- var y = scrollDistance
|
|
|
+ let textViewFrame = scrollView.convert(customTextView.frame, from: customTextView.superview)
|
|
|
+ let scrollDistance = textViewFrame.maxY - (scrollView.bounds.height - keyboardHeight)
|
|
|
+ let y = scrollDistance
|
|
|
scrollView.setContentOffset(CGPoint(x: 0, y: y),animated: true)
|
|
|
}
|
|
|
|