import SwiftUI /// `build log` — plain text, can be large. Monospaced, both-axis scroll. struct BuildLogView: View { private let client: GitbayClient private let repo: String private let number: Int64 @State private var state: LoadState = .loading init(client: GitbayClient, repo: String, number: Int64) { self.client = client self.repo = repo self.number = number } var body: some View { ZStack { Color.clear if let log = state.value { if log.isEmpty { ContentUnavailableView { Label("No log yet", systemImage: "doc.text") } } else { ScrollView([.horizontal, .vertical]) { Text(log) .font(.gbMono(.caption2)) .frame(maxWidth: .infinity, alignment: .leading) .padding(12) .textSelection(.enabled) } } } } .overlay { LoadStateOverlay(state: state) } .navigationTitle("Build #\(number)") .navigationBarTitleDisplayMode(.inline) .task { do { state = .loaded(try await client.readText(["build", "log", repo, String(number)])) } catch { state = .from(error) } } .refreshable { state = .loading do { state = .loaded(try await client.readText(["build", "log", repo, String(number)])) } catch { state = .from(error) } } } }