burrow/Apple/App/TunnelButton.swift
2024-03-09 15:54:58 -08:00

61 lines
1.3 KiB
Swift

import SwiftUI
struct TunnelButton: View {
@Environment(\.tunnel)
var tunnel: any Tunnel
var body: some View {
if let action = tunnel.action {
Button {
tunnel.perform(action)
} label: {
Text(action.description)
}
.padding(.horizontal)
.buttonStyle(.floating)
}
}
}
extension Tunnel {
fileprivate var action: TunnelButton.Action? {
switch status {
case .permissionRequired, .invalid:
.enable
case .disabled, .disconnecting, .disconnected:
.start
case .connecting, .connected, .reasserting:
.stop
case .unknown, .configurationReadWriteFailed:
nil
}
}
}
extension TunnelButton {
fileprivate enum Action {
case enable
case start
case stop
}
}
extension TunnelButton.Action {
var description: LocalizedStringKey {
switch self {
case .enable: "Enable"
case .start: "Start"
case .stop: "Stop"
}
}
}
extension Tunnel {
fileprivate func perform(_ action: TunnelButton.Action) {
switch action {
case .enable: enable()
case .start: start()
case .stop: stop()
}
}
}