Ver Fonte

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 há 1 mês atrás
pai
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 static let redditHomeURL = URL(string: "https://www.reddit.com")!
 
 
     private(set) var redditLoadURL = redditHomeURL
     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 isSettingsActive = false
     var isHistoryActive = false
     var isHistoryActive = false
     var isPaywallPresented = false
     var isPaywallPresented = false
@@ -88,7 +93,7 @@ final class FrontPageViewModel {
     }
     }
 
 
     let createItems: [SidebarNavItem] = [
     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: "Title Optimizer", subtitle: "Create viral titles", iconKind: .titleOptimizer),
         SidebarNavItem(title: "Comment Writer", subtitle: "Write smart replies", iconKind: .commentWriter),
         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()
                 viewModel.cancelOverwriteConfirmation()
             }
             }
             Button("Replace", role: .destructive) {
             Button("Replace", role: .destructive) {
-                guard !viewModel.usesLiveAI || requirePremiumAccess() else { return }
+                guard requirePremiumAccess() else { return }
                 Task { await viewModel.confirmOverwriteAndGenerate() }
                 Task { await viewModel.confirmOverwriteAndGenerate() }
             }
             }
         } message: {
         } message: {
@@ -125,7 +125,7 @@ struct CommentWriterView: View {
             .disabled(!viewModel.canExport)
             .disabled(!viewModel.canExport)
 
 
             Button {
             Button {
-                guard !viewModel.usesLiveAI || requirePremiumAccess() else { return }
+                guard requirePremiumAccess() else { return }
                 Task { await viewModel.generateComment() }
                 Task { await viewModel.generateComment() }
             } label: {
             } label: {
                 HStack(spacing: 6) {
                 HStack(spacing: 6) {

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

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

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

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

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

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

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

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