import SwiftUI /// Displays a Gitea Actions job's raw log text, with a share button. struct JobLogsView: View { let repo: Repository let runID: Int64 let jobID: Int64 let jobName: String @State private var text = "" @State private var isLoading = true @State private var errorMessage: String? @State private var showShare = false var body: some View { Group { if isLoading { ProgressView("Loading logs…") } else if let errorMessage { ContentUnavailableView( "Couldn't load logs", systemImage: "doc.text", description: Text(errorMessage)) } else { ScrollView { Text(text) .font(.caption.monospaced()) .frame(maxWidth: .infinity, alignment: .leading) .textSelection(.enabled) .padding() } } } .navigationTitle(jobName) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .primaryAction) { Button { showShare = true } label: { Image(systemName: "square.and.arrow.up") } .disabled(text.isEmpty) } } .sheet(isPresented: $showShare) { ShareSheet(text: text) } .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 { text = try await client.jobLogs(owner: repo.owner.login, repo: repo.name, jobID: jobID) } catch { errorMessage = error.localizedDescription } } }