You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

165 lines
6.9 KiB

// Copyright © 2015 Abhishek Banthia
import Cocoa
import CoreLoggerKit
struct AboutUsConstants {
static let AboutUsNibIdentifier = "CLAboutWindows"
static let GitHubURL = "https://github.com/abhishekbanthia/Clocker/?ref=ClockerApp"
static let PayPalURL = "https://paypal.me/abhishekbanthia1712"
static let TwitterLink = "https://twitter.com/clocker_support/?ref=ClockerApp"
static let TwitterFollowIntentLink = "https://twitter.com/intent/follow?screen_name=clocker_support"
static let AppStoreLink = "macappstore://itunes.apple.com/us/app/clocker/id1056643111?action=write-review"
static let AppStoreUpdateLink = "macappstore://itunes.apple.com/us/app/clocker/id1056643111"
static let CrowdInLocalizationLink = "https://crwd.in/clocker"
static let FAQsLink = "https://abhishekbanthia.com/clocker/faq"
}
class AboutViewController: ParentViewController {
@IBOutlet var quickCommentAction: PointingHandCursorButton!
@IBOutlet var privateFeedback: PointingHandCursorButton!
@IBOutlet var supportClocker: PointingHandCursorButton!
@IBOutlet var openSourceButton: PointingHandCursorButton!
@IBOutlet var versionField: NSTextField!
private var themeDidChangeNotification: NSObjectProtocol?
private var feedbackWindow: AppFeedbackWindowController?
override func viewDidLoad() {
super.viewDidLoad()
privateFeedback.setAccessibilityIdentifier("ClockerPrivateFeedback")
let appDisplayName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") ?? "Clocker"
let shortVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "N/A"
let longVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "N/A"
versionField.stringValue = "\(appDisplayName) \(shortVersion) (\(longVersion))"
setup()
themeDidChangeNotification = NotificationCenter.default.addObserver(forName: .themeDidChangeNotification, object: nil, queue: OperationQueue.main) { _ in
self.setup()
}
}
deinit {
if let themeDidChangeNotif = themeDidChangeNotification {
NotificationCenter.default.removeObserver(themeDidChangeNotif)
}
}
private func underlineTextForActionButton() {
let rangesInOrder = [NSRange(location: 3, length: 16),
NSRange(location: 7, length: privateFeedback.attributedTitle.length - 7),
NSRange(location: 27, length: 33),
NSRange(location: 42, length: 14)]
let buttonsInOrder = [quickCommentAction,
privateFeedback,
supportClocker,
openSourceButton]
let localizedKeys = ["1. @clocker_support on Twitter for quick comments",
"2. For Private Feedback",
"You can support Clocker by leaving a review on the App Store! :)",
"Help localize Clocker in your language by clicking here!"]
zip(buttonsInOrder, localizedKeys).forEach { arg in
let (button, title) = arg
button?.title = title
}
zip(rangesInOrder, buttonsInOrder).forEach { arg in
let (range, button) = arg
setUnderline(for: button, range: range)
}
}
private func setUnderline(for button: PointingHandCursorButton?, range: NSRange) {
guard let underlinedButton = button else { return }
let mutableParaghStyle = NSMutableParagraphStyle()
mutableParaghStyle.alignment = .center
let originalText = NSMutableAttributedString(string: underlinedButton.title)
originalText.addAttribute(NSAttributedString.Key.underlineStyle,
value: NSNumber(value: Int8(NSUnderlineStyle.single.rawValue)),
range: range)
originalText.addAttribute(NSAttributedString.Key.foregroundColor,
value: Themer.shared().mainTextColor(),
range: NSRange(location: 0, length: underlinedButton.attributedTitle.string.count))
originalText.addAttribute(NSAttributedString.Key.font,
value: (button?.font)!,
range: NSRange(location: 0, length: underlinedButton.attributedTitle.string.count))
originalText.addAttribute(NSAttributedString.Key.paragraphStyle,
value: mutableParaghStyle,
range: NSRange(location: 0, length: underlinedButton.attributedTitle.string.count))
underlinedButton.attributedTitle = originalText
}
@IBAction func openMyTwitter(_: Any) {
guard let twitterURL = URL(string: AboutUsConstants.TwitterLink),
let countryCode = Locale.autoupdatingCurrent.regionCode else { return }
NSWorkspace.shared.open(twitterURL)
// Log this
let custom: [String: Any] = ["Country": countryCode]
Logger.log(object: custom, for: "Opened Twitter")
}
@IBAction func viewSource(_: Any) {
guard let sourceURL = URL(string: AboutUsConstants.AppStoreLink),
let countryCode = Locale.autoupdatingCurrent.regionCode else { return }
NSWorkspace.shared.open(sourceURL)
// Log this
let custom: [String: Any] = ["Country": countryCode]
Logger.log(object: custom, for: "Open App Store to Review")
}
@IBAction func reportIssue(_: Any) {
feedbackWindow = AppFeedbackWindowController.sharedWindow
feedbackWindow?.appFeedbackWindowDelegate = self
feedbackWindow?.showWindow(nil)
NSApp.activate(ignoringOtherApps: true)
view.window?.orderOut(nil)
if let countryCode = Locale.autoupdatingCurrent.regionCode {
let custom: [String: Any] = ["Country": countryCode]
Logger.log(object: custom, for: "Report Issue Opened")
}
}
@IBAction func openGitHub(_: Any) {
guard let localizationURL = URL(string: AboutUsConstants.CrowdInLocalizationLink),
let languageCode = Locale.preferredLanguages.first else { return }
NSWorkspace.shared.open(localizationURL)
// Log this
let custom: [String: Any] = ["Language": languageCode]
Logger.log(object: custom, for: "Opened Localization Link")
}
@IBOutlet var feedbackLabel: NSTextField!
private func setup() {
feedbackLabel.stringValue = "Feedback is always welcome:".localized()
feedbackLabel.textColor = Themer.shared().mainTextColor()
versionField.textColor = Themer.shared().mainTextColor()
underlineTextForActionButton()
}
}
extension AboutViewController: AppFeedbackWindowControllerDelegate {
func appFeedbackWindowWillClose() {
feedbackWindow = nil
}
func appFeedbackWindoEntryPoint() -> String {
return "about_view_controller"
}
}