Sesame-iOS/Sesame/SettingsView.swift
2024-04-22 12:58:49 +02:00

101 lines
3.7 KiB
Swift

import SwiftUI
import SwiftData
import SFSafeSymbols
import Combine
struct SettingsView: View {
let keyManager: KeyManagement
@ObservedObject
var coordinator: RequestCoordinator
@Binding
var serverAddress: String
@Binding
var localAddress: String
@Binding
var localPort: UInt16
@State
private var localPortString = ""
var body: some View {
NavigationView {
ScrollView {
VStack(alignment: .leading, spacing: 8) {
VStack(alignment: .leading) {
Text("Server address")
.bold()
TextField("Server address", text: $serverAddress)
.foregroundColor(.secondary)
.padding(.leading, 8)
HStack {
Button("Test") {
coordinator.checkConnection(using: .throughServer)
}.padding(8)
if coordinator.state == .deviceAvailable {
Image(systemSymbol: .checkmarkCircle)
.foregroundColor(.green)
} else if coordinator.state != .notChecked {
Text(coordinator.state.description)
.font(.caption)
.foregroundStyle(.secondary)
}
}
}.padding(.vertical, 8)
VStack(alignment: .leading) {
Text("Local address")
.bold()
TextField("Local address", text: $localAddress)
.foregroundColor(.secondary)
.padding(.leading, 8)
TextField("UDP Port", text: $localPortString)
.keyboardType(.numberPad)
.onReceive(Just(localPortString)) { newValue in
let filtered = newValue.filter { "0123456789".contains($0) }
if filtered != newValue {
self.localPortString = filtered
if let value = UInt16(filtered) {
self.localPort = value
}
}
}
.foregroundColor(.secondary)
.padding(.leading, 8)
}.padding(.vertical, 8)
ForEach(KeyManagement.KeyType.allCases) { keyType in
SingleKeyView(
keyManager: keyManager,
type: keyType)
}
}.padding()
}.onAppear {
self.localPortString = "\(localPort)"
}
.navigationTitle("Settings")
}
}
}
#Preview {
do {
let config = ModelConfiguration(isStoredInMemoryOnly: true)
let container = try ModelContainer(for: HistoryItem.self, configurations: config)
let item = HistoryItem.mock
container.mainContext.insert(item)
try container.mainContext.save()
return SettingsView(
keyManager: KeyManagement(),
coordinator: .init(modelContext: container.mainContext),
serverAddress: .constant("https://example.com"),
localAddress: .constant("192.168.178.42"),
localPort: .constant(1234))
} catch {
fatalError("Failed to create model container.")
}
}