// // KMUserInfoViewController.swift // PDF Reader Pro // // Created by wanjun on 2024/10/30. // import Cocoa import Combine @objcMembers class KMUserInfoViewController: NSViewController { @IBOutlet weak var userImageView: NSImageView! @IBOutlet weak var emailLabel: NSTextField! @IBOutlet weak var productLabel: NSTextField! @IBOutlet weak var membershipLabel: NSTextField! @IBOutlet weak var lockedBackgroud: NSImageView! @IBOutlet weak var lockedImageView: NSImageView! @IBOutlet weak var lockedLabel: NSTextField! @IBOutlet weak var centerBackgroud: NSImageView! @IBOutlet weak var rightsBox: NSBox! @IBOutlet var rightsView: NSView! @IBOutlet weak var number1Label: NSTextField! @IBOutlet weak var number1ImageView: NSImageView! @IBOutlet weak var number2Label: NSTextField! @IBOutlet weak var iconBox: NSBox! @IBOutlet var iconView1: NSView! @IBOutlet weak var icon1ImageView: NSImageView! @IBOutlet weak var icon2ImageView: NSImageView! @IBOutlet weak var icon3ImageView: NSImageView! @IBOutlet weak var icon4ImageView: NSImageView! @IBOutlet var iconView2: NSView! @IBOutlet weak var icon5ImageView: NSImageView! @IBOutlet weak var icon6ImageView: NSImageView! @IBOutlet weak var icon7ImageView: NSImageView! @IBOutlet var iconView3: NSView! @IBOutlet weak var icon8ImageView: NSImageView! @IBOutlet weak var icon9ImageView: NSImageView! @IBOutlet var iconView4: NSView! @IBOutlet weak var icon10ImageView: NSImageView! @IBOutlet weak var number3Label: NSTextField! @IBOutlet weak var number4Label: NSTextField! @IBOutlet weak var number5Label: NSTextField! @IBOutlet weak var buyBox: NSBox! @IBOutlet var buyView1: NSView! @IBOutlet weak var buyNow1Box: KMBox! @IBOutlet weak var buyNow1ImageView: NSImageView! @IBOutlet weak var buyNow1Label: NSTextField! @IBOutlet weak var arrow1ImageView: NSImageView! @IBOutlet weak var buyNow2Box: KMBox! @IBOutlet weak var buyNow2ImageView: NSImageView! @IBOutlet weak var buyNow2Label: NSTextField! @IBOutlet weak var arrow2ImageView: NSImageView! @IBOutlet var buyView2: NSView! @IBOutlet weak var buyNow3Box: KMBox! @IBOutlet weak var buyNow3ImageView: NSImageView! @IBOutlet weak var buyNow3Label: NSTextField! @IBOutlet weak var arrow3ImageView: NSImageView! @IBOutlet weak var accountCenterBox: KMBox! @IBOutlet weak var accountImageView: NSImageView! @IBOutlet weak var accountLabel: NSTextField! @IBOutlet weak var signOutBox: KMBox! @IBOutlet weak var signOutImageView: NSImageView! @IBOutlet weak var signOutLabel: NSTextField! @IBOutlet weak var closeAccountBox: KMBox! @IBOutlet weak var closeAccountImageView: NSImageView! @IBOutlet weak var closeAccountLabel: NSTextField! private var viewModel = KMUserInfoVCModel() private var cancellables = Set() override func viewDidLoad() { super.viewDidLoad() // Do view setup here. self.view.wantsLayer = true self.view.layer?.backgroundColor = .white bindViewModel() languageLocalized() initializeUI() NotificationCenter.default.addObserver(self, selector: #selector(changeEffectiveAppearance), name: NSNotification.Name(rawValue: "kEffectiveAppearance"), object: nil) } @objc func changeEffectiveAppearance() { let isDarkModel = KMAdvertisementConfig.isDarkModel() if isDarkModel { self.view.appearance = NSAppearance(named: .darkAqua) } else { self.view.appearance = NSAppearance(named: .aqua) } initializeUI() } // MARK: Private Method private func languageLocalized() -> Void { emailLabel.stringValue = KMMemberInfo.shared.userEmail productLabel.stringValue = NSLocalizedString("Personal Account", tableName: "MemberCenterLocalizable", comment: "") membershipLabel.stringValue = NSLocalizedString("Membership Benefits", tableName: "MemberCenterLocalizable", comment: "") buyNow3Label.stringValue = NSLocalizedString("Upgrade Now", tableName: "MemberCenterLocalizable", comment: "") accountLabel.stringValue = NSLocalizedString("Account Center", tableName: "MemberCenterLocalizable", comment: "") signOutLabel.stringValue = NSLocalizedString("Sign out", tableName: "MemberCenterLocalizable", comment: "") if KMMemberInfo.shared.validFlag == "5" { closeAccountLabel.stringValue = NSLocalizedString("Undo Remove Account", tableName: "MemberCenterLocalizable", comment: "") } else { closeAccountLabel.stringValue = NSLocalizedString("Remove Account", tableName: "MemberCenterLocalizable", comment: "") } if KMMemberInfo.shared.vip_maxDeviceNum == 1 { number4Label.stringValue = String.localizedStringWithFormat(NSLocalizedString("%d devices", tableName: "MemberCenterLocalizable", comment: ""), KMMemberInfo.shared.vip_maxDeviceNum) } else { number4Label.stringValue = String.localizedStringWithFormat(NSLocalizedString("%d devices", tableName: "MemberCenterLocalizable", comment: ""), KMMemberInfo.shared.vip_maxDeviceNum) } if KMMemberInfo.shared.vip_levels == "2" { number1Label.stringValue = NSLocalizedString("", tableName: "MemberCenterLocalizable", comment: "") number2Label.stringValue = NSLocalizedString("Standard Version", tableName: "MemberCenterLocalizable", comment: "") number3Label.stringValue = NSLocalizedString("Platform", tableName: "MemberCenterLocalizable", comment: "") } else if KMMemberInfo.shared.vip_levels == "3" { number1Label.stringValue = NSLocalizedString("", tableName: "MemberCenterLocalizable", comment: "") number2Label.stringValue = NSLocalizedString("Advanced Version", tableName: "MemberCenterLocalizable", comment: "") number3Label.stringValue = NSLocalizedString("Platform", tableName: "MemberCenterLocalizable", comment: "") } else { number1Label.stringValue = NSLocalizedString("150+", tableName: "MemberCenterLocalizable", comment: "") number2Label.stringValue = NSLocalizedString("Benefits of Functions", tableName: "MemberCenterLocalizable", comment: "") number3Label.stringValue = NSLocalizedString("All-platform Available", tableName: "MemberCenterLocalizable", comment: "") } if KMMemberInfo.shared.vip_paymentModel == "2" && KMMemberInfo.shared.vip_levels != "1" { lockedLabel.stringValue = NSLocalizedString("Permanent Plan", tableName: "MemberCenterLocalizable", comment: "") } else if KMMemberInfo.shared.vip_paymentModel == "1" && KMMemberInfo.shared.vip_levels != "1" { lockedLabel.stringValue = NSLocalizedString("Annual Plan", tableName: "MemberCenterLocalizable", comment: "") } else { lockedLabel.stringValue = NSLocalizedString("Locked", tableName: "MemberCenterLocalizable", comment: "") } number5Label.stringValue = NSLocalizedString("Devices Access", tableName: "MemberCenterLocalizable", comment: "") if KMMemberInfo.shared.userScenarioType == .lite_type1 || KMMemberInfo.shared.userScenarioType == .lite_type9 { buyNow1Label.stringValue = NSLocalizedString("Buy Now", tableName: "MemberCenterLocalizable", comment: "") buyNow2Label.stringValue = NSLocalizedString("7-Day Free Trial", tableName: "MemberCenterLocalizable", comment: "") } else if KMMemberInfo.shared.userScenarioType == .lite_type3 || KMMemberInfo.shared.userScenarioType == .lite_type11 { buyNow3Label.stringValue = NSLocalizedString("Buy Now", tableName: "MemberCenterLocalizable", comment: "") } else if KMMemberInfo.shared.userScenarioType == .lite_type5 || KMMemberInfo.shared.userScenarioType == .pro_type1 || KMMemberInfo.shared.userScenarioType == .pro_type2 || KMMemberInfo.shared.userScenarioType == .pro_type3 { buyNow3Label.stringValue = NSLocalizedString("Upgrade Now", tableName: "MemberCenterLocalizable", comment: "") } else if KMMemberInfo.shared.userScenarioType == .lite_type7 || KMMemberInfo.shared.userScenarioType == .lite_type8 || KMMemberInfo.shared.userScenarioType == .lite_type13 { buyNow3Label.stringValue = NSLocalizedString("Renew now", tableName: "MemberCenterLocalizable", comment: "") } } private func initializeUI() -> Void { self.view.wantsLayer = true let isDarkModel = KMAdvertisementConfig.isDarkModel() if isDarkModel { self.view.layer?.backgroundColor = NSColor(hex: "0E1114").cgColor; } else { self.view.layer?.backgroundColor = NSColor(hex: "FFFFFF").cgColor; } userImageView.image = NSImage(named: "UserProfilePicture_Size") emailLabel.textColor = NSColor(named: "0E1114") emailLabel.font = NSFont.SFMediumFontWithSize(14) productLabel.textColor = NSColor(named: "42464D_1") productLabel.font = NSFont.SFProTextRegularFont(12) membershipLabel.textColor = NSColor(hex: "0E1114") membershipLabel.font = NSFont.SFMediumFontWithSize(16) lockedBackgroud.image = NSImage(named: "ButtonBackgroundImage1") lockedLabel.textColor = NSColor(hex: "42464D") lockedLabel.font = NSFont.SFMediumFontWithSize(12) rightsBox.contentView = rightsView number1Label.textColor = NSColor(hex: "0E1114") number1Label.font = NSFont.SFMediumFontWithSize(24) number1ImageView.image = NSImage(named: "UpgradeImage") number2Label.textColor = NSColor(hex:"42464D") number2Label.font = NSFont.SFProTextRegularFont(12) number3Label.textColor = NSColor(hex:"42464D") number3Label.font = NSFont.SFProTextRegularFont(12) number5Label.textColor = NSColor(hex: "42464D") number5Label.font = NSFont.SFProTextRegularFont(12) number4Label.textColor = NSColor(hex: "42464D") buyNow1ImageView.image = NSImage(named: "ButtonBackgroundImage2") buyNow2ImageView.image = NSImage(named: "ButtonBackgroundImage2") buyNow3ImageView.image = NSImage(named: "ButtonBackgroundImage2") buyNow1Label.textColor = NSColor(named: "FFFFFF") buyNow1Label.font = NSFont.SFProTextRegularFont(14) buyNow2Label.textColor = NSColor(named: "FFFFFF") buyNow2Label.font = NSFont.SFProTextRegularFont(14) buyNow3Label.textColor = NSColor(named: "000000") buyNow3Label.font = NSFont.SFProTextRegularFont(14) accountCenterBox.borderColor = NSColor(named: "3091FF") ?? .blue accountCenterBox.fillColor = .clear accountLabel.textColor = NSColor(named: "065CBC") accountLabel.font = NSFont.SFProTextRegularFont(14) accountImageView.image = NSImage(named: "AccountCenterImage") signOutLabel.textColor = NSColor(named: "065CBC") signOutLabel.font = NSFont.SFProTextRegularFont(14) signOutImageView.image = NSImage(named: "SignOutImage") closeAccountLabel.textColor = NSColor(named: "065CBC") closeAccountLabel.font = NSFont.SFProTextRegularFont(14) closeAccountImageView.image = NSImage(named: "CloseAccountImage") buyNow3Box.fillColor = NSColor(named: "FFFFFF") ?? .white if KMMemberInfo.shared.userScenarioType == .lite_type1 || KMMemberInfo.shared.userScenarioType == .lite_type2 || KMMemberInfo.shared.userScenarioType == .lite_type3 || KMMemberInfo.shared.userScenarioType == .lite_type9 || KMMemberInfo.shared.userScenarioType == .lite_type10 || KMMemberInfo.shared.userScenarioType == .lite_type11 { lockedImageView.image = NSImage(named: "LockedImage") centerBackgroud.image = NSImage(named: "ButtonBackgroundImage3") rightsBox.fillColor = NSColor(named: "7094F6_0.1") ?? .white number1ImageView.isHidden = true number1Label.isHidden = false if KMMemberInfo.shared.userScenarioType == .lite_type1 || KMMemberInfo.shared.userScenarioType == .lite_type9 { buyBox.contentView = buyView1 buyNow1ImageView.isHidden = false buyNow2ImageView.isHidden = false arrow1ImageView.image = NSImage(named: "BuyNewArrowImage1") arrow2ImageView.image = NSImage(named: "BuyNewArrowImage1") } else if KMMemberInfo.shared.userScenarioType == .lite_type3 || KMMemberInfo.shared.userScenarioType == .lite_type11 { buyNow3Label.textColor = NSColor(named: "FFFFFF") buyBox.contentView = buyView2 buyNow3ImageView.isHidden = false arrow3ImageView.image = NSImage(named: "BuyNewArrowImage1") } } else if KMMemberInfo.shared.userScenarioType == .lite_type4 || KMMemberInfo.shared.userScenarioType == .lite_type5 || KMMemberInfo.shared.userScenarioType == .lite_type6 || KMMemberInfo.shared.userScenarioType == .lite_type12 || KMMemberInfo.shared.userScenarioType == .pro_type1 || KMMemberInfo.shared.userScenarioType == .pro_type2 || KMMemberInfo.shared.userScenarioType == .pro_type3 { membershipLabel.textColor = NSColor(named: "FFFFFF") number2Label.textColor = NSColor(named: "FFFFFF") number3Label.textColor = NSColor(named: "FFFFFF") number4Label.textColor = NSColor(named: "FFFFFF") number5Label.textColor = NSColor(named: "FFFFFF") lockedImageView.image = NSImage(named: "UpgradeImage2") centerBackgroud.image = NSImage(named: "ButtonBackgroundImage4") rightsBox.fillColor = NSColor(named: "FFFFFF_0.2") ?? .white number1ImageView.isHidden = false number1Label.isHidden = true if KMMemberInfo.shared.userScenarioType == .lite_type5 || KMMemberInfo.shared.userScenarioType == .pro_type1 || KMMemberInfo.shared.userScenarioType == .pro_type2 || KMMemberInfo.shared.userScenarioType == .pro_type3 { buyBox.contentView = buyView2 buyNow3ImageView.isHidden = true arrow3ImageView.image = NSImage(named: "BuyNewArrowImage2") } } else if KMMemberInfo.shared.userScenarioType == .lite_type7 { lockedImageView.image = NSImage(named: "LockedImage") centerBackgroud.image = NSImage(named: "ButtonBackgroundImage3") rightsBox.fillColor = NSColor(named: "7094F6_0.1") ?? .white number1ImageView.isHidden = true number1Label.isHidden = false buyBox.contentView = buyView2 buyNow3ImageView.isHidden = false buyNow3Label.textColor = NSColor(named: "FFFFFF") arrow3ImageView.image = NSImage(named: "BuyNewArrowImage1") } else if KMMemberInfo.shared.userScenarioType == .lite_type8 || KMMemberInfo.shared.userScenarioType == .lite_type13 { membershipLabel.textColor = NSColor(named: "FFFFFF") number1Label.textColor = NSColor(named: "FFFFFF") number2Label.textColor = NSColor(named: "FFFFFF") number3Label.textColor = NSColor(named: "FFFFFF") number4Label.textColor = NSColor(named: "FFFFFF") number5Label.textColor = NSColor(named: "FFFFFF") lockedImageView.image = NSImage(named: "UpgradeImage2") centerBackgroud.image = NSImage(named: "ButtonBackgroundImage5") rightsBox.fillColor = NSColor(named: "7094F6_0.1") ?? .white number1ImageView.isHidden = true number1Label.isHidden = false // buyBox.contentView = buyView2 // buyNow3ImageView.isHidden = true // arrow3ImageView.image = NSImage(named: "BuyNewArrowImage2") } let platforms = viewModel.getPlatformsImages() if platforms.count == 4 { iconBox.contentView = iconView1 icon1ImageView.image = platforms[0] icon2ImageView.image = platforms[1] icon3ImageView.image = platforms[2] icon4ImageView.image = platforms[3] } else if platforms.count == 3 { iconBox.contentView = iconView2 icon5ImageView.image = platforms[0] icon6ImageView.image = platforms[1] icon7ImageView.image = platforms[2] } else if platforms.count == 2 { iconBox.contentView = iconView3 icon8ImageView.image = platforms[0] icon9ImageView.image = platforms[1] } else if platforms.count == 1 { iconBox.contentView = iconView4 icon10ImageView.image = platforms[0] } buyNow1Box.moveCallback = { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in guard let self = self else { return } if mouseEntered { self.buyNow1ImageView.image = NSImage(named: "ButtonBackgroundImage2_Hov") } else { self.buyNow1ImageView.image = NSImage(named: "ButtonBackgroundImage2") } } buyNow1Box.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in guard let self = self else { return } if KMMemberInfo.shared.userScenarioType == .lite_type1 { self.viewModel.skipCompare(.lite_Base) } else if KMMemberInfo.shared.userScenarioType == .lite_type9 { self.viewModel.skipCompare(.lite_MacWindows) } } buyNow2Box.moveCallback = { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in guard let self = self else { return } if mouseEntered { self.buyNow2ImageView.image = NSImage(named: "ButtonBackgroundImage2_Hov") } else { self.buyNow2ImageView.image = NSImage(named: "ButtonBackgroundImage2") } } buyNow2Box.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in guard let self = self else { return } if KMMemberInfo.shared.userScenarioType == .lite_type1 || KMMemberInfo.shared.userScenarioType == .lite_type9 { self.viewModel.skipCompare(.trial) } } buyNow3Box.moveCallback = { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in guard let self = self else { return } if KMMemberInfo.shared.userScenarioType == .lite_type3 || KMMemberInfo.shared.userScenarioType == .lite_type11 { if mouseEntered { self.buyNow3ImageView.image = NSImage(named: "ButtonBackgroundImage2_Hov") } else { self.buyNow3ImageView.image = NSImage(named: "ButtonBackgroundImage2") } } } buyNow3Box.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in guard let self = self else { return } if KMMemberInfo.shared.userScenarioType == .lite_type3 || KMMemberInfo.shared.userScenarioType == .lite_type7 || KMMemberInfo.shared.userScenarioType == .lite_type8 { self.viewModel.skipCompare(.lite_Base) } else if KMMemberInfo.shared.userScenarioType == .lite_type5 || KMMemberInfo.shared.userScenarioType == .lite_type11 || KMMemberInfo.shared.userScenarioType == .lite_type13 { self.viewModel.skipCompare(.lite_MacWindows) } else if KMMemberInfo.shared.userScenarioType == .pro_type1 || KMMemberInfo.shared.userScenarioType == .pro_type3 { self.viewModel.skipCompare(.pro_Advanced) } else if KMMemberInfo.shared.userScenarioType == .pro_type2 { self.viewModel.skipCompare(.pro_Base) } } accountCenterBox.moveCallback = { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in guard let self = self else { return } if mouseEntered { self.accountCenterBox.fillColor = .clear self.accountLabel.textColor = NSColor(named: "3091FF") self.accountImageView.image = NSImage(named: "AccountCenterImage_Hov") } else { self.accountCenterBox.fillColor = .clear self.accountLabel.textColor = NSColor(named: "065CBC") self.accountImageView.image = NSImage(named: "AccountCenterImage") } } accountCenterBox.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in guard let self = self else { return } self.viewModel.skipAccountCenter() } signOutBox.moveCallback = { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in guard let self = self else { return } if mouseEntered { self.signOutLabel.textColor = NSColor(named: "3091FF") self.signOutImageView.image = NSImage(named: "SignOutImage_Hov") } else { self.signOutLabel.textColor = NSColor(named: "065CBC") self.signOutImageView.image = NSImage(named: "SignOutImage") } } signOutBox.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in guard let self = self else { return } self.viewModel.signOutAction() } closeAccountBox.moveCallback = { [weak self](mouseEntered: Bool, mouseBox: KMBox) -> Void in guard let self = self else { return } } closeAccountBox.downCallback = { [weak self](downEntered: Bool, mouseBox: KMBox, event) -> Void in guard let self = self else { return } self.viewModel.closeAccountAction() } } // MARK: Bind Method func bindViewModel() -> Void { } // MARK: Action Method }