diff --git a/QueueCube/Backend/Settings.swift b/QueueCube/Backend/Settings.swift index 2d3a767..a011233 100644 --- a/QueueCube/Backend/Settings.swift +++ b/QueueCube/Backend/Settings.swift @@ -11,6 +11,12 @@ struct Settings { var configuredServers: [Server] + func configuredServers(_ servers: [Server]) -> Self { + var copy = self + copy.configuredServers = servers + return copy + } + var isConfigured: Bool { !configuredServers.isEmpty } @@ -41,12 +47,6 @@ struct Settings { case configuredServers } - - struct Server: Codable - { - let address: String - let port: UInt32 - } } extension Notification.Name diff --git a/QueueCube/Views/Settings View/AddServerView.swift b/QueueCube/Views/Settings View/AddServerView.swift index ecbc2f6..7ff5eb5 100644 --- a/QueueCube/Views/Settings View/AddServerView.swift +++ b/QueueCube/Views/Settings View/AddServerView.swift @@ -227,10 +227,14 @@ struct DiscoveredEndpoint: Identifiable } else { continuation.resume(throwing: Self.Error.endpointIncorrect) } + + connection.cancel() case .cancelled: - continuation.resume(throwing: Self.Error.cancelledConnection) + // expected + break case .failed(let error): continuation.resume(throwing: error) + connection.cancel() default: break } diff --git a/QueueCube/Views/Settings View/ServerListSettingsView.swift b/QueueCube/Views/Settings View/ServerListSettingsView.swift index 99c2da5..867679c 100644 --- a/QueueCube/Views/Settings View/ServerListSettingsView.swift +++ b/QueueCube/Views/Settings View/ServerListSettingsView.swift @@ -23,8 +23,9 @@ struct ServerListSettingsView: View } } else { Form { - List(model.configuredServers) { server in - serverListItem(server) + List($model.configuredServers, editActions: [.delete]) { server in + serverListItem(server.wrappedValue) + .tag(server.id) } } } @@ -81,14 +82,39 @@ struct ServerListSettingsView: View { var configuredServers: [Server] var isAddServerPresented = false + var selectedItems: [Server.ID] = [] init() { - self.configuredServers = [] + self.configuredServers = Settings + .fromDefaults() + .configuredServers + + observeForChanges() + } + + func observeForChanges() { + withObservationTracking { + _ = configuredServers + } onChange: { + Task { @MainActor [weak self] in + guard let self else { return } + saveToSettings() + observeForChanges() + } + } } func onAddServer(server: Server) { isAddServerPresented = false - configuredServers.append(server) + configuredServers = configuredServers + [ server ] + saveToSettings() + } + + func saveToSettings() { + Settings + .fromDefaults() + .configuredServers(configuredServers) + .save() } } }