// // KMAccountInfoView.swift // PDF Reader Pro // // Created by lizhe on 2023/2/24. // import Cocoa typealias KMAccountInfoViewCloseAction = (_ view: KMAccountInfoView) -> Void typealias KMAccountInfoViewCancellationAction = (_ view: KMAccountInfoView) -> Void typealias KMAccountInfoViewLogOutAction = (_ view: KMAccountInfoView) -> Void typealias KMAccountInfoViewPurchaseInfoAction = (_ view: KMAccountInfoView) -> Void typealias KMAccountInfoViewSubcriptionAction = (_ view: KMAccountInfoView) -> Void class KMAccountInfoView: KMBaseXibView { @IBOutlet weak var titleLabel: NSTextField! @IBOutlet weak var closeButton: NSButton! @IBOutlet weak var infoContentView: NSView! @IBOutlet weak var moreButton: NSButton! @IBOutlet weak var imageViewButton: NSButton! @IBOutlet weak var accountDescribeLabel: NSTextField! @IBOutlet weak var accountLabel: NSTextField! @IBOutlet weak var closeBox: KMBox! @IBOutlet weak var statusTitleLabel: NSTextField! @IBOutlet weak var statusLabel: NSTextField! @IBOutlet weak var tagLabel: NSTextField! @IBOutlet weak var tagContentView: NSView! @IBOutlet weak var statusTimeLabel: NSTextField! @IBOutlet weak var purchaseInfoButton: NSButton! @IBOutlet weak var lineView: NSView! @IBOutlet weak var subscribeButton: NSButton! @IBOutlet weak var statusContentView: NSView! @IBOutlet weak var purchaseInfoContentView: NSView! @IBOutlet weak var subscribeButtonContentView: NSView! @IBOutlet weak var subscriptionInfoContentViewHeightConstraint: NSLayoutConstraint! @IBOutlet weak var subscriptionInfoContentViewTopConstraint: NSLayoutConstraint! @IBOutlet weak var lineViewTopConttraint: NSLayoutConstraint! var closeAction: KMAccountInfoViewCloseAction? var cancellationAction: KMAccountInfoViewCancellationAction? var logOutAction: KMAccountInfoViewLogOutAction? var purchaseInfoAction: KMAccountInfoViewPurchaseInfoAction? var subcriptionAction: KMAccountInfoViewSubcriptionAction? var userInfo: KMLightMemberUserInfo? { didSet { self.reloadData() } } var purchaseState: KMPurchaseManagerState = .unknow { didSet { self.reloadData() } } override func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) // Drawing code here. } override func setup() { super.setup() self.closeBox.moveCallback = { [weak self] (mouseEntered, mouseBox) in if mouseEntered { self?.closeButton.image = NSImage(named: "control_btn_icon_close_hov") } else { self?.closeButton.image = NSImage(named: "control_btn_icon_close") } } } override func updateUI() { super.updateUI() self.titleLabel.textColor = NSColor.km_init(hex: "#252629") self.titleLabel.font = NSFont.SFProTextSemiboldFont(20.0) self.accountLabel.textColor = NSColor.km_init(hex: "#252629") self.accountLabel.font = NSFont.SFProTextRegularFont(14.0) self.accountDescribeLabel.textColor = NSColor.km_init(hex: "#616469") self.accountDescribeLabel.font = NSFont.SFProTextSemiboldFont(12.0) self.imageViewButton.backgroundColor(NSColor.km_init(hex: "#1770F4")) self.imageViewButton.font = NSFont.SFProTextSemiboldFont(28.0) self.imageViewButton.contentTintColor = NSColor.km_init(hex: "#FFFFFF") self.imageViewButton.border(NSColor.km_init(hex: "#1770F4"), 1, 24) self.infoContentView.backgroundColor(NSColor.km_init(hex: "#F7F8FA")) self.infoContentView.border(NSColor.km_init(hex: "#F7F8FA"), 0, 6) self.purchaseInfoButton.font = NSFont.SFProTextRegularFont(14) self.purchaseInfoButton.contentTintColor = NSColor.km_init(hex: "#1770F4") self.statusTitleLabel.textColor = NSColor.km_init(hex: "#616469") self.statusTitleLabel.font = NSFont.SFProTextRegularFont(12.0) self.statusLabel.textColor = NSColor.km_init(hex: "#252629") self.statusLabel.font = NSFont.SFProTextSemiboldFont(16.0) self.statusTimeLabel.textColor = NSColor.km_init(hex: "#616469") self.statusTimeLabel.font = NSFont.SFProTextRegularFont(12.0) self.subscribeButton.contentTintColor = NSColor.km_init(hex: "#FFFFFF") self.subscribeButton.backgroundColor(NSColor.km_init(hex: "#FF852E")) self.subscribeButton.font = NSFont.SFProTextRegularFont(16) self.subscribeButton.border(NSColor.clear, 0, 20) self.tagLabel.font = NSFont.SFProTextRegularFont(12) self.tagLabel.textColor = NSColor.km_init(hex: "#252629") self.tagContentView.border(NSColor.km_init(hex: "#DFE1E5"), 1, 4) self.tagContentView.backgroundColor(NSColor.km_init(hex: "#F7F8FA")) self.lineView.backgroundColor(NSColor.km_init(hex: "#ECECEC")) self.updateMoreButtonState(select: false) } override func reloadData() { super.reloadData() if self.userInfo != nil { self.accountLabel.stringValue = userInfo!.email self.imageViewButton.title = userInfo?.email.substring(to: 1) ?? "" if KMLightMemberManager.manager.info.subscriptionInfoList[0].payType == 1 { self.tagContentView.isHidden = false } else { self.tagContentView.isHidden = true } } self.statusTimeLabel.stringValue = "" self.statusLabel.textColor = NSColor.km_init(hex: "#252629") //初始化 self.purchaseInfoContentView.isHidden = KMLightMemberManager.manager.existOrderInfo() ? false:true self.subscribeButtonContentView.isHidden = true self.statusContentView.isHidden = true self.subscriptionInfoContentViewHeightConstraint.constant = 74 self.subscriptionInfoContentViewTopConstraint.constant = 20 self.lineViewTopConttraint.constant = 16 self.lineView.isHidden = false if purchaseState == .unknow { #if VERSION_DMG self.subscriptionInfoContentViewHeightConstraint.constant = 0 self.subscriptionInfoContentViewTopConstraint.constant = 0 self.lineViewTopConttraint.constant = 12 self.lineView.isHidden = true #endif } else if purchaseState == .subscription || purchaseState == .trial { self.statusContentView.isHidden = false #if VERSION_DMG self.purchaseInfoContentView.isHidden = false if KMLightMemberManager.manager.info.subscriptionInfoList[0].payType == 1 { self.subscribeButtonContentView.isHidden = true } else { self.subscribeButtonContentView.isHidden = false } #else self.purchaseInfoContentView.isHidden = true #endif self.statusLabel.stringValue = NSLocalizedString("On Subscription", comment: "") if purchaseState == .trial { self.statusLabel.stringValue = NSLocalizedString("On Trial", comment: "") } let dateString = userInfo?.subscriptionInfoList[0].endDate ?? "" self.statusTimeLabel.stringValue = "\(self.fetchDate(dateString: dateString)) \n\(NSLocalizedString("Subscription expire on", comment: ""))" } else if purchaseState == .subscriptionExpired || purchaseState == .trialExpired { self.statusContentView.isHidden = false self.subscribeButtonContentView.isHidden = false #if VERSION_DMG self.purchaseInfoContentView.isHidden = false #else self.purchaseInfoContentView.isHidden = true #endif self.statusLabel.stringValue = NSLocalizedString("Expired", comment: "") self.statusLabel.textColor = NSColor.km_init(hex: "#F3465B") let dateString = userInfo?.subscriptionInfoList[0].endDate ?? "" self.statusTimeLabel.stringValue = "\(self.fetchDate(dateString: dateString)) \n\(NSLocalizedString("Subscription expire on", comment: ""))" } if self.userInfo != nil { if KMLightMemberManager.manager.info.subscriptionInfoList[0].payType == 1 { let dateString = userInfo?.subscriptionInfoList[0].endDate ?? "" self.statusTimeLabel.stringValue = "\(self.fetchDate(dateString: dateString))\n\(NSLocalizedString("Subscription renewal date", comment: ""))" } } self.updateLanguage() } override func updateLanguage() { super.updateLanguage() self.purchaseInfoButton.title = NSLocalizedString("Order Information", comment: "") self.tagLabel.stringValue = NSLocalizedString("Auto-renewal", comment: "") self.statusTitleLabel.stringValue = NSLocalizedString("Status", comment: "") self.accountDescribeLabel.stringValue = NSLocalizedString("Email Address", comment: "") self.titleLabel.stringValue = NSLocalizedString("Account Information", comment: "") // self.logOutButton.stringValue = NSLocalizedString("Log Out", comment: "") let timeString = self.statusTimeLabel.stringValue let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineHeightMultiple = 1.32 paragraphStyle.alignment = .right self.statusTimeLabel.attributedStringValue = NSMutableAttributedString(string: NSLocalizedString(timeString, comment: ""), attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle]) let paragraphStyle2 = NSMutableParagraphStyle() paragraphStyle2.lineHeightMultiple = 1.32 paragraphStyle2.alignment = .left self.statusLabel.attributedStringValue = NSMutableAttributedString(string: NSLocalizedString(self.statusLabel.stringValue, comment: ""), attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle2]) } func fetchDate(dateString: String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" let date = dateFormatter.date(from: dateString) let targetDateFormatter = DateFormatter() targetDateFormatter.dateFormat = "yyyy-MM-dd" let formattedDate = targetDateFormatter.string(from: date ?? NSDate() as Date) KMPrint(formattedDate) // 输出:2024-06-28 return formattedDate } } extension KMAccountInfoView { func updateMoreButtonState(select: Bool) { if select { self.moreButton.backgroundColor(NSColor.km_init(hex: "#CED0D4", alpha: 0.6)) self.moreButton.border(NSColor.km_init(hex: "#CED0D4"), 1, 4) } else { self.moreButton.backgroundColor(NSColor.clear) self.moreButton.border(NSColor.km_init(hex: "#CED0D4"), 0, 4) } } } protocol KMAccountInfoViewAction {} extension KMAccountInfoView: KMAccountInfoViewAction { @IBAction func closeButtonAction(_ sender: Any) { guard let callBack = closeAction else { return } callBack(self) } @IBAction func moreButtonAction(_ sender: NSButton) { self.updateMoreButtonState(select: true) let vc: KMHomePopViewController = KMHomePopViewController().initWithPopViewDataArr([NSLocalizedString("Log out", comment: ""), NSLocalizedString("Cancel", comment: "")]) let createFilePopover: NSPopover = NSPopover.init() createFilePopover.contentViewController = vc createFilePopover.delegate = self createFilePopover.animates = true createFilePopover.behavior = .semitransient createFilePopover.setValue(true, forKey: "shouldHideAnchor") createFilePopover.show(relativeTo: CGRect(x: sender.bounds.origin.x, y: 10, width: sender.bounds.size.width, height: sender.bounds.size.height), of: sender, preferredEdge: .maxY) // vc.customBoxWidthLayoutConstraint.constant = sender.frame.width vc.downCallback = { [unowned self] (downEntered: Bool, count: String) -> Void in if downEntered { if count == NSLocalizedString("Cancel", comment: "") { createFilePopover.close() guard let callBack = self.cancellationAction else { return } callBack(self) } else if count == "Log out" { guard let callBack = logOutAction else { return } callBack(self) } } } } @IBAction func purchaseButtonAction(_ sender: Any) { guard let callBack = purchaseInfoAction else { return } callBack(self) } @IBAction func subcriptionButtonAction(_ sender: Any) { guard let callBack = subcriptionAction else { return } callBack(self) } } extension KMAccountInfoView: NSPopoverDelegate { func popoverWillClose(_ notification: Notification) { self.updateMoreButtonState(select: false) } }