Sfoglia il codice sorgente

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 mese fa
parent
commit
a7c593a259
1 ha cambiato i file con 44 aggiunte e 11 eliminazioni
  1. 44 11
      meetings_app/ViewController.swift

+ 44 - 11
meetings_app/ViewController.swift

@@ -403,6 +403,7 @@ final class ViewController: NSViewController {
403
     private let appUsageAccumulatedSecondsDefaultsKey = "rating.appUsageAccumulatedSeconds"
403
     private let appUsageAccumulatedSecondsDefaultsKey = "rating.appUsageAccumulatedSeconds"
404
     private let userHasRatedDefaultsKey = "rating.userHasRated"
404
     private let userHasRatedDefaultsKey = "rating.userHasRated"
405
     private let ratingStateMigrationV2DoneDefaultsKey = "rating.stateMigrationV2Done"
405
     private let ratingStateMigrationV2DoneDefaultsKey = "rating.stateMigrationV2Done"
406
+    private let nonPremiumJoinTrialConsumedDefaultsKey = "join.nonPremiumTrialConsumed"
406
     private let ratingEligibleUsageSeconds: TimeInterval = 30 * 60
407
     private let ratingEligibleUsageSeconds: TimeInterval = 30 * 60
407
     private var darkModeEnabled: Bool {
408
     private var darkModeEnabled: Bool {
408
         get {
409
         get {
@@ -412,6 +413,15 @@ final class ViewController: NSViewController {
412
         set { UserDefaults.standard.set(newValue, forKey: darkModeDefaultsKey) }
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
     private func makeSettingsPopover() -> NSPopover {
425
     private func makeSettingsPopover() -> NSPopover {
416
         let popover = NSPopover()
426
         let popover = NSPopover()
417
         popover.behavior = .transient
427
         popover.behavior = .transient
@@ -732,6 +742,11 @@ private extension ViewController {
732
     @objc private func statusBarSignOutRequested() { performGoogleSignOut() }
742
     @objc private func statusBarSignOutRequested() { performGoogleSignOut() }
733
 
743
 
734
     @objc private func joinMeetClicked(_ sender: Any?) {
744
     @objc private func joinMeetClicked(_ sender: Any?) {
745
+        guard shouldGateJoinActionsForNonPremium == false else {
746
+            showPaywall()
747
+            return
748
+        }
749
+
735
         let rawInput = meetLinkField?.stringValue.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
750
         let rawInput = meetLinkField?.stringValue.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
736
 
751
 
737
         guard let url = normalizedMeetJoinURL(from: rawInput) else {
752
         guard let url = normalizedMeetJoinURL(from: rawInput) else {
@@ -743,6 +758,7 @@ private extension ViewController {
743
         }
758
         }
744
 
759
 
745
         openInDefaultBrowser(url: url)
760
         openInDefaultBrowser(url: url)
761
+        consumeNonPremiumJoinTrialIfNeeded()
746
     }
762
     }
747
 
763
 
748
     @objc private func joinWithLinkCardClicked(_ sender: NSClickGestureRecognizer) {
764
     @objc private func joinWithLinkCardClicked(_ sender: NSClickGestureRecognizer) {
@@ -783,8 +799,21 @@ private extension ViewController {
783
     }
799
     }
784
 
800
 
785
     @objc private func instantMeetClicked(_ sender: NSClickGestureRecognizer) {
801
     @objc private func instantMeetClicked(_ sender: NSClickGestureRecognizer) {
802
+        guard shouldGateJoinActionsForNonPremium == false else {
803
+            showPaywall()
804
+            return
805
+        }
806
+
786
         guard let url = URL(string: "https://meet.google.com/new") else { return }
807
         guard let url = URL(string: "https://meet.google.com/new") else { return }
787
         openInDefaultBrowser(url: url)
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
     private func normalizedURLString(from value: String) -> String {
819
     private func normalizedURLString(from value: String) -> String {
@@ -1550,20 +1579,24 @@ private extension ViewController {
1550
     }
1579
     }
1551
 
1580
 
1552
     private func refreshInstantMeetPremiumState() {
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
         instantMeetCardView?.onHoverChanged?(false)
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
         joinMeetPrimaryButton?.isEnabled = true
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
     private func handlePremiumAccessChanged(_ hasPremiumAccess: Bool) {
1602
     private func handlePremiumAccessChanged(_ hasPremiumAccess: Bool) {