KMSubscribeWaterMarkWindowController.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. //
  2. // KMSubscribeWaterMarkWindowController.swift
  3. // PDF Master
  4. //
  5. // Created by lizhe on 2023/6/12.
  6. //
  7. import Cocoa
  8. var subscribeWaterMarkController: KMSubscribeWaterMarkWindowController?
  9. var subscribeWaterMarkMainWindow: NSWindow?
  10. @objc enum KMSubscribeWaterMarkType: Int {
  11. case none = 0
  12. case stamp = 1
  13. case link
  14. case sign
  15. case editText
  16. case editImage
  17. case insert
  18. case extract
  19. case replace
  20. case split
  21. case delete
  22. case rotate
  23. case copy
  24. case toWord
  25. case toExcel
  26. case toPPT
  27. case toRTF
  28. case toCSV
  29. case toHTML
  30. case toText
  31. case toImage
  32. case compress
  33. case merge
  34. case setPassword
  35. case removePassword
  36. case crop
  37. case aiTranslate
  38. case aiRewrite
  39. case aiCorrect
  40. }
  41. typealias KMSubscribeWaterMarkWindowControllerCloseAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  42. typealias KMSubscribeWaterMarkWindowControllerWatermarkExportAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  43. typealias KMSubscribeWaterMarkWindowControllerSubscribeAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  44. typealias KMSubscribeWaterMarkWindowControllerRestoreAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  45. class KMSubscribeWaterMarkWindowController: NSWindowController {
  46. @IBOutlet weak var waterMarkView: KMSubscribeWaterMarkView!
  47. @IBOutlet weak var waterViewHeightConstrain: NSLayoutConstraint!
  48. var closeAction: KMSubscribeWaterMarkWindowControllerCloseAction?
  49. var subscribeAction: KMSubscribeWaterMarkWindowControllerSubscribeAction?
  50. var watermarkExportAction: KMSubscribeWaterMarkWindowControllerWatermarkExportAction?
  51. var restoreAction: KMSubscribeWaterMarkWindowControllerRestoreAction?
  52. var isContinue: Bool?
  53. var isAI: Bool?
  54. deinit {
  55. KMPrint("KMSubscribeWaterMarkWindowController 释放")
  56. }
  57. override func windowDidLoad() {
  58. super.windowDidLoad()
  59. self.setup()
  60. self.reloadData()
  61. // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
  62. }
  63. override func awakeFromNib() {
  64. super.awakeFromNib()
  65. if let data = self.isAI, data {
  66. self.waterMarkView.waterExportButton.isHidden = true
  67. self.waterMarkView.subTrailingConst.constant = 60
  68. self.waterMarkView.subWidthConst.constant = 280
  69. self.waterMarkView.preferentialImageTrailingConst.constant = 92
  70. } else {
  71. self.waterMarkView.waterExportButton.isHidden = false
  72. self.waterMarkView.subTrailingConst.constant = 0
  73. self.waterMarkView.subWidthConst.constant = 192
  74. self.waterMarkView.preferentialImageTrailingConst.constant = 32
  75. }
  76. }
  77. //MARK: 打开文件
  78. static func show(window: NSWindow, isContinue: Bool = false, type: KMSubscribeWaterMarkType = .none, subscribeDidClick: (()->Void)? = nil, completion: @escaping (_ isSubscribeSuccess: Bool, _ isWaterMarkExport: Bool, _ isClose: Bool) -> Void) -> KMSubscribeWaterMarkWindowController {
  79. var isAI = false
  80. if type == .aiCorrect ||
  81. type == .aiRewrite ||
  82. type == .aiTranslate {
  83. isAI = true
  84. } else {
  85. isAI = false
  86. }
  87. if KMLightMemberManager.manager.isLogin() {
  88. let subscribeWaterMarkWindowController: KMSubscribeWaterMarkWindowController = KMSubscribeWaterMarkWindowController.init(windowNibName: "KMSubscribeWaterMarkWindowController")
  89. subscribeWaterMarkWindowController.isContinue = isContinue
  90. subscribeWaterMarkWindowController.isAI = isAI
  91. window.beginSheet(subscribeWaterMarkWindowController.window!)
  92. subscribeWaterMarkWindowController.window?.center()
  93. if isContinue {
  94. subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Continue", comment: "")
  95. } else {
  96. subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
  97. }
  98. subscribeWaterMarkWindowController.closeAction = { controller in
  99. completion(false, false, true)
  100. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  101. controller.window?.close()
  102. subscribeWaterMarkController = nil
  103. subscribeWaterMarkMainWindow = nil
  104. }
  105. subscribeWaterMarkWindowController.watermarkExportAction = { controller in
  106. completion(false, true, false)
  107. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  108. controller.window?.close()
  109. subscribeWaterMarkController = nil
  110. subscribeWaterMarkMainWindow = nil
  111. }
  112. subscribeWaterMarkWindowController.subscribeAction = { controller in
  113. if let callback = subscribeDidClick {
  114. callback()
  115. }
  116. // 数据埋点
  117. controller.trackEvent(type: type)
  118. controller.waterMarkView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2))
  119. KMPurchaseManager.manager.purchaseProduct(productIdentifier: PRODUCT_1) { isSuccess, error in
  120. if isSuccess {
  121. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  122. controller.window?.close()
  123. subscribeWaterMarkController = nil
  124. // subscribeWaterMarkMainWindow = nil
  125. if subscribeWaterMarkMainWindow != nil {
  126. let controller = KMSubscribeSuccessWindowController.show(window: subscribeWaterMarkMainWindow!)
  127. controller.closeAction = { controller in
  128. controller.closeWindow()
  129. completion(true, false, false)
  130. }
  131. subscribeWaterMarkMainWindow = nil
  132. } else {
  133. completion(true, false, false)
  134. }
  135. } else {
  136. KMComparativeTableViewController.purchasefailed(view: subscribeWaterMarkController?.waterMarkView, state: error)
  137. completion(false, false, false)
  138. }
  139. controller.waterMarkView.endLoading()
  140. }
  141. }
  142. subscribeWaterMarkWindowController.restoreAction = { controller in
  143. controller.waterMarkView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2))
  144. KMPurchaseManager.manager.restorePurchases { isSuccess, error in
  145. if isSuccess {
  146. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  147. controller.window?.close()
  148. subscribeWaterMarkController = nil
  149. subscribeWaterMarkMainWindow = nil
  150. completion(true, false, false)
  151. } else {
  152. if error != .restoreSuccess {
  153. KMComparativeTableViewController.purchasefailed(view: subscribeWaterMarkController?.waterMarkView, state: error)
  154. }
  155. completion(false, false, false)
  156. }
  157. controller.waterMarkView.endLoading()
  158. }
  159. }
  160. subscribeWaterMarkController = subscribeWaterMarkWindowController
  161. subscribeWaterMarkMainWindow = window
  162. return subscribeWaterMarkWindowController
  163. } else {
  164. let controller = KMLoginWindowController.show(window: NSApp.mainWindow!,.equity)
  165. if isAI {
  166. let alert = NSAlert()
  167. alert.messageText = NSLocalizedString("Please login or register to proceed to the next step", comment: "")
  168. alert.informativeText = NSLocalizedString("As a PDF Master member, you can subscribe to use AI features as needed.", comment: "")
  169. alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
  170. alert.beginSheetModal(for: (controller?.window)!) { result in
  171. // if (result == .alertFirstButtonReturn) {
  172. //
  173. // } else if result == .alertSecondButtonReturn {
  174. // return
  175. // }
  176. }
  177. }
  178. return KMSubscribeWaterMarkWindowController.init()
  179. }
  180. }
  181. func setup() {
  182. self.window?.contentView?.backgroundColor(NSColor(hex: "#FFFFFF"))
  183. self.waterMarkView.waterExportButton.title = ""
  184. self.waterMarkView.closeAction = { [weak self] view in
  185. guard let callBack = self?.closeAction else { return }
  186. callBack((self!))
  187. }
  188. self.waterMarkView.waterMarkExportAction = { [weak self] view in
  189. self?.trackEvent(eventName: "PUW_Sub_SaveWatermark")
  190. guard let callBack = self?.watermarkExportAction else { return }
  191. callBack((self!))
  192. }
  193. self.waterMarkView.subscribeAction = { [weak self] view in
  194. self?.trackEvent(eventName: "PUW_Sub_Subscribe")
  195. guard let callBack = self?.subscribeAction else { return }
  196. callBack((self!))
  197. }
  198. self.waterMarkView.restoreAction = { [weak self] view in
  199. guard let callBack = self?.restoreAction else { return }
  200. callBack((self!))
  201. }
  202. }
  203. func closeWindow() {
  204. if subscribeWaterMarkMainWindow != nil {
  205. subscribeWaterMarkMainWindow?.endSheet((subscribeWaterMarkController?.window)!)
  206. }
  207. if subscribeWaterMarkController != nil {
  208. subscribeWaterMarkController?.window?.close()
  209. }
  210. subscribeWaterMarkController = nil
  211. subscribeWaterMarkMainWindow = nil
  212. }
  213. func reloadData() {
  214. #if VERSION_FREE
  215. self.waterViewHeightConstrain.constant = 511
  216. #endif
  217. #if VERSION_DMG
  218. self.waterViewHeightConstrain.constant = 511 - 80
  219. #endif
  220. }
  221. static func isSampleController() -> KMSubscribeWaterMarkWindowController {
  222. for window in NSApp.windows {
  223. let controller = window.windowController
  224. if controller is KMSubscribeWaterMarkWindowController {
  225. return controller as! KMSubscribeWaterMarkWindowController
  226. }
  227. }
  228. return KMSubscribeWaterMarkWindowController()
  229. }
  230. }
  231. // MARK: - Analytics (埋点)
  232. extension KMSubscribeWaterMarkWindowController {
  233. func trackEvent(eventName: String) -> Void {
  234. KMAnalytics.trackEvent(eventName: eventName, parameters: [
  235. KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.puw,
  236. KMAnalytics.Parameter.labelKey : KMAnalytics.Label.sub_PUW], platform: .AppCenter, appTarget: .all)
  237. }
  238. func trackEvent(type: KMSubscribeWaterMarkType) -> Void {
  239. KMTools.trackEvent(type: type)
  240. }
  241. }