import SwiftUI /// Lets the user pick which repos the inbox monitors. Fetches the accessible /// repos from the API and shows a toggle per repo. Empty selection = monitor /// all. struct MonitoredReposView: View { @Binding var selection: [String] @State private var repos: [Repository] = [] @State private var isLoading = true @State private var errorMessage: String? var body: some View { Group { if isLoading { ProgressView("Loading repos…") } else if let errorMessage { ContentUnavailableView("Couldn't load repos", systemImage: "exclamationmark.triangle", description: Text(errorMessage)) } else { List { Section { Button { selection = [] } label: { HStack { Text("Monitor all repos") Spacer() if selection.isEmpty { Image(systemName: "checkmark") .foregroundColor(.accentColor) } } } } Section("Monitored") { ForEach(repos) { repo in Button { toggle(repo.fullName) } label: { HStack { Text(repo.fullName) .foregroundColor(.primary) Spacer() if selection.contains(repo.fullName) { Image(systemName: "checkmark") .foregroundColor(.accentColor) } } } } } } } } .navigationTitle("Monitored repos") .navigationBarTitleDisplayMode(.inline) .task { await load() } } private func load() async { isLoading = true errorMessage = nil defer { isLoading = false } guard let client = SettingsStore.shared.client() else { errorMessage = "Not configured." return } do { repos = try await client.repos() .sorted { $0.fullName < $1.fullName } } catch { errorMessage = error.localizedDescription } } private func toggle(_ fullName: String) { if selection.contains(fullName) { selection.removeAll { $0 == fullName } } else { selection.append(fullName) } } }