90 lines
2.7 KiB
Swift
90 lines
2.7 KiB
Swift
import SwiftUI
|
|
|
|
struct ConnectionView: View {
|
|
var state: AppState
|
|
@State private var addressField: String = ""
|
|
|
|
var body: some View {
|
|
VStack(spacing: 0) {
|
|
header
|
|
Divider()
|
|
connectionForm
|
|
Spacer()
|
|
}
|
|
.navigationTitle("Connection")
|
|
.onAppear { addressField = state.transport.address }
|
|
}
|
|
|
|
// MARK: - Header
|
|
|
|
private var header: some View {
|
|
HStack {
|
|
Circle()
|
|
.fill(statusColor)
|
|
.frame(width: 10, height: 10)
|
|
Text(state.transport.state.rawValue)
|
|
.font(.headline)
|
|
Spacer()
|
|
if state.transport.state == .connected {
|
|
Button("Disconnect") { state.transport.disconnect() }
|
|
.buttonStyle(.bordered)
|
|
.tint(.red)
|
|
} else if state.transport.state == .connecting {
|
|
ProgressView()
|
|
.controlSize(.small)
|
|
} else {
|
|
Button("Connect") { connectToDevice() }
|
|
.buttonStyle(.borderedProminent)
|
|
}
|
|
}
|
|
.padding()
|
|
}
|
|
|
|
private var statusColor: Color {
|
|
switch state.transport.state {
|
|
case .connected: .green
|
|
case .connecting: .yellow
|
|
case .disconnected: .red
|
|
}
|
|
}
|
|
|
|
// MARK: - Connection form
|
|
|
|
private var connectionForm: some View {
|
|
VStack(alignment: .leading, spacing: 16) {
|
|
VStack(alignment: .leading, spacing: 4) {
|
|
Text("Firmware Address")
|
|
.font(.subheadline.weight(.medium))
|
|
.foregroundStyle(.secondary)
|
|
HStack {
|
|
TextField("192.168.4.1", text: $addressField)
|
|
.textFieldStyle(.roundedBorder)
|
|
.autocorrectionDisabled()
|
|
.textInputAutocapitalization(.never)
|
|
.keyboardType(.numbersAndPunctuation)
|
|
Text(":\(state.transport.port)")
|
|
.font(.subheadline.monospacedDigit())
|
|
.foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
|
|
Button("Connect") { connectToDevice() }
|
|
.buttonStyle(.borderedProminent)
|
|
.disabled(state.transport.state == .connecting)
|
|
|
|
Text("Connect to the EIS4 WiFi network, then tap Connect.")
|
|
.font(.caption)
|
|
.foregroundStyle(Color(white: 0.4))
|
|
}
|
|
.padding()
|
|
}
|
|
|
|
private func connectToDevice() {
|
|
let addr = addressField.trimmingCharacters(in: .whitespaces)
|
|
if !addr.isEmpty {
|
|
state.transport.address = addr
|
|
}
|
|
state.transport.connect()
|
|
}
|
|
}
|