krz/domain-dig
an ios app for DNS & SSL analysis
clone: git clone https://gitbay.org/krz/domain-dig.git
v4.4.1: DomainDig/RootTabView.swift · raw
1import SwiftUI
2
3private enum RootTab: Hashable {
4 case dashboard
5 case audit
6 case history
7 case inspect
8 case settings
9}
10
11struct RootTabView: View {
12 @Bindable var viewModel: DomainViewModel
13 @State private var purchaseService = PurchaseService.shared
14 @State private var selectedTab: RootTab = FeatureAccessService.currentTier == .free ? .inspect : .dashboard
15
16 var body: some View {
17 let _ = purchaseService.currentTier
18
19 TabView(selection: $selectedTab) {
20 NavigationStack {
21 DashboardView(viewModel: viewModel)
22 }
23 .tabItem {
24 Label("Dashboard", systemImage: "square.grid.2x2")
25 }
26 .tag(RootTab.dashboard)
27
28 NavigationStack {
29 AuditListView(viewModel: viewModel)
30 }
31 .tabItem {
32 Label("Audit", systemImage: "checklist")
33 }
34 .tag(RootTab.audit)
35
36 NavigationStack {
37 HistoryView(viewModel: viewModel)
38 }
39 .tabItem {
40 Label("History", systemImage: "clock.arrow.trianglehead.counterclockwise.rotate.90")
41 }
42 .tag(RootTab.history)
43
44 ContentView(viewModel: viewModel)
45 .tabItem {
46 Label("Inspect", systemImage: "magnifyingglass")
47 }
48 .tag(RootTab.inspect)
49
50 NavigationStack {
51 SettingsView(viewModel: viewModel)
52 }
53 .tabItem {
54 Label("Settings", systemImage: "gearshape")
55 }
56 .tag(RootTab.settings)
57 }
58 .sheet(isPresented: Binding(
59 get: { viewModel.isPaywallPresented },
60 set: { viewModel.isPaywallPresented = $0 }
61 )) {
62 PaywallView()
63 }
64 .alert(item: Binding(
65 get: { viewModel.upgradePrompt },
66 set: { viewModel.upgradePrompt = $0 }
67 )) { prompt in
68 Alert(
69 title: Text(prompt.title),
70 message: Text(prompt.message),
71 primaryButton: .default(Text("Open Paywall")) {
72 viewModel.upgradePrompt = nil
73 viewModel.isPaywallPresented = true
74 },
75 secondaryButton: .cancel(Text("Continue")) {
76 viewModel.upgradePrompt = nil
77 }
78 )
79 }
80 .onChange(of: purchaseService.currentTier) { _, newValue in
81 if newValue != .free, selectedTab == .inspect, viewModel.trackedDomains.isEmpty == false {
82 selectedTab = .dashboard
83 }
84 }
85 }
86}