Bläddra i källkod

Limit non-premium join actions to a one-time trial.

After the free attempt is used, gate both instant meet and join-by-link actions behind the paywall while keeping the UI visibly disabled.

Made-with: Cursor
huzaifahayat12 1 månad sedan
förälder
incheckning
a7c593a259
1 ändrade filer med 44 tillägg och 11 borttagningar
  1. 44 11
      meetings_app/ViewController.swift

+ 44 - 11
meetings_app/ViewController.swift

@@ -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) {