From dcf4135ec376d357b8fafc0101a75b674e76329a Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Wed, 22 Apr 2026 12:39:23 -0500 Subject: feat(v3​.1​.0): add ​Store​Kit integration and ​Pro tier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • implement Purchase​Service 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 --- DomainDig/WorkflowsView.swift | 53 +++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 25 deletions(-) (limited to 'DomainDig/WorkflowsView.swift') diff --git a/DomainDig/WorkflowsView.swift b/DomainDig/WorkflowsView.swift index 9d99b02..5025a0b 100644 --- a/DomainDig/WorkflowsView.swift +++ b/DomainDig/WorkflowsView.swift @@ -10,24 +10,24 @@ private enum WorkflowDestinationMode: String, CaseIterable, Identifiable { struct WorkflowsView: View { @Environment(\.appDensity) private var appDensity @Bindable var viewModel: DomainViewModel + @State private var purchaseService = PurchaseService.shared @State private var showingCreateWorkflow = false var body: some View { + let _ = purchaseService.currentTier + List { - if FeatureAccessService.hasAccess(to: .workflows) { - workflowContent - } else { + if let limitMessage = FeatureAccessService.workflowAllowanceSummary(currentCount: viewModel.workflows.count) { Section { - EmptyStateCardView( - title: "Workflows", - message: "Reusable workflow sets are scaffolded for this release and will unlock with Pro.", - suggestion: FeatureAccessService.upgradeMessage(for: .workflows), - systemImage: "square.stack.3d.down.right" - ) + Text(limitMessage) + .font(appDensity.font(.caption)) + .foregroundStyle(.secondary) } .listRowBackground(Color(.systemGray6).opacity(0.5)) } + + workflowContent } .scrollContentBackground(.hidden) .background(Color.black) @@ -36,17 +36,15 @@ struct WorkflowsView: View { } .navigationTitle("Workflows") .toolbar { - if FeatureAccessService.hasAccess(to: .workflows) { - ToolbarItemGroup(placement: .topBarTrailing) { - Button { - showingCreateWorkflow = true - } label: { - Image(systemName: "plus.circle") - } + ToolbarItemGroup(placement: .topBarTrailing) { + Button { + showingCreateWorkflow = true + } label: { + Image(systemName: "plus.circle") + } - if !viewModel.workflows.isEmpty { - EditButton() - } + if !viewModel.workflows.isEmpty { + EditButton() } } } @@ -429,10 +427,13 @@ struct WorkflowComposerView: View { private func saveWorkflow() { if let workflow { viewModel.updateWorkflow(workflow, name: name, domains: parsedDomains, notes: notes) - } else { - _ = viewModel.createWorkflow(name: name, domains: parsedDomains, notes: notes) + dismiss() + return + } + + if viewModel.createWorkflow(name: name, domains: parsedDomains, notes: notes) != nil { + dismiss() } - dismiss() } } @@ -678,10 +679,12 @@ struct WorkflowBulkAddSheet: View { case .existing: guard let selectedWorkflowID, let workflow = viewModel.workflow(withID: selectedWorkflowID) else { return } viewModel.addDomains(selectedDomainList, to: workflow) + dismiss() case .new: - _ = viewModel.createWorkflow(name: newWorkflowName, domains: selectedDomainList, notes: newWorkflowNotes) + guard viewModel.createWorkflow(name: newWorkflowName, domains: selectedDomainList, notes: newWorkflowNotes) != nil else { + return + } + dismiss() } - - dismiss() } } -- cgit v1.2.3