// // KMComparativeTableViewController.swift // PDF Reader Pro // // Created by lizhe on 2023/2/24. // import Cocoa typealias KMComparativeTableViewControllerLoginAction = (_ controller: KMComparativeTableViewController) -> Void typealias KMComparativeTableViewControllerSignUpAction = (_ controller: KMComparativeTableViewController) -> Void typealias KMComparativeTableViewControllerSubscriptionAction = (_ controller: KMComparativeTableViewController) -> Void typealias KMComparativeTableViewControllerRestoreAction = (_ controller: KMComparativeTableViewController) -> Void var comparativeController: KMComparativeTableViewController? var comparativeMainWindow: NSWindow? @objc enum KMComparativeInputType: Int { case unknown = 0 case login = 1 //登录界面 case register = 2 //注册界面 case resetPassword = 3 //重置密码 case verificationCode = 4 //验证码 case registerSuccess = 5 //注册成功 case loginInputPassword = 6 //登录密码输入 case accountInfo = 7 //用户信息 case loginSuccess = 8 //用户登录成功 case loginCancel = 9 //用户登录成功 case compress = 10 // 压缩 case convert = 11 // 转档 case secure = 12 // 安全 case pageEdit = 13 // 页面编辑 case merge = 14 // 合并 case crop = 15 // 裁切 case thumb = 16 // 缩略图列表 case shareFlatten = 17 // 分享副本 //后续添加 case upgrade = 18 //升级按钮 case equity = 19 //权益弹窗 } @objcMembers class KMComparativeTableViewController: NSWindowController { @IBOutlet weak var comparativeTableView: KMComparativeTableView! @IBOutlet weak var comparativeView: KMComparativeView! var inputType: KMComparativeInputType? var loginAction: KMComparativeTableViewControllerLoginAction? var signUpAction: KMComparativeTableViewControllerSignUpAction? var subscriptionAction: KMComparativeTableViewControllerSubscriptionAction? var restoreAction: KMComparativeTableViewControllerRestoreAction? deinit { KMPrint("KMComparativeTableViewController 释放") } //MARK: 打开文件 /** @abstract 弹出比较表 @param window 弹出window @param type 从什么页面跳转到比较表 默认batch */ static func show(window: NSWindow, _ type: KMComparativeInputType = .unknown, inputType: KMSubscribeWaterMarkType = .none) -> KMComparativeTableViewController? { #if VERSION_DMG if KMLightMemberManager.manager.isLogin() || type == .upgrade { KMPurchaseManager.manager.showStore() } else { KMLoginWindowController.show(window: window) } #endif #if VERSION_FREE let controller: KMComparativeTableViewController = KMComparativeTableViewController.init(windowNibName: "KMComparativeTableViewController") controller.inputType = type controller.loginAction = { controller in comparativeController = nil comparativeMainWindow?.endSheet(controller.window!) comparativeMainWindow = nil controller.close() if NSApp.mainWindow != nil { KMLoginWindowController.show(window: NSApp.mainWindow!, .ComparativeTable, .login) } } controller.signUpAction = { controller in comparativeController = nil comparativeMainWindow?.endSheet(controller.window!) comparativeMainWindow = nil controller.close() if NSApp.mainWindow != nil { KMLoginWindowController.show(window: NSApp.mainWindow!, .ComparativeTable, .register) } } controller.subscriptionAction = { controller in controller.subscribeAction(controller: controller) } controller.restoreAction = { controller in controller.subscribeAction(controller: controller, isRestore:true) } if controller.window != nil { window.beginSheet(controller.window!) } comparativeController = controller comparativeMainWindow = window if type == .loginSuccess && KMLightMemberManager.manager.purchaseState != .subscription { controller.subscribeAction(controller: controller) } return controller #endif return nil } override func windowDidLoad() { super.windowDidLoad() // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. self.setup() KMPrint("订阅状态: \(KMInAppPurchaseManager.manager.state)") } func setup() { self.window?.contentView?.backgroundColor(NSColor.km_init(hex: "FFFFFF")) self.comparativeView.closeAction = { view in KMPrint("关闭") comparativeMainWindow?.endSheet(view.window!) view.window?.close() comparativeController = nil comparativeMainWindow = nil } self.comparativeView.signUpAction = { [weak self] view in KMPrint("注册") guard let callBack = self?.signUpAction else { return } callBack(self!) } // self.comparativeTableView.loginAction = { [weak self] view in // print("登录") // guard let callBack = self?.loginAction else { return } // // callBack(self!) // } // self.comparativeView.subscriptionAction = { [weak self] view in KMPrint("订阅") guard let callBack = self?.subscriptionAction else { return } callBack(self!) } self.comparativeView.restoreAction = { [weak self] view in KMPrint("restore订阅") guard let callBack = self?.restoreAction else { return } callBack(self!) } } static func isSampleController() -> KMComparativeTableViewController { for window in NSApp.windows { let controller = window.windowController if controller is KMComparativeTableViewController { return controller as! KMComparativeTableViewController } } return KMComparativeTableViewController() } func subscribeAction(controller: KMComparativeTableViewController, isRestore: Bool = false) { //loading controller.comparativeView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2)) if isRestore { KMPurchaseManager.manager.restorePurchases { isSuccess, error in if isSuccess { comparativeController = nil comparativeMainWindow?.endSheet(controller.window!) comparativeMainWindow = nil controller.close() } else { if error != .restoreSuccess { KMComparativeTableViewController.purchasefailed(view: comparativeController?.comparativeView, state: error) } } controller.comparativeView.endLoading() } } else { KMPurchaseManager.manager.purchaseProduct(productIdentifier: PRODUCT_1) { isSuccess, error in if isSuccess { KMPrint("订阅成功") comparativeController = nil comparativeMainWindow?.endSheet(controller.window!) controller.close() if comparativeMainWindow != nil { _ = KMSubscribeSuccessWindowController.show(window: comparativeMainWindow!) comparativeMainWindow = nil } } else { KMComparativeTableViewController.purchasefailed(view: comparativeController?.comparativeView, state: error) } //loading controller.comparativeView.endLoading() } } } static func purchasefailed(view: NSView?, state: KMInAppPurchaseState) { DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1, execute: { if let showView = view { KMPurchaseAlertView.show(view: showView, string: state.rawValue) } }) } static func purchaseSuccess() { DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1, execute: { let alert = NSAlert() alert.messageText = NSLocalizedString("restore success", comment: "") alert.informativeText = NSLocalizedString("", comment: "") // alert.addButton(withTitle: NSLocalizedString("OK", comment: "")) alert.addButton(withTitle: NSLocalizedString("OK", comment: "")) var window = NSApp.mainWindow if NSApp.mainWindow?.sheets.first != nil { window = NSApp.mainWindow?.sheets.first } if window != nil { alert.beginSheetModal(for: window!) { result in if (result == .alertFirstButtonReturn) { } else if result == .alertSecondButtonReturn { return } } } }) } static func loginAlertView() { DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1, execute: { let alert = NSAlert() alert.messageText = NSLocalizedString("Please login or register to proceed to the next step", comment: "") alert.informativeText = NSLocalizedString("As a PDF Reader Pro member, you can get unlimited conversion, merge function, AI free use times and other advanced rights.", comment: "") // alert.addButton(withTitle: NSLocalizedString("OK", comment: "")) alert.addButton(withTitle: NSLocalizedString("OK", comment: "")) var window = NSApp.mainWindow if NSApp.mainWindow?.sheets.first != nil { window = NSApp.mainWindow?.sheets.first } if window != nil { alert.beginSheetModal(for: window!) { result in if (result == .alertFirstButtonReturn) { comparativeMainWindow?.endSheet(comparativeController!.window!) comparativeMainWindow = nil comparativeController!.close() comparativeController = nil if NSApp.mainWindow != nil { var email: String = UserDefaults.standard.value(forKey: "kLoginEmail") as? String ?? "" if email.count == 0 { let tempController = KMLoginWindowController.show(window: NSApp.mainWindow!, .ComparativeTable, .register) } else { let tempController = KMLoginWindowController.show(window: NSApp.mainWindow!, .ComparativeTable) } } } else if result == .alertSecondButtonReturn { return } } } }) } }