New low-level recorder targeting devices directly. Includes device switching during recording, enhanced logging (transport type, format, buffer), and log export feature.
76 lines
2.4 KiB
Swift
76 lines
2.4 KiB
Swift
import SwiftUI
|
|
|
|
struct DiagnosticsSettingsView: View {
|
|
@State private var isExportingLogs = false
|
|
@State private var exportedLogURL: URL?
|
|
@State private var showLogExportError = false
|
|
@State private var logExportError: String = ""
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading, spacing: 12) {
|
|
Text("Export logs to help troubleshoot issues.")
|
|
.settingsDescription()
|
|
|
|
HStack(spacing: 12) {
|
|
Button {
|
|
exportDiagnosticLogs()
|
|
} label: {
|
|
HStack {
|
|
if isExportingLogs {
|
|
ProgressView()
|
|
.controlSize(.small)
|
|
} else {
|
|
Image(systemName: "doc.text.magnifyingglass")
|
|
}
|
|
Text("Export Diagnostic Logs")
|
|
}
|
|
.frame(maxWidth: .infinity)
|
|
}
|
|
.controlSize(.large)
|
|
.disabled(isExportingLogs)
|
|
|
|
if let url = exportedLogURL {
|
|
Button {
|
|
NSWorkspace.shared.activateFileViewerSelecting([url])
|
|
} label: {
|
|
Label("Show in Finder", systemImage: "folder")
|
|
}
|
|
.controlSize(.large)
|
|
}
|
|
}
|
|
|
|
if exportedLogURL != nil {
|
|
Text("Logs exported to Downloads folder.")
|
|
.font(.caption)
|
|
.foregroundColor(.green)
|
|
}
|
|
}
|
|
.alert("Export Failed", isPresented: $showLogExportError) {
|
|
Button("OK", role: .cancel) { }
|
|
} message: {
|
|
Text(logExportError)
|
|
}
|
|
}
|
|
|
|
private func exportDiagnosticLogs() {
|
|
isExportingLogs = true
|
|
exportedLogURL = nil
|
|
|
|
Task {
|
|
do {
|
|
let url = try await LogExporter.shared.exportLogs()
|
|
await MainActor.run {
|
|
exportedLogURL = url
|
|
isExportingLogs = false
|
|
}
|
|
} catch {
|
|
await MainActor.run {
|
|
logExportError = error.localizedDescription
|
|
showLogExportError = true
|
|
isExportingLogs = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|