// // KMLoginWindowsController.swift // PDF Reader Pro // // Created by wanjun on 2024/10/22. // import Cocoa import Combine typealias LoginResultComplete = (_ success: Bool) -> Void @objcMembers class KMLoginWindowsController: NSWindowController { @IBOutlet weak var leftBox: NSBox! @IBOutlet weak var leftImageView: NSImageView! @IBOutlet weak var leftsubImageView: NSImageView! @IBOutlet weak var leftsubLabel: NSTextField! @IBOutlet weak var rightBox: NSBox! var memberInfo: KMMemberInfo = KMMemberInfo.shared var signUpView: KMSignUpView? var loginResult: LoginResultComplete! private var viewModel = KMSignUpViewModel() private var cancellables = Set() static let shared: KMLoginWindowsController = { let windowC = KMLoginWindowsController(windowNibName: "KMLoginWindowsController") return windowC }() 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. // window?.styleMask.insert([.titled, .closable, .miniaturizable, .fullSizeContentView]) // window?.titleVisibility = .visible leftsubLabel.stringValue = NSLocalizedString("Welcome to PDF Reader Pro", tableName: "MemberCenterLocalizable", comment: "") initializeUI() NotificationCenter.default.addObserver(self, selector: #selector(loginSuccessNotification), name: NSNotification.Name(rawValue: "MemberCenterLoginSuccess"), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(logoutSuccessNotification), name: NSNotification.Name(rawValue: "MemberCenterLogoutSuccess"), object: nil) rightBox.addObserver(self, forKeyPath: "contentView", options: [.new, .old], context: nil) } override func showWindow(_ sender: Any?) { super.showWindow(sender) initializeUI() } deinit { rightBox.removeObserver(self, forKeyPath: "contentView") } // MARK: Private Action private func initializeUI() -> Void { if memberInfo.isLogin { window?.close() } else { guard let parentView = self.window?.contentView else { return } signUpView = KMSignUpView(model: viewModel, superView: parentView) if(signUpView != nil) { signUpView?.frame = rightBox.frame rightBox.contentView = signUpView! } let signUpView = KMSignUpView() signUpView.frame = rightBox.frame rightBox.contentView = signUpView rightBox.fillColor = NSColor(named: "membercentercolor") ?? NSColor.white } } @IBAction func leftButtonAction(_ sender: NSButton) { //远程控制 if let loginContent = KMAdvertisementManager.manager.info.loginViewContent { if loginContent.content?.isEmpty == false { let content = loginContent.content?.first let string = KMAdvertisementModelTransition.transitionLanguage(langeuage: content?.linkURL) if string.count != 0 { NSWorkspace.shared.open(URL.init(string: string)!) } } } } // 刷新左侧视图 private func refreshSplitView() -> Void { leftImageView.image = NSImage(named: "WelcomePDFReaderPro1") self.leftsubLabel.isHidden = false self.leftsubImageView.isHidden = false if viewModel.screenType == .signUp { leftsubImageView.image = NSImage(named: "WelcomeSubPDFReaderPro") //远程控制 if let loginContent = KMAdvertisementManager.manager.info.loginViewContent { if loginContent.content?.isEmpty == false { let content = loginContent.content?.first let url = URL(string: KMAdvertisementModelTransition.transitionImagePath(image: content?.image, highlight: false)) let _ = KMAdvertisementImage.imageWithURL(url: url) { [weak self] image in guard let self = self else { return } if image.isValid { self.leftImageView.image = image self.leftsubLabel.isHidden = true self.leftsubImageView.isHidden = true } } } } } else { leftsubImageView.image = NSImage(named: "WelcomeSub2PDFReaderPro") } } // MARK: public Action @objc func loginSuccessNotification() -> Void { if let result = loginResult { result(true) } window?.close() } @objc func logoutSuccessNotification() -> Void { signUpView?.resetTextFileData() } func openWindow(_ complete: @escaping LoginResultComplete) -> Void { KMLoginWindowsController.shared.showWindow(nil) loginResult = complete } // MARK: Bind Method func bindViewModel() -> Void { viewModel.$screenType .receive(on: RunLoop.main) .sink { [weak self] newValue in self?.refreshSplitView() } .store(in: &cancellables) } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "contentView" { if let newContentView = change?[.newKey] as? NSView { if newContentView is KMSignUpView { viewModel.screenType = .signUp } else if newContentView is KMForgotPasswordView { viewModel.screenType = .forgotPassword } else if newContentView is KMEnterVerificationCodeView { viewModel.screenType = .enterVerificationCode } else if newContentView is KMEnterNewPasswordView { viewModel.screenType = .enterNewPassword } refreshSplitView() } } } }