Files
simplex-chat/apps/ios/Shared/Views/UserSettings/SMPServerView.swift
Evgeny Poberezkin 491fe4a9bf core, ios: advanced server config (#1371)
* ios: advanced server config

* simplify UI

* core: ServerCfg

* commit migration, update schema

* add preset servers to response

* return default servers if none saved

* fix test
2022-11-16 15:37:20 +00:00

106 lines
2.8 KiB
Swift

//
// SMPServerView.swift
// SimpleX (iOS)
//
// Created by Evgeny on 15/11/2022.
// Copyright © 2022 SimpleX Chat. All rights reserved.
//
import SwiftUI
import SimpleXChat
struct SMPServerView: View {
@State var server: ServerCfg
var body: some View {
if server.preset {
presetServer()
} else {
customServer()
}
}
private func presetServer() -> some View {
return VStack {
List {
Section("Preset server address") {
Text(server.server)
}
useServerSection()
}
}
}
private func customServer() -> some View {
VStack {
List {
Section("Your server address") {
TextEditor(text: $server.server)
.multilineTextAlignment(.leading)
.autocorrectionDisabled(true)
.autocapitalization(.none)
.lineLimit(10)
.frame(height: 108)
.padding(-6)
}
useServerSection()
Section("Add to another device") {
QRCode(uri: server.server)
.listRowInsets(EdgeInsets(top: 12, leading: 12, bottom: 12, trailing: 12))
}
}
}
}
private func useServerSection() -> some View {
Section("Use server") {
HStack {
Button("Test server") {
Task { await testServerConnection(server: $server) }
}
Spacer()
showTestStatus(server: server)
}
Toggle("Enabled", isOn: $server.enabled)
Button("Remove server", role: .destructive) {
}
}
}
}
@ViewBuilder func showTestStatus(server: ServerCfg) -> some View {
switch server.tested {
case .some(true):
Image(systemName: "checkmark")
.foregroundColor(.green)
case .some(false):
Image(systemName: "multiply")
.foregroundColor(.red)
case .none:
Color.clear
}
}
func testServerConnection(server: Binding<ServerCfg>) async {
do {
let r = try await testSMPServer(smpServer: server.wrappedValue.server)
await MainActor.run {
switch r {
case .success: server.wrappedValue.tested = true
case .failure: server.wrappedValue.tested = false
}
}
} catch let error {
await MainActor.run {
server.wrappedValue.tested = false
}
}
}
struct SMPServerView_Previews: PreviewProvider {
static var previews: some View {
SMPServerView(server: ServerCfg.sampleData.custom)
}
}