SettingsView.swift
2141 bytes
1import SwiftUI
2
3struct SettingsView: View {
4 @ObservedObject var settings: SettingsStore
5
6 @State private var serverURL: String
7 @State private var token: String
8 @State private var errorMessage: String?
9
10 init(settings: SettingsStore) {
11 self.settings = settings
12 _serverURL = State(initialValue: settings.serverURL)
13 _token = State(initialValue: settings.token)
14 }
15
16 var body: some View {
17 Form {
18 Section("Server") {
19 serverURLField
20
21 tokenField
22 }
23
24 Section {
25 Button("Save settings", action: save)
26 .buttonStyle(.glassProminent)
27 } footer: {
28 Text("The app connects only to HTTPS servers. The token is stored in the device keychain.")
29 }
30 }
31 .navigationTitle("Settings")
32 .navigationBarTitleDisplayMode(.inline)
33 .alert(
34 "Could not save settings",
35 isPresented: Binding(
36 get: { errorMessage != nil },
37 set: { if !$0 { errorMessage = nil } }
38 )
39 ) {
40 Button("OK", role: .cancel) {}
41 } message: {
42 Text(errorMessage ?? "")
43 }
44 }
45
46 private var serverURLField: some View {
47 let field = TextField("https://ytrssil.example.com", text: $serverURL)
48
49#if os(iOS)
50 return field
51 .textInputAutocapitalization(.never)
52 .autocorrectionDisabled()
53 .keyboardType(.URL)
54 .textContentType(.URL)
55#else
56 return field
57#endif
58 }
59
60 private var tokenField: some View {
61 let field = SecureField("API token", text: $token)
62
63#if os(iOS)
64 return field
65 .textInputAutocapitalization(.never)
66 .autocorrectionDisabled()
67#else
68 return field
69#endif
70 }
71
72 private func save() {
73 do {
74 try settings.save(serverURL: serverURL, token: token)
75 serverURL = settings.serverURL
76 token = settings.token
77 } catch {
78 errorMessage = error.localizedDescription
79 }
80 }
81}