AccountProfileController.swift 11 KB

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