-
Notifications
You must be signed in to change notification settings - Fork 386
/
Copy pathButtonPanel.swift
90 lines (83 loc) · 3.31 KB
/
ButtonPanel.swift
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
//
// ButtonPanel.swift
// MullvadVPN
//
// Created by Andrew Bulhak on 2025-01-03.
// Copyright © 2025 Mullvad VPN AB. All rights reserved.
//
import SwiftUI
extension ConnectionView {
internal struct ButtonPanel: View {
typealias Action = (ConnectionViewViewModel.TunnelAction) -> Void
@ObservedObject var viewModel: ConnectionViewViewModel
var action: Action?
var body: some View {
VStack(spacing: 16) {
locationButton(with: action)
.disabled(viewModel.disableButtons)
actionButton(with: action)
.disabled(viewModel.disableButtons)
}
}
@ViewBuilder
private func locationButton(with action: Action?) -> some View {
switch viewModel.tunnelStatus.state {
case .connecting, .connected, .reconnecting, .waitingForConnectivity, .negotiatingEphemeralPeer, .error:
SplitMainButton(
text: viewModel.localizedTitleForSelectLocationButton,
image: .iconReload,
style: .default,
accessibilityId: .selectLocationButton,
primaryAction: { action?(.selectLocation) },
secondaryAction: { action?(.reconnect) }
)
case .disconnecting, .pendingReconnect, .disconnected:
MainButton(
text: viewModel.localizedTitleForSelectLocationButton,
style: .default,
action: { action?(.selectLocation) }
)
.accessibilityIdentifier(AccessibilityIdentifier.selectLocationButton.asString)
}
}
@ViewBuilder
private func actionButton(with action: Action?) -> some View {
switch viewModel.actionButton {
case .connect:
MainButton(
text: LocalizedStringKey("Connect"),
style: .success,
action: { action?(.connect) }
)
.accessibilityIdentifier(AccessibilityIdentifier.connectButton.asString)
case .disconnect:
MainButton(
text: LocalizedStringKey("Disconnect"),
style: .danger,
action: { action?(.disconnect) }
)
.accessibilityIdentifier(AccessibilityIdentifier.disconnectButton.asString)
case .cancel:
MainButton(
text: LocalizedStringKey(
viewModel.tunnelStatus.state == .waitingForConnectivity(.noConnection)
? "Disconnect"
: "Cancel"
),
style: .danger,
action: { action?(.cancel) }
)
.accessibilityIdentifier(
viewModel.tunnelStatus.state == .waitingForConnectivity(.noConnection)
? AccessibilityIdentifier.disconnectButton.asString
: AccessibilityIdentifier.cancelButton.asString
)
}
}
}
}
#Preview {
ConnectionViewComponentPreview(showIndicators: true) { _, vm, _ in
ConnectionView.ButtonPanel(viewModel: vm, action: nil)
}
}