summaryrefslogtreecommitdiff
path: root/Rune/App/RuneApp.swift
blob: 8c63dd6921be3feda14fba03667ff30a0fd3de4f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import SwiftUI

@main
struct RuneApp: App {
    var body: some Scene {
        WindowGroup {
            RootView()
        }
    }
}

private struct RootView: View {
    @StateObject private var settingsViewModel = SettingsViewModel()
    @StateObject private var domainViewModel = DomainViewModel()
    @StateObject private var tokenViewModel = TokenViewModel()
    @State private var selectedTab = 0

    var body: some View {
        TabView(selection: $selectedTab) {
            DomainListView(viewModel: domainViewModel, client: settingsViewModel.client)
                .tabItem {
                    Label("Domains", systemImage: "globe")
                }
                .tag(0)

            TokenListView(viewModel: tokenViewModel, client: settingsViewModel.client) { deletedTokenKey in
                do {
                    let didLogout = try settingsViewModel.logoutIfCurrentTokenDeleted(deletedTokenKey)
                    if didLogout {
                        selectedTab = 0
                    }
                } catch {
                    settingsViewModel.errorMessage = error.localizedDescription
                }
            }
                .tabItem {
                    Label("Tokens", systemImage: "key.horizontal")
                }
                .tag(1)

            SettingsView(viewModel: settingsViewModel) {
                domainViewModel.reset()
                tokenViewModel.reset()
                selectedTab = 0
            }
            .tabItem {
                Label("Settings", systemImage: "gearshape")
            }
            .tag(2)
        }
        .task {
            await settingsViewModel.bootstrap()
        }
        .task(id: settingsViewModel.isAuthenticated) {
            guard let client = settingsViewModel.client else {
                domainViewModel.reset()
                tokenViewModel.reset()
                selectedTab = 0
                return
            }

            await domainViewModel.loadDomains(client: client)
            await tokenViewModel.loadTokens(client: client)
        }
        .fullScreenCover(isPresented: onboardingBinding) {
            OnboardingView(viewModel: settingsViewModel)
        }
    }

    private var onboardingBinding: Binding<Bool> {
        Binding(
            get: { settingsViewModel.requiresOnboarding },
            set: { _ in }
        )
    }
}