AccountProfileController.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. //
  2. // AccountProfileController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by User-Tangchao on 2024/10/29.
  6. //
  7. import Cocoa
  8. class AccountProfileController: NSViewController {
  9. @IBOutlet weak var headerBox: NSBox!
  10. @IBOutlet weak var mainBox: NSBox!
  11. @IBOutlet weak var iv: NSImageView!
  12. @IBOutlet weak var nameLabel: NSTextField!
  13. @IBOutlet weak var refreshButton: NSButton!
  14. @IBOutlet weak var tipLabel: NSTextField!
  15. @IBOutlet weak var logoutButton: NSButton!
  16. @IBOutlet weak var hLineView: NSView!
  17. @IBOutlet weak var bottomLineView: NSView!
  18. var rightDatas: [String] = []
  19. var userInfoModel: AccountInfoModel?
  20. var model: AccountRightModel?
  21. var itemClick: KMCommonClickBlock?
  22. var goLoginBlock: KMCommonBlock?
  23. private var benefitsC_: AccountBenefitsController?
  24. private var rightC_: AccountRightController?
  25. private var winC: AccountLogoutWindowController?
  26. private var unSubwinC_: AccountUnsubscribeWindowController?
  27. private var pwdChangedwinC_: AccountPwdChangedWindowController?
  28. private var loadingView_: AccountLoadingView = {
  29. let view = AccountLoadingView()
  30. return view
  31. }()
  32. convenience init() {
  33. self.init(nibName: "AccountProfileController", bundle: MainBundle)
  34. }
  35. override func viewDidLoad() {
  36. super.viewDidLoad()
  37. // Do view setup here.
  38. self.headerBox.borderWidth = 0
  39. self.mainBox.borderWidth = 0
  40. self.iv.image = NSImage(named: "KMImageNameAccountIcon")
  41. self.iv.imageScaling = .scaleAxesIndependently
  42. self.nameLabel.font = .systemFont(ofSize: 18)
  43. self.nameLabel.textColor = KMAppearance.titleColor()
  44. self.refreshButton.image = NSImage(named: "KMImageNameAccountRefresh")
  45. self.refreshButton.target = self
  46. self.refreshButton.action = #selector(refreshAction)
  47. self.tipLabel.textColor = KMAppearance.themeColor()
  48. self.logoutButton.image = NSImage(named: "KMImageNameAccountLogout")
  49. self.hLineView.wantsLayer = true
  50. self.hLineView.layer?.backgroundColor = NSColor(hex: "#E5E5E5").cgColor
  51. self.bottomLineView.wantsLayer = true
  52. self.bottomLineView.layer?.backgroundColor = NSColor(hex: "#F4F4F4").cgColor
  53. self.logoutButton.target = self
  54. self.logoutButton.action = #selector(logoutAction)
  55. if let name = userInfoModel?.email, name.isEmpty == false {
  56. self.nameLabel.stringValue = String(format: NSLocalizedString("Hi,%@", comment: ""), name)
  57. } else {
  58. if let data = KMDataManager.ud_string(forKey: kAccountEmailKey) {
  59. self.nameLabel.stringValue = String(format: NSLocalizedString("Hi,%@", comment: ""), data)
  60. }
  61. }
  62. let status = self.model?.trialData?.status ?? 0
  63. if status == 1 {
  64. self.tipLabel.isHidden = false
  65. self.tipLabel.stringValue = String(format: NSLocalizedString("You have tried it for %d days.", comment: ""), self.model?.trialData?.triedDay ?? 0)
  66. } else {
  67. self.tipLabel.isHidden = false
  68. self.tipLabel.stringValue = NSLocalizedString("Your trial has ended.", comment: "")
  69. }
  70. let isVip = model?.isVip ?? 0
  71. self.tipLabel.isHidden = isVip == 1
  72. let datas = (model?.rightsInterestsData ?? []) + (model?.expiredBenefits ?? [])
  73. if datas.isEmpty == false {
  74. self.showRight()
  75. } else {
  76. self.showBenefit()
  77. }
  78. }
  79. func showBenefit() {
  80. let vc = AccountBenefitsController()
  81. vc.rightDatas = self.rightDatas
  82. vc.datas = self.model?.moreBenefits ?? []
  83. self.benefitsC_ = vc
  84. self.mainBox.contentView = vc.view
  85. }
  86. func showRight() {
  87. let vc = AccountRightController()
  88. self.rightC_ = vc
  89. vc.rightDatas = self.model?.rightsInterestsData ?? []
  90. vc.expiredDatas = self.model?.expiredBenefits ?? []
  91. self.mainBox.contentView = vc.view
  92. vc.itemClick = { [weak self] idx, _ in
  93. if idx == 1 { // 更多权益
  94. self?.itemClick?(idx)
  95. } else if idx == 2 { // 取消订阅
  96. self?.unSubcribeAction()
  97. }
  98. }
  99. }
  100. @objc func refreshAction() {
  101. if let token = KMDataManager.ud_string(forKey: kAccountTokenKey), token.isEmpty == false {
  102. let header = ["Token" : token]
  103. self.showLoading()
  104. KMHTTP.OEM_POST(urlString: kURLAPI_oemGetPermissions, parameter: nil, headers: header) { success, dataModel, err in
  105. self.hideLoading()
  106. if success == false {
  107. if dataModel?.code == KMHttpReponseCode.passwordChanged.rawValue {
  108. self._showHud(msg: NSLocalizedString("Your password has been changed. Please login again.", comment: ""))
  109. KMDataManager.ud_set("", forKey: kAccountTokenKey)
  110. AccountManager.manager.saveRights(model: nil)
  111. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  112. self.goLoginBlock?()
  113. } else if dataModel?.code == KMHttpReponseCode.accountAtOtherDeviceLogin.rawValue {
  114. self.pwdChangedAction()
  115. KMDataManager.ud_set("", forKey: kAccountTokenKey)
  116. AccountManager.manager.saveRights(model: nil)
  117. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  118. self.goLoginBlock?()
  119. }
  120. return
  121. }
  122. let model = AccountRightModel(dict: dataModel?.data as? [String : Any] ?? [:])
  123. self.model = model
  124. let isVip = model.isVip
  125. AccountManager.manager.saveRights(model: model)
  126. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  127. let datas = model.rightsInterestsData + model.expiredBenefits
  128. if datas.isEmpty == false {
  129. self.showRight()
  130. } else {
  131. self.showBenefit()
  132. }
  133. if let data = model.memberInfo?.email, data.isEmpty == false {
  134. AccountTools.activateDevice(email: data, callback: nil)
  135. }
  136. }
  137. }
  138. }
  139. @objc func logoutAction() {
  140. if let _ = self.winC {
  141. NSSound.beep()
  142. return
  143. }
  144. let winC = AccountLogoutWindowController()
  145. self.winC = winC
  146. self.view.window?.addChildWindow(winC.window!, ordered: .above)
  147. let winFrame = self.view.window?.sheetParent?.frame ?? .zero
  148. var frame = self.winC?.window?.frame ?? .zero
  149. frame.origin.x = winFrame.origin.x + (winFrame.size.width-frame.size.width)*0.5
  150. frame.origin.y = winFrame.origin.y + (winFrame.size.height-frame.size.height)*0.5
  151. self.winC?.window?.setFrame(frame, display: true)
  152. winC.itemClick = { [weak self] idx, _ in
  153. for win in self?.view.window?.childWindows ?? [] {
  154. if win.isEqual(to: self?.winC?.window) {
  155. self?.view.window?.removeChildWindow(win)
  156. break
  157. }
  158. }
  159. self?.winC?.window?.orderOut(nil)
  160. self?.winC = nil
  161. if idx == 2 {
  162. if let token = KMDataManager.ud_string(forKey: kAccountTokenKey), token.isEmpty == false {
  163. let header = ["Token" : token]
  164. KMHTTP.OEM_POST(urlString: kURLAPI_oemLogout, parameter: nil, headers: header) { success, dataDict, err in
  165. if success == false {
  166. return
  167. }
  168. // 登出
  169. VerificationManager.default().unactivateDeviceWithcomplention { status, infoDict, err in
  170. VerificationManager.default().verification {status1 , infoDict1, err1 in
  171. }
  172. self?.view.window?.windowController?.km_quick_endSheet()
  173. KMDataManager.ud_set("", forKey: kAccountTokenKey)
  174. AccountManager.manager.saveRights(model: nil)
  175. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  176. }
  177. }
  178. } else {
  179. // self.gotoSignin()
  180. }
  181. return
  182. }
  183. }
  184. }
  185. func unSubcribeAction() {
  186. if let _ = self.unSubwinC_ {
  187. NSSound.beep()
  188. return
  189. }
  190. let winC = AccountUnsubscribeWindowController()
  191. self.unSubwinC_ = winC
  192. self.view.window?.addChildWindow(winC.window!, ordered: .above)
  193. let winFrame = self.view.window?.sheetParent?.frame ?? .zero
  194. var frame = self.unSubwinC_?.window?.frame ?? .zero
  195. frame.origin.x = winFrame.origin.x + (winFrame.size.width-frame.size.width)*0.5
  196. frame.origin.y = winFrame.origin.y + (winFrame.size.height-frame.size.height)*0.5
  197. self.unSubwinC_?.window?.setFrame(frame, display: true)
  198. winC.itemClick = { [weak self] idx, _ in
  199. for win in self?.view.window?.childWindows ?? [] {
  200. if win.isEqual(to: self?.unSubwinC_?.window) {
  201. self?.view.window?.removeChildWindow(win)
  202. break
  203. }
  204. }
  205. self?.unSubwinC_?.window?.orderOut(nil)
  206. self?.unSubwinC_ = nil
  207. if idx == 1 {
  208. KMTools.openURL(urlString: kCancelSubscriptionUrlString)
  209. return
  210. }
  211. }
  212. }
  213. func pwdChangedAction() {
  214. if let _ = self.pwdChangedwinC_ {
  215. NSSound.beep()
  216. return
  217. }
  218. KMDataManager.ud_set("", forKey: kAccountTokenKey)
  219. AccountManager.manager.saveRights(model: nil)
  220. NotificationCenter.default.post(name: .loginStatusChanged, object: nil)
  221. let winC = AccountPwdChangedWindowController()
  222. self.pwdChangedwinC_ = winC
  223. self.view.window?.addChildWindow(winC.window!, ordered: .above)
  224. let winFrame = self.view.window?.sheetParent?.frame ?? .zero
  225. var frame = self.pwdChangedwinC_?.window?.frame ?? .zero
  226. frame.origin.x = winFrame.origin.x + (winFrame.size.width-frame.size.width)*0.5
  227. frame.origin.y = winFrame.origin.y + (winFrame.size.height-frame.size.height)*0.5
  228. self.pwdChangedwinC_?.window?.setFrame(frame, display: true)
  229. winC.itemClick = { [weak self] idx, _ in
  230. for win in self?.view.window?.childWindows ?? [] {
  231. if win.isEqual(to: self?.pwdChangedwinC_?.window) {
  232. self?.view.window?.removeChildWindow(win)
  233. break
  234. }
  235. }
  236. self?.pwdChangedwinC_?.window?.orderOut(nil)
  237. self?.pwdChangedwinC_ = nil
  238. self?.view.window?.windowController?.km_quick_endSheet()
  239. }
  240. }
  241. func showLoading() {
  242. if let _ = self.loadingView_.superview {
  243. self.hideLoading()
  244. }
  245. let view = self.loadingView_
  246. self.view.addSubview(view)
  247. let viewFrame = self.view.frame
  248. var frame = view.frame
  249. frame.origin.x = (viewFrame.size.width-frame.size.width)*0.5
  250. frame.origin.y = (viewFrame.size.height-frame.size.height)*0.5
  251. view.frame = frame
  252. view.startAnimation()
  253. }
  254. func hideLoading() {
  255. self.loadingView_.stopAnimation()
  256. self.loadingView_.removeFromSuperview()
  257. }
  258. private func _showHud(msg: String) {
  259. DispatchQueue.main.async {
  260. _ = CustomAlertView.alertView(message: msg, fromView: self.view, withStyle: .black)
  261. }
  262. }
  263. }