// // ServerListSettingsView.swift // QueueCube // // Created by James Magahern on 6/10/25. // import SwiftUI struct ServerListSettingsView: View { @State var model = ViewModel() var body: some View { VStack { if model.configuredServers.isEmpty { contentPlaceholderView(title: .noServersConfigured, systemImage: "server.rack") { Button { model.isAddServerPresented = true } label: { Text(.addServer) } } } else { Form { List($model.configuredServers, editActions: [.delete]) { server in serverListItem(server.wrappedValue) .tag(server.id) } } } } .navigationTitle(.servers) .toolbar { Button { model.isAddServerPresented = true } label: { Image(systemName: "plus") } } .sheet(isPresented: $model.isAddServerPresented) { NavigationView { AddServerView(onAddServer: { model.onAddServer(server: $0) }) .navigationTitle(.addServer) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItemGroup(placement: .cancellationAction) { Button(.cancel) { model.isAddServerPresented = false } } } } } } @ViewBuilder func serverListItem(_ server: Server) -> some View { HStack { Image(systemName: "hifispeaker.fill") VStack(alignment: .leading) { Text(server.displayName) .lineLimit(1) .bold() Text(server.baseURL.absoluteString) .foregroundStyle(.secondary) .font(.caption) } Spacer() } } // MARK: - Types @Observable class ViewModel { var configuredServers: [Server] var isAddServerPresented = false var selectedItems: [Server.ID] = [] init() { 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 = configuredServers + [ server ] saveToSettings() } func saveToSettings() { Settings .fromDefaults() .configuredServers(configuredServers) .save() } } }