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}