Parent directory

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}