AccountCenterWindowController.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. //
  2. // AccountCenterWindowController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by User-Tangchao on 2024/10/22.
  6. //
  7. import Cocoa
  8. let kAccountTokenKey = "AccountToken"
  9. let kAccountEmailKey = "AccountEmail"
  10. let kTermsOfUseUrlString = "https://www.anyrecover.com/company/terms-conditions/"
  11. let kPrivacyPolicyUrlString = "https://www.anyrecover.com/company/privacy-policy/"
  12. let kResetpasswordUrlString = "https://account.anyrecover.com/reset-password/"
  13. let kCancelSubscriptionUrlString = "https://www.anyrecover.com/support/cancel-subscription/"
  14. let kPwdInputStrings = "!\"#$%&'()*+,-./:;<>=?@[\\]^_`{|}~0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
  15. extension NSNotification.Name {
  16. static let loginStatusChanged = NSNotification.Name("KMLoginStatusChangedNotification")
  17. }
  18. class AccountCenterWindowController: NSWindowController {
  19. @IBOutlet weak var contentBox: NSBox!
  20. private lazy var rightDatas_: [String] = {
  21. return [
  22. NSLocalizedString("Handle PDF Documents with AI", comment: ""),
  23. NSLocalizedString("Unlimited file conversion", comment: ""),
  24. NSLocalizedString("PDF text and image editing", comment: ""),
  25. NSLocalizedString("Batch PDF processing", comment: ""),
  26. NSLocalizedString("Advanced PDF management", comment: ""),
  27. NSLocalizedString("PDF annotations", comment: ""),
  28. NSLocalizedString("Create&fill forms", comment: ""),
  29. NSLocalizedString("PDF Protect", comment: ""),
  30. NSLocalizedString("Advanced OCR technology", comment: "")]
  31. }()
  32. private var inputC_: AccountInputController?
  33. private var centerC: AccountCenterController?
  34. private var pwdChangedwinC_: AccountPwdChangedWindowController?
  35. private lazy var closeButton_: NSButton = {
  36. let view = NSButton()
  37. view.isBordered = false
  38. view.title = ""
  39. return view
  40. }()
  41. convenience init() {
  42. self.init(windowNibName: "AccountCenterWindowController")
  43. }
  44. override func windowDidLoad() {
  45. super.windowDidLoad()
  46. self.window?.appearance = NSAppearance(named: .aqua)
  47. self.contentBox.borderWidth = 0
  48. self.window?.contentView?.addSubview(self.closeButton_)
  49. self.closeButton_.km_add_right_constraint(constant: -10)
  50. self.closeButton_.km_add_top_constraint(constant: 10)
  51. self.closeButton_.km_add_size_constraint(size: .init(width: 24, height: 24))
  52. self.closeButton_.target = self
  53. self.closeButton_.action = #selector(_closeAction)
  54. self.closeButton_.image = NSImage(named: "KMImageNameAccountClose")
  55. if let token = KMDataManager.ud_string(forKey: kAccountTokenKey), token.isEmpty == false {
  56. let header = ["Token" : token]
  57. KMHTTP.OEM_POST(urlString: kURLAPI_oemGetPermissions, parameter: nil, headers: header) { success, dataModel, err in
  58. if success == false {
  59. AccountManager.manager.isLogin = false
  60. if dataModel?.code == KMHttpReponseCode.passwordChanged.rawValue {
  61. KMDataManager.ud_set("", forKey: kAccountTokenKey)
  62. self._showHud(msg: NSLocalizedString("Your password has been changed. Please login again.", comment: ""))
  63. } else if dataModel?.code == KMHttpReponseCode.accountAtOtherDeviceLogin.rawValue {
  64. self.pwdChangedAction()
  65. }
  66. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  67. self.gotoLogin()
  68. return
  69. }
  70. let model = AccountRightModel(dict: dataModel?.data as? [String : Any] ?? [:])
  71. AccountManager.manager.saveRights(model: model)
  72. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  73. self.gotoCenter(model: model, infoModel: nil)
  74. if let data = model.memberInfo?.email, data.isEmpty == false {
  75. self.activateDevice(email: data)
  76. }
  77. }
  78. } else {
  79. self.gotoLogin()
  80. }
  81. }
  82. func gotoLogin() {
  83. self.closeButton_.isHidden = false
  84. self.inputC_ = AccountInputController()
  85. self.inputC_?.rightDatas = self.rightDatas_
  86. self.contentBox.contentView = self.inputC_?.view
  87. self.inputC_?.gotoLogin()
  88. self.inputC_?.itemClick = { idx, params in
  89. guard let model = params.first as? AccountInfoModel else {
  90. return
  91. }
  92. if let data = model.token, data.isEmpty == false {
  93. KMDataManager.ud_set(data, forKey: kAccountTokenKey)
  94. }
  95. if let data = model.email, data.isEmpty == false {
  96. KMDataManager.ud_set(data, forKey: kAccountEmailKey)
  97. }
  98. let state = self._isConnectionAvailable()
  99. if !state {
  100. self._showHud(msg: NSLocalizedString("Unable to connect to server, please check your connection.", comment: ""))
  101. return
  102. }
  103. VerificationManager.default().activateDevice(withInfo: ["email" : model.email]) { status, infoDict, err in
  104. VerificationManager.default().verification {status1 , infoDict1, err1 in
  105. }
  106. let header = ["Token" : model.token ?? ""]
  107. KMHTTP.OEM_POST(urlString: kURLAPI_oemGetPermissions, parameter: nil, headers: header) { success, dataModel, err in
  108. if success == false {
  109. AccountManager.manager.isLogin = false
  110. if dataModel?.code == KMHttpReponseCode.passwordChanged.rawValue {
  111. KMDataManager.ud_set("", forKey: kAccountTokenKey)
  112. self._showHud(msg: NSLocalizedString("Your password has been changed. Please login again.", comment: ""))
  113. }
  114. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  115. return
  116. }
  117. let rmodel = AccountRightModel(dict: dataModel?.data as? [String : Any] ?? [:])
  118. AccountManager.manager.saveRights(model: rmodel)
  119. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  120. self.gotoCenter(model: rmodel, infoModel: model)
  121. }
  122. }
  123. }
  124. }
  125. func gotoSignin() {
  126. self.closeButton_.isHidden = false
  127. self.inputC_ = AccountInputController()
  128. self.contentBox.contentView = self.inputC_?.view
  129. self.inputC_?.goToSignIn()
  130. self.inputC_?.rightDatas = self.rightDatas_
  131. self.inputC_?.itemClick = { idx, params in
  132. guard let model = params.first as? AccountInfoModel else {
  133. return
  134. }
  135. if let data = model.token, data.isEmpty == false {
  136. KMDataManager.ud_set(data, forKey: kAccountTokenKey)
  137. }
  138. if let data = model.email, data.isEmpty == false {
  139. KMDataManager.ud_set(data, forKey: kAccountEmailKey)
  140. }
  141. let state = self._isConnectionAvailable()
  142. if !state {
  143. self._showHud(msg: NSLocalizedString("Unable to connect to server, please check your connection.", comment: ""))
  144. return
  145. }
  146. VerificationManager.default().activateDevice(withInfo: ["email" : model.email]) { status, infoDict, err in
  147. VerificationManager.default().verification {status1 , infoDict1, err1 in
  148. }
  149. let header = ["Token" : model.token ?? ""]
  150. KMHTTP.OEM_POST(urlString: kURLAPI_oemGetPermissions, parameter: nil, headers: header) { success, dataModel, err in
  151. if success == false {
  152. AccountManager.manager.isLogin = false
  153. if dataModel?.code == KMHttpReponseCode.passwordChanged.rawValue {
  154. KMDataManager.ud_set("", forKey: kAccountTokenKey)
  155. self._showHud(msg: NSLocalizedString("Your password has been changed. Please login again.", comment: ""))
  156. }
  157. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  158. return
  159. }
  160. let rmodel = AccountRightModel(dict: dataModel?.data as? [String : Any] ?? [:])
  161. AccountManager.manager.saveRights(model: rmodel)
  162. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  163. self.gotoCenter(model: rmodel, infoModel: model)
  164. }
  165. }
  166. }
  167. }
  168. func gotoCenter(model: AccountRightModel?, infoModel: AccountInfoModel?) {
  169. self.closeButton_.isHidden = true
  170. self.centerC = AccountCenterController()
  171. self.centerC?.rightDatas = self.rightDatas_
  172. self.centerC?.model = model
  173. self.centerC?.infoModel = infoModel
  174. self.centerC?.goLoginBlock = { [weak self] _ in
  175. self?.gotoLogin()
  176. }
  177. self.contentBox.contentView = self.centerC?.view
  178. }
  179. func activateDevice(email: String) {
  180. // if IAPProductsManager.default().isAvailableAllFunction() {
  181. // return
  182. // }
  183. VerificationManager.default().activateDevice(withInfo: ["email" : email]) { status, info, err in
  184. VerificationManager.default().verification { status, info, err in
  185. }
  186. }
  187. }
  188. func pwdChangedAction() {
  189. if let _ = self.pwdChangedwinC_ {
  190. NSSound.beep()
  191. return
  192. }
  193. KMDataManager.ud_set("", forKey: kAccountTokenKey)
  194. AccountManager.manager.saveRights(model: nil)
  195. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  196. let winC = AccountPwdChangedWindowController()
  197. self.pwdChangedwinC_ = winC
  198. self.window?.addChildWindow(winC.window!, ordered: .above)
  199. let winFrame = self.window?.sheetParent?.frame ?? .zero
  200. var frame = self.pwdChangedwinC_?.window?.frame ?? .zero
  201. frame.origin.x = winFrame.origin.x + (winFrame.size.width-frame.size.width)*0.5
  202. frame.origin.y = winFrame.origin.y + (winFrame.size.height-frame.size.height)*0.5
  203. self.pwdChangedwinC_?.window?.setFrame(frame, display: true)
  204. winC.itemClick = { [weak self] idx, _ in
  205. for win in self?.window?.childWindows ?? [] {
  206. if win.isEqual(to: self?.pwdChangedwinC_?.window) {
  207. self?.window?.removeChildWindow(win)
  208. break
  209. }
  210. }
  211. self?.pwdChangedwinC_?.window?.orderOut(nil)
  212. self?.pwdChangedwinC_ = nil
  213. self?.window?.windowController?.km_quick_endSheet()
  214. }
  215. }
  216. // MARK: - Private Methods
  217. @objc private func _closeAction() {
  218. self.km_quick_endSheet()
  219. }
  220. private func _isConnectionAvailable() -> Bool {
  221. if Reachability.forInternetConnection().currentReachabilityStatus().rawValue == 0 {
  222. return false
  223. }
  224. return true
  225. }
  226. private func _showHud(msg: String) {
  227. DispatchQueue.main.async {
  228. if let data = self.window?.contentView {
  229. _ = CustomAlertView.alertView(message: msg, fromView: data, withStyle: .black)
  230. }
  231. }
  232. }
  233. }