42 lines
1.7 KiB
Swift
42 lines
1.7 KiB
Swift
import SwiftUI
|
|
|
|
struct IOSProjectsView: View {
|
|
@EnvironmentObject private var appState: AppState
|
|
@State private var searchText = ""
|
|
|
|
private var filtered: [ProjectSnapshot] {
|
|
guard !searchText.isEmpty else { return appState.projects }
|
|
return appState.projects.filter {
|
|
$0.project.name.localizedCaseInsensitiveContains(searchText) ||
|
|
$0.project.key.localizedCaseInsensitiveContains(searchText)
|
|
}
|
|
}
|
|
|
|
var body: some View {
|
|
NavigationStack {
|
|
List(filtered) { snapshot in
|
|
NavigationLink {
|
|
IOSProjectDetailView(snapshot: snapshot)
|
|
} label: {
|
|
HStack(spacing: 12) {
|
|
Image(systemName: snapshot.qualityGate.uppercased() == "OK" ? "checkmark.circle.fill" : "xmark.octagon.fill")
|
|
.foregroundStyle(snapshot.qualityGate.uppercased() == "OK" ? .green : .red)
|
|
VStack(alignment: .leading, spacing: 3) {
|
|
Text(snapshot.project.name).fontWeight(.semibold)
|
|
Text(snapshot.project.key).font(.caption).foregroundStyle(.secondary)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.navigationTitle("Projects")
|
|
.searchable(text: $searchText, prompt: "Search projects")
|
|
.refreshable { await appState.refresh() }
|
|
.overlay {
|
|
if appState.projects.isEmpty && !appState.isLoading {
|
|
ContentUnavailableView("No Projects", systemImage: "square.stack.3d.up", description: Text(appState.errorMessage ?? "No SonarQube projects are available."))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|