diff options
| author | Christian Cleberg <[email protected]> | 2026-04-22 12:39:23 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-04-22 12:39:23 -0500 |
| commit | dcf4135ec376d357b8fafc0101a75b674e76329a (patch) | |
| tree | 498e0782b34778b6f6d871d2adc230437fe77904 /DomainDig/DomainViewModel.swift | |
| parent | 37b02e5ee360d61751951b77b7b556165a3af1fc (diff) | |
| download | domain-dig-dcf4135ec376d357b8fafc0101a75b674e76329a.tar.gz domain-dig-dcf4135ec376d357b8fafc0101a75b674e76329a.tar.bz2 domain-dig-dcf4135ec376d357b8fafc0101a75b674e76329a.zip | |
feat(v3.1.0): add StoreKit integration and Pro tier
• implement PurchaseService using StoreKit 2
• activate feature tiers based on entitlement
• add minimal paywall and restore flow
• enforce free-tier limits with upgrade paths
• integrate Pro status into settings
• ensure clean and non-intrusive monetization flow
Diffstat (limited to 'DomainDig/DomainViewModel.swift')
| -rw-r--r-- | DomainDig/DomainViewModel.swift | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/DomainDig/DomainViewModel.swift b/DomainDig/DomainViewModel.swift index 5288eaa..6ec7e64 100644 --- a/DomainDig/DomainViewModel.swift +++ b/DomainDig/DomainViewModel.swift @@ -226,6 +226,8 @@ final class DomainViewModel { var watchlistSearchText = "" var watchlistFilter: WatchlistFilterOption = .all var watchlistSortOption: WatchlistSortOption = .pinned + var upgradePrompt: UpgradePromptContext? + var isPaywallPresented = false var trimmedDomain: String { domain @@ -578,6 +580,7 @@ final class DomainViewModel { } guard PremiumAccessService.canAddTrackedDomain(currentCount: trackedDomains.count) else { + upgradePrompt = FeatureAccessService.upgradePromptForTrackedDomains(currentCount: trackedDomains.count) return false } @@ -737,12 +740,18 @@ final class DomainViewModel { func runBulkLookup() { let domains = parsedDomains(from: bulkInput) guard !domains.isEmpty else { return } - guard FeatureAccessService.canRunBatch(domainCount: domains.count) else { return } + guard FeatureAccessService.canRunBatch(domainCount: domains.count) else { + upgradePrompt = FeatureAccessService.upgradePromptForBatch(domainCount: domains.count) + return + } startBatchLookup(domains: domains, source: .manual) } func refreshAllTrackedDomains() { - guard FeatureAccessService.canRunBatch(domainCount: sortedTrackedDomains.count) else { return } + guard FeatureAccessService.canRunBatch(domainCount: sortedTrackedDomains.count) else { + upgradePrompt = FeatureAccessService.upgradePromptForBatch(domainCount: sortedTrackedDomains.count) + return + } startBatchLookup(domains: sortedTrackedDomains.map(\.domain), source: .watchlistRefresh) } @@ -791,7 +800,10 @@ final class DomainViewModel { let normalizedDomains = normalizedDomains(domains) let trimmedName = name.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmedName.isEmpty, !normalizedDomains.isEmpty else { return nil } - guard FeatureAccessService.canCreateWorkflow(currentCount: workflows.count) else { return nil } + guard FeatureAccessService.canCreateWorkflow(currentCount: workflows.count) else { + upgradePrompt = FeatureAccessService.upgradePromptForWorkflows(currentCount: workflows.count) + return nil + } let workflow = DomainWorkflow( name: trimmedName, @@ -855,7 +867,10 @@ final class DomainViewModel { func runWorkflow(_ workflow: DomainWorkflow) { guard !workflow.domains.isEmpty else { return } - guard FeatureAccessService.canRunBatch(domainCount: workflow.domains.count) else { return } + guard FeatureAccessService.canRunBatch(domainCount: workflow.domains.count) else { + upgradePrompt = FeatureAccessService.upgradePromptForBatch(domainCount: workflow.domains.count) + return + } startBatchLookup(domains: workflow.domains, source: .workflow, workflow: workflow) } |
