blob: 1709532a11242fd2b2b64ee60566941de8a816b6 (
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
77
78
79
80
81
82
83
|
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()
await syncAuthenticatedState()
}
.onChange(of: settingsViewModel.client) { _, _ in
Task {
await syncAuthenticatedState()
}
}
.fullScreenCover(isPresented: onboardingBinding) {
OnboardingView(viewModel: settingsViewModel)
}
}
private func syncAuthenticatedState() async {
guard let client = settingsViewModel.client else {
domainViewModel.reset()
tokenViewModel.reset()
selectedTab = 0
return
}
await domainViewModel.loadDomains(client: client)
await tokenViewModel.loadTokens(client: client)
}
private var onboardingBinding: Binding<Bool> {
Binding(
get: { settingsViewModel.requiresOnboarding },
set: { _ in }
)
}
}
|