summaryrefslogtreecommitdiff
path: root/Hutch/Views/More/AccountSwitcherView.swift
blob: 6fe3c28fce79c13b4bf82eddadccb3b02f01deee (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
84
85
86
87
88
89
90
91
92
import SwiftUI

struct AccountSwitcherView: View {
    @Environment(AppState.self) private var appState
    @Environment(\.dismiss) private var dismiss

    @State private var showAddAccount = false
    @State private var isSwitching = false
    @State private var switchError: String?

    var body: some View {
        NavigationStack {
            List {
                Section {
                    ForEach(appState.accounts) { account in
                        Button {
                            guard account.id != appState.activeAccountID else { return }
                            switchTo(account)
                        } label: {
                            HStack {
                                Text(account.username)
                                    .foregroundStyle(.primary)
                                Spacer()
                                if account.id == appState.activeAccountID {
                                    Image(systemName: "checkmark")
                                        .foregroundStyle(.tint)
                                }
                            }
                        }
                        .disabled(isSwitching)
                    }
                    .onDelete { indexSet in
                        for index in indexSet {
                            let account = appState.accounts[index]
                            Task { await appState.removeAccount(id: account.id) }
                        }
                    }
                }

                Section {
                    Button {
                        showAddAccount = true
                    } label: {
                        Label("Add Account", systemImage: "plus.circle")
                    }
                    .disabled(isSwitching)
                }
            }
            .navigationTitle("Accounts")
            .navigationBarTitleDisplayMode(.inline)
            .toolbar {
                ToolbarItem(placement: .confirmationAction) {
                    Button("Done") { dismiss() }
                }
            }
            .overlay {
                if isSwitching {
                    ZStack {
                        Color.black.opacity(0.25).ignoresSafeArea()
                        ProgressView("Switching…")
                            .padding()
                            .background(.regularMaterial, in: RoundedRectangle(cornerRadius: 12))
                    }
                }
            }
            .alert("Switch Failed", isPresented: Binding(
                get: { switchError != nil },
                set: { if !$0 { switchError = nil } }
            )) {
                Button("OK") { switchError = nil }
            } message: {
                Text(switchError ?? "")
            }
            .sheet(isPresented: $showAddAccount) {
                AddAccountView()
            }
        }
    }

    private func switchTo(_ account: AccountEntry) {
        isSwitching = true
        Task {
            do {
                try await appState.switchAccount(to: account.id)
                dismiss()
            } catch {
                switchError = error.localizedDescription
            }
            isSwitching = false
        }
    }
}