Browse Source

Require premium for Reddit and AI generation, defaulting to Post Generator.

Free users now see the paywall when opening Reddit or generating content, while the app launches on Post Generator instead of the Reddit web view.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 month ago
parent
commit
609def0fb4

+ 8 - 3
Reddit App/ViewModels/FrontPageViewModel.swift

@@ -6,8 +6,13 @@ final class FrontPageViewModel {
     private static let redditHomeURL = URL(string: "https://www.reddit.com")!
 
     private(set) var redditLoadURL = redditHomeURL
-    var selectedNavItem: SidebarNavItem?
-    var isRedditActive = true
+    static let postGeneratorItem = SidebarNavItem(
+        title: "Post Generator",
+        subtitle: "Generate engaging posts",
+        iconKind: .postGenerator
+    )
+    var selectedNavItem: SidebarNavItem? = postGeneratorItem
+    var isRedditActive = false
     var isSettingsActive = false
     var isHistoryActive = false
     var isPaywallPresented = false
@@ -88,7 +93,7 @@ final class FrontPageViewModel {
     }
 
     let createItems: [SidebarNavItem] = [
-        SidebarNavItem(title: "Post Generator", subtitle: "Generate engaging posts", iconKind: .postGenerator),
+        postGeneratorItem,
         SidebarNavItem(title: "Title Optimizer", subtitle: "Create viral titles", iconKind: .titleOptimizer),
         SidebarNavItem(title: "Comment Writer", subtitle: "Write smart replies", iconKind: .commentWriter),
     ]

+ 2 - 2
Reddit App/Views/CommentWriterView.swift

@@ -42,7 +42,7 @@ struct CommentWriterView: View {
                 viewModel.cancelOverwriteConfirmation()
             }
             Button("Replace", role: .destructive) {
-                guard !viewModel.usesLiveAI || requirePremiumAccess() else { return }
+                guard requirePremiumAccess() else { return }
                 Task { await viewModel.confirmOverwriteAndGenerate() }
             }
         } message: {
@@ -125,7 +125,7 @@ struct CommentWriterView: View {
             .disabled(!viewModel.canExport)
 
             Button {
-                guard !viewModel.usesLiveAI || requirePremiumAccess() else { return }
+                guard requirePremiumAccess() else { return }
                 Task { await viewModel.generateComment() }
             } label: {
                 HStack(spacing: 6) {

+ 19 - 5
Reddit App/Views/FrontPageView.swift

@@ -28,12 +28,12 @@ struct FrontPageView: View {
 
                 mainContent
                     .frame(maxWidth: .infinity, maxHeight: .infinity)
-                    .environment(\.requirePremiumAccess, {
-                        if subscriptions.hasPremiumAccess { return true }
-                        viewModel.showPaywall()
-                        return false
-                    })
             }
+            .environment(\.requirePremiumAccess, {
+                if subscriptions.hasPremiumAccess { return true }
+                viewModel.showPaywall()
+                return false
+            })
 
             if viewModel.isPaywallPresented {
                 PaywallView(viewModel: paywallViewModel) {
@@ -52,15 +52,22 @@ struct FrontPageView: View {
             }
             syncToolPremiumAccess()
             appRating.updatePremiumStatus(hasPremium)
+            if subscriptions.hasResolvedPremiumStatus {
+                configureRedditAccessForPremiumStatus()
+            }
         }
         .onChange(of: subscriptions.hasResolvedPremiumStatus) { _, resolved in
             if resolved {
                 syncToolPremiumAccess()
+                configureRedditAccessForPremiumStatus()
             }
         }
         .onAppear {
             syncToolPremiumAccess()
             appRating.updatePremiumStatus(subscriptions.hasPremiumAccess)
+            if subscriptions.hasResolvedPremiumStatus {
+                configureRedditAccessForPremiumStatus()
+            }
         }
         .frame(minWidth: AppWindow.minWidth, minHeight: AppWindow.minHeight)
         .background(AppTheme.background)
@@ -160,6 +167,13 @@ struct FrontPageView: View {
         commentWriterViewModel.setPremiumAccess(hasPremium)
     }
 
+    private func configureRedditAccessForPremiumStatus() {
+        if !subscriptions.hasPremiumAccess, viewModel.isRedditActive {
+            viewModel.isRedditActive = false
+            viewModel.selectNavItem(FrontPageViewModel.postGeneratorItem)
+        }
+    }
+
     private func openHistoryEntry(_ entry: AIHistoryEntry) {
         switch entry.toolKind {
         case .postGenerator:

+ 2 - 2
Reddit App/Views/PostGeneratorView.swift

@@ -57,7 +57,7 @@ struct PostGeneratorView: View {
                 viewModel.cancelOverwriteConfirmation()
             }
             Button("Replace", role: .destructive) {
-                guard !viewModel.usesLiveAI || requirePremiumAccess() else { return }
+                guard requirePremiumAccess() else { return }
                 Task { await viewModel.confirmOverwriteAndGenerate() }
             }
         } message: {
@@ -142,7 +142,7 @@ struct PostGeneratorView: View {
             .disabled(!viewModel.canExport)
 
             Button {
-                guard !viewModel.usesLiveAI || requirePremiumAccess() else { return }
+                guard requirePremiumAccess() else { return }
                 Task { await viewModel.generatePost() }
             } label: {
                 HStack(spacing: 6) {

+ 2 - 0
Reddit App/Views/SidebarView.swift

@@ -1,6 +1,7 @@
 import SwiftUI
 
 struct SidebarView: View {
+    @Environment(\.requirePremiumAccess) private var requirePremiumAccess
     @Bindable var viewModel: FrontPageViewModel
     var isPremium: Bool
 
@@ -54,6 +55,7 @@ struct SidebarView: View {
             VStack(alignment: .leading, spacing: AppTheme.sidebarSectionSpacing) {
                 sidebarSection(title: SidebarSection.quickAccess.rawValue) {
                     SidebarQuickAccessItemView(isSelected: viewModel.isRedditActive) {
+                        guard requirePremiumAccess() else { return }
                         viewModel.openReddit()
                     }
                 }

+ 1 - 1
Reddit App/Views/TitleOptimizerView.swift

@@ -107,7 +107,7 @@ struct TitleOptimizerView: View {
             .disabled(viewModel.activeTitle.trimmingCharacters(in: .whitespaces).isEmpty)
 
             Button {
-                guard !viewModel.usesLiveAI || requirePremiumAccess() else { return }
+                guard requirePremiumAccess() else { return }
                 Task { await viewModel.optimizeTitles() }
             } label: {
                 HStack(spacing: 6) {