TSPurchasePromotionalVC.swift 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. //
  2. // TSPurchasePromotionalVC.swift
  3. // AIEmoji
  4. //
  5. // Created by 100Years on 2025/6/30.
  6. //
  7. import APNGKit
  8. import Delegate
  9. class TSPurchasePromotionalVC: TSBaseVC {
  10. var isHandlePurchaseStateChanged = true //是否处理购买状态变化
  11. var closePageBlock:(()->Void)?
  12. lazy var topImageView: UIImageView = UIImageView.createImageView(imageName: "promotional_topImage",contentMode: .scaleAspectFill)
  13. lazy var shaowImageView: UIImageView = UIImageView.createImageView(imageName: "purchase_bj",contentMode: .scaleAspectFill)
  14. lazy var promotionalPrice: String = PurchaseManager.default.introductoryPrice(for: .week(.weekPromotional1)) ?? "--"
  15. lazy var originalPrice: String = PurchaseManager.default.price(for: .week(.weekPromotional1)) ?? "--"
  16. lazy var frontCtnView: UIView = creatFrontCtnView()
  17. lazy var bottomBtnsView: UIView = creatBottomBtnsView()
  18. lazy var countdownView: UIView = creatCountdownView()
  19. let minLabel:UILabel = UILabel()
  20. let secLabel:UILabel = UILabel()
  21. lazy var apngImageView: APNGImageView = creatApngImageView()
  22. var isAnimation:Bool = false
  23. init(isAnimation: Bool, closePageBlock: ( () -> Void)? = nil) {
  24. self.closePageBlock = closePageBlock
  25. self.isAnimation = isAnimation
  26. super.init()
  27. }
  28. @MainActor required init?(coder: NSCoder) {
  29. fatalError("init(coder:) has not been implemented")
  30. }
  31. let animationView:UIView = UIView()
  32. lazy var animationLab: UILabel = {
  33. let animationLab = UILabel.createLabel(text: "LUCKY GIFT\nFOR YOU!".localized,font:.font(name: .PoppinsBold, size: 38),textAlignment: .center)
  34. animationLab.alpha = 0.0
  35. return animationLab
  36. }()
  37. lazy var closeBtn:TSUIExpandedTouchButton = {
  38. let closeBtn = TSUIExpandedTouchButton()
  39. closeBtn.setUpButton(image:.closeGray){ [weak self] in
  40. guard let self = self else { return }
  41. closePage()
  42. }
  43. return closeBtn
  44. }()
  45. override func createView() {
  46. setNavBarViewHidden(true)
  47. self.view.backgroundColor = .clear
  48. contentView.addSubview(topImageView)
  49. contentView.addSubview(shaowImageView)
  50. contentView.addSubview(frontCtnView)
  51. contentView.addSubview(closeBtn)
  52. topImageView.snp.makeConstraints { make in
  53. make.leading.trailing.top.equalToSuperview()
  54. make.height.equalTo(532*kDesignScale)
  55. }
  56. shaowImageView.snp.makeConstraints { make in
  57. make.leading.trailing.bottom.top.equalToSuperview()
  58. }
  59. frontCtnView.snp.makeConstraints { make in
  60. make.leading.trailing.bottom.top.equalToSuperview()
  61. }
  62. closeBtn.snp.makeConstraints { make in
  63. make.leading.equalTo(16)
  64. make.top.equalTo(4+k_Height_statusBar())
  65. make.width.height.equalTo(36)
  66. }
  67. if isAnimation {
  68. self.contentView.alpha = 0.0
  69. addApngImageView()
  70. }
  71. }
  72. override func dealThings() {
  73. kPurchaseCountDownTime.complete = { [weak self] minutes, seconds, end in
  74. guard let self = self else { return }
  75. if end {
  76. self.closePage()
  77. }else{
  78. self.minLabel.text = minutes
  79. self.secLabel.text = seconds
  80. }
  81. }
  82. onPurchaseStateChanged()
  83. }
  84. @objc func closePage(){
  85. kMainAsync {
  86. TSToastShared.hideLoading()
  87. self.closePageBlock?()
  88. self.dismiss(animated: true)
  89. NotificationCenter.default.post(name: .kCloseTSPurchasePromotionalVC, object: nil)
  90. }
  91. }
  92. func onPurchaseStateChanged(){
  93. PurchaseManager.default.onPurchaseStateChanged = { [weak self] manager,state,object in
  94. guard let self = self else { return }
  95. if isHandlePurchaseStateChanged == false {
  96. debugPrint("purchaseManager.onPurchaseStateChanged 不处理")
  97. return
  98. }
  99. DispatchQueue.main.async {
  100. switch state {
  101. case .none:
  102. break
  103. case .loading:
  104. TSToastShared.showLoading(text: "Getting price".localized,containerView: self.view)
  105. case .loadSuccess:
  106. TSToastShared.hideLoading()
  107. case .loadFail:
  108. TSToastShared.hideLoading()
  109. let message = "Failed to get the price, will automatically retry in 5 seconds".localized
  110. TSToastShared.showToast(text: message)
  111. DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
  112. PurchaseManager.default.requestProducts()
  113. }
  114. case .paying:
  115. TSToastShared.showLoading(text: "Purchasing now".localized,containerView: self.view)
  116. case .paySuccess:
  117. TSToastShared.hideLoading()
  118. var loadingText = "Finish".localized
  119. if manager.isVip {
  120. loadingText = manager.vipType == .year ? "Congratulations on being VIP of the Year!".localized : "Congratulation you have become VIP".localized
  121. }
  122. TSToastShared.showToast(text:loadingText)
  123. if manager.isVip {
  124. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  125. self.closePage()
  126. }
  127. }
  128. case .payFail:
  129. TSToastShared.hideLoading()
  130. if let str = object as? String {
  131. TSToastShared.showToast(text: str)
  132. }
  133. case .restoreing:
  134. TSToastShared.showLoading(text: "Restoring now".localized,containerView: self.view)
  135. case .restoreSuccess:
  136. TSToastShared.hideLoading()
  137. let loadingText = manager.isVip ? "Congratulation you have become VIP".localized : "Couldn't Restore Subscription".localized
  138. debugPrint(loadingText)
  139. TSToastShared.showToast(text:loadingText)
  140. if manager.isVip {
  141. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  142. self.closePage()
  143. }
  144. }
  145. case .restoreFail:
  146. TSToastShared.hideLoading()
  147. let loadingText = (object as? String) ?? "Failed to restore subscribe, please try again".localized
  148. debugPrint(loadingText)
  149. TSToastShared.showToast(text: loadingText)
  150. case .verifying:
  151. #if DEBUG
  152. TSToastShared.showLoading(text: "Verifying receipt...".localized,containerView: self.view)
  153. #endif
  154. case .verifySuccess:
  155. break
  156. case .verifyFail:
  157. #if DEBUG
  158. TSToastShared.hideLoading()
  159. let message = (object as? String) ?? "Failed to validate receipt".localized
  160. TSToastShared.showToast(text:message)
  161. #endif
  162. }
  163. }
  164. debugPrint("PurchaseManager onPurchaseStateChanged=\(String(describing: state))")
  165. }
  166. }
  167. }