KMLoginWindowsController.swift 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. //
  2. // KMLoginWindowsController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by wanjun on 2024/10/22.
  6. //
  7. import Cocoa
  8. import Combine
  9. typealias LoginResultComplete = (_ success: Bool) -> Void
  10. @objcMembers
  11. class KMLoginWindowsController: NSWindowController {
  12. @IBOutlet weak var leftBox: NSBox!
  13. @IBOutlet weak var leftImageView: NSImageView!
  14. @IBOutlet weak var leftsubImageView: NSImageView!
  15. @IBOutlet weak var leftsubLabel: NSTextField!
  16. @IBOutlet weak var rightBox: NSBox!
  17. var memberInfo: KMMemberInfo = KMMemberInfo.shared
  18. var signUpView: KMSignUpView?
  19. var loginResult: LoginResultComplete!
  20. private var viewModel = KMSignUpViewModel()
  21. private var cancellables = Set<AnyCancellable>()
  22. static let shared: KMLoginWindowsController = {
  23. let windowC = KMLoginWindowsController(windowNibName: "KMLoginWindowsController")
  24. return windowC
  25. }()
  26. override func windowDidLoad() {
  27. super.windowDidLoad()
  28. // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
  29. // window?.styleMask.insert([.titled, .closable, .miniaturizable, .fullSizeContentView])
  30. // window?.titleVisibility = .visible
  31. leftsubLabel.stringValue = NSLocalizedString("Welcome to PDF Reader Pro", tableName: "MemberCenterLocalizable", comment: "")
  32. initializeUI()
  33. NotificationCenter.default.addObserver(self, selector: #selector(loginSuccessNotification), name: NSNotification.Name(rawValue: "MemberCenterLoginSuccess"), object: nil)
  34. NotificationCenter.default.addObserver(self, selector: #selector(logoutSuccessNotification), name: NSNotification.Name(rawValue: "MemberCenterLogoutSuccess"), object: nil)
  35. rightBox.addObserver(self, forKeyPath: "contentView", options: [.new, .old], context: nil)
  36. }
  37. override func showWindow(_ sender: Any?) {
  38. super.showWindow(sender)
  39. initializeUI()
  40. }
  41. deinit {
  42. rightBox.removeObserver(self, forKeyPath: "contentView")
  43. }
  44. // MARK: Private Action
  45. private func initializeUI() -> Void {
  46. if memberInfo.isLogin {
  47. window?.close()
  48. } else {
  49. guard let parentView = self.window?.contentView else { return }
  50. signUpView = KMSignUpView(model: viewModel, superView: parentView)
  51. if(signUpView != nil) {
  52. signUpView?.frame = rightBox.frame
  53. rightBox.contentView = signUpView!
  54. }
  55. let signUpView = KMSignUpView()
  56. signUpView.frame = rightBox.frame
  57. rightBox.contentView = signUpView
  58. rightBox.fillColor = NSColor(named: "membercentercolor") ?? NSColor.white
  59. }
  60. }
  61. @IBAction func leftButtonAction(_ sender: NSButton) {
  62. //远程控制
  63. if let loginContent = KMAdvertisementManager.manager.info.loginViewContent {
  64. if loginContent.content?.isEmpty == false {
  65. let content = loginContent.content?.first
  66. let string = KMAdvertisementModelTransition.transitionLanguage(langeuage: content?.linkURL)
  67. if string.count != 0 {
  68. NSWorkspace.shared.open(URL.init(string: string)!)
  69. }
  70. }
  71. }
  72. }
  73. // 刷新左侧视图
  74. private func refreshSplitView() -> Void {
  75. leftImageView.image = NSImage(named: "WelcomePDFReaderPro1")
  76. self.leftsubLabel.isHidden = false
  77. self.leftsubImageView.isHidden = false
  78. if viewModel.screenType == .signUp {
  79. leftsubImageView.image = NSImage(named: "WelcomeSubPDFReaderPro")
  80. //远程控制
  81. if let loginContent = KMAdvertisementManager.manager.info.loginViewContent {
  82. if loginContent.content?.isEmpty == false {
  83. let content = loginContent.content?.first
  84. let url = URL(string: KMAdvertisementModelTransition.transitionImagePath(image: content?.image, highlight: false))
  85. let _ = KMAdvertisementImage.imageWithURL(url: url) { [weak self] image in
  86. guard let self = self else { return }
  87. if image.isValid {
  88. self.leftImageView.image = image
  89. self.leftsubLabel.isHidden = true
  90. self.leftsubImageView.isHidden = true
  91. }
  92. }
  93. }
  94. }
  95. } else {
  96. leftsubImageView.image = NSImage(named: "WelcomeSub2PDFReaderPro")
  97. }
  98. }
  99. // MARK: public Action
  100. @objc func loginSuccessNotification() -> Void {
  101. if let result = loginResult {
  102. result(true)
  103. }
  104. window?.close()
  105. }
  106. @objc func logoutSuccessNotification() -> Void {
  107. signUpView?.resetTextFileData()
  108. }
  109. func openWindow(_ complete: @escaping LoginResultComplete) -> Void {
  110. KMLoginWindowsController.shared.showWindow(nil)
  111. loginResult = complete
  112. }
  113. // MARK: Bind Method
  114. func bindViewModel() -> Void {
  115. viewModel.$screenType
  116. .receive(on: RunLoop.main)
  117. .sink { [weak self] newValue in
  118. self?.refreshSplitView()
  119. }
  120. .store(in: &cancellables)
  121. }
  122. override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
  123. if keyPath == "contentView" {
  124. if let newContentView = change?[.newKey] as? NSView {
  125. if newContentView is KMSignUpView {
  126. viewModel.screenType = .signUp
  127. } else if newContentView is KMForgotPasswordView {
  128. viewModel.screenType = .forgotPassword
  129. } else if newContentView is KMEnterVerificationCodeView {
  130. viewModel.screenType = .enterVerificationCode
  131. } else if newContentView is KMEnterNewPasswordView {
  132. viewModel.screenType = .enterNewPassword
  133. }
  134. refreshSplitView()
  135. }
  136. }
  137. }
  138. }