|
|
@@ -403,6 +403,7 @@ final class ViewController: NSViewController {
|
|
403
|
403
|
private let appUsageAccumulatedSecondsDefaultsKey = "rating.appUsageAccumulatedSeconds"
|
|
404
|
404
|
private let userHasRatedDefaultsKey = "rating.userHasRated"
|
|
405
|
405
|
private let ratingStateMigrationV2DoneDefaultsKey = "rating.stateMigrationV2Done"
|
|
|
406
|
+ private let nonPremiumJoinTrialConsumedDefaultsKey = "join.nonPremiumTrialConsumed"
|
|
406
|
407
|
private let ratingEligibleUsageSeconds: TimeInterval = 30 * 60
|
|
407
|
408
|
private var darkModeEnabled: Bool {
|
|
408
|
409
|
get {
|
|
|
@@ -412,6 +413,15 @@ final class ViewController: NSViewController {
|
|
412
|
413
|
set { UserDefaults.standard.set(newValue, forKey: darkModeDefaultsKey) }
|
|
413
|
414
|
}
|
|
414
|
415
|
|
|
|
416
|
+ private var nonPremiumJoinTrialConsumed: Bool {
|
|
|
417
|
+ get { UserDefaults.standard.bool(forKey: nonPremiumJoinTrialConsumedDefaultsKey) }
|
|
|
418
|
+ set { UserDefaults.standard.set(newValue, forKey: nonPremiumJoinTrialConsumedDefaultsKey) }
|
|
|
419
|
+ }
|
|
|
420
|
+
|
|
|
421
|
+ private var shouldGateJoinActionsForNonPremium: Bool {
|
|
|
422
|
+ !storeKitCoordinator.hasPremiumAccess && nonPremiumJoinTrialConsumed
|
|
|
423
|
+ }
|
|
|
424
|
+
|
|
415
|
425
|
private func makeSettingsPopover() -> NSPopover {
|
|
416
|
426
|
let popover = NSPopover()
|
|
417
|
427
|
popover.behavior = .transient
|
|
|
@@ -732,6 +742,11 @@ private extension ViewController {
|
|
732
|
742
|
@objc private func statusBarSignOutRequested() { performGoogleSignOut() }
|
|
733
|
743
|
|
|
734
|
744
|
@objc private func joinMeetClicked(_ sender: Any?) {
|
|
|
745
|
+ guard shouldGateJoinActionsForNonPremium == false else {
|
|
|
746
|
+ showPaywall()
|
|
|
747
|
+ return
|
|
|
748
|
+ }
|
|
|
749
|
+
|
|
735
|
750
|
let rawInput = meetLinkField?.stringValue.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
|
|
736
|
751
|
|
|
737
|
752
|
guard let url = normalizedMeetJoinURL(from: rawInput) else {
|
|
|
@@ -743,6 +758,7 @@ private extension ViewController {
|
|
743
|
758
|
}
|
|
744
|
759
|
|
|
745
|
760
|
openInDefaultBrowser(url: url)
|
|
|
761
|
+ consumeNonPremiumJoinTrialIfNeeded()
|
|
746
|
762
|
}
|
|
747
|
763
|
|
|
748
|
764
|
@objc private func joinWithLinkCardClicked(_ sender: NSClickGestureRecognizer) {
|
|
|
@@ -783,8 +799,21 @@ private extension ViewController {
|
|
783
|
799
|
}
|
|
784
|
800
|
|
|
785
|
801
|
@objc private func instantMeetClicked(_ sender: NSClickGestureRecognizer) {
|
|
|
802
|
+ guard shouldGateJoinActionsForNonPremium == false else {
|
|
|
803
|
+ showPaywall()
|
|
|
804
|
+ return
|
|
|
805
|
+ }
|
|
|
806
|
+
|
|
786
|
807
|
guard let url = URL(string: "https://meet.google.com/new") else { return }
|
|
787
|
808
|
openInDefaultBrowser(url: url)
|
|
|
809
|
+ consumeNonPremiumJoinTrialIfNeeded()
|
|
|
810
|
+ }
|
|
|
811
|
+
|
|
|
812
|
+ private func consumeNonPremiumJoinTrialIfNeeded() {
|
|
|
813
|
+ guard !storeKitCoordinator.hasPremiumAccess,
|
|
|
814
|
+ !nonPremiumJoinTrialConsumed else { return }
|
|
|
815
|
+ nonPremiumJoinTrialConsumed = true
|
|
|
816
|
+ refreshInstantMeetPremiumState()
|
|
788
|
817
|
}
|
|
789
|
818
|
|
|
790
|
819
|
private func normalizedURLString(from value: String) -> String {
|
|
|
@@ -1550,20 +1579,24 @@ private extension ViewController {
|
|
1550
|
1579
|
}
|
|
1551
|
1580
|
|
|
1552
|
1581
|
private func refreshInstantMeetPremiumState() {
|
|
1553
|
|
- instantMeetCardView?.alphaValue = 1.0
|
|
1554
|
|
- instantMeetTitleLabel?.alphaValue = 1.0
|
|
1555
|
|
- instantMeetSubtitleLabel?.alphaValue = 1.0
|
|
1556
|
|
- instantMeetCardView?.toolTip = nil
|
|
|
1582
|
+ let isLocked = shouldGateJoinActionsForNonPremium
|
|
|
1583
|
+ let lockedAlpha: CGFloat = 0.6
|
|
|
1584
|
+
|
|
|
1585
|
+ instantMeetCardView?.alphaValue = isLocked ? lockedAlpha : 1.0
|
|
|
1586
|
+ instantMeetTitleLabel?.alphaValue = isLocked ? lockedAlpha : 1.0
|
|
|
1587
|
+ instantMeetSubtitleLabel?.alphaValue = isLocked ? lockedAlpha : 1.0
|
|
|
1588
|
+ instantMeetCardView?.toolTip = isLocked ? "Free trial used. Upgrade to continue." : nil
|
|
1557
|
1589
|
instantMeetCardView?.onHoverChanged?(false)
|
|
1558
|
1590
|
|
|
1559
|
|
- joinWithLinkCardView?.alphaValue = 1.0
|
|
1560
|
|
- joinWithLinkTitleLabel?.alphaValue = 1.0
|
|
1561
|
|
- meetLinkField?.isEditable = true
|
|
1562
|
|
- meetLinkField?.isSelectable = true
|
|
1563
|
|
- meetLinkField?.alphaValue = 1.0
|
|
|
1591
|
+ joinWithLinkCardView?.alphaValue = isLocked ? lockedAlpha : 1.0
|
|
|
1592
|
+ joinWithLinkTitleLabel?.alphaValue = isLocked ? lockedAlpha : 1.0
|
|
|
1593
|
+ meetLinkField?.isEditable = !isLocked
|
|
|
1594
|
+ meetLinkField?.isSelectable = !isLocked
|
|
|
1595
|
+ meetLinkField?.alphaValue = isLocked ? lockedAlpha : 1.0
|
|
1564
|
1596
|
joinMeetPrimaryButton?.isEnabled = true
|
|
1565
|
|
- joinMeetPrimaryButton?.alphaValue = 1.0
|
|
1566
|
|
- joinWithLinkCardView?.toolTip = nil
|
|
|
1597
|
+ joinMeetPrimaryButton?.alphaValue = isLocked ? lockedAlpha : 1.0
|
|
|
1598
|
+ joinMeetPrimaryButton?.toolTip = isLocked ? "Free trial used. Upgrade to continue." : nil
|
|
|
1599
|
+ joinWithLinkCardView?.toolTip = isLocked ? "Free trial used. Upgrade to continue." : nil
|
|
1567
|
1600
|
}
|
|
1568
|
1601
|
|
|
1569
|
1602
|
private func handlePremiumAccessChanged(_ hasPremiumAccess: Bool) {
|