Spaces:
Paused
Paused
| import SwiftUI | |
| import UIKit | |
| struct GatewayDiscoveryDebugLogView: View { | |
| (GatewayConnectionController.self) private var gatewayController | |
| ("gateway.discovery.debugLogs") private var debugLogsEnabled: Bool = false | |
| var body: some View { | |
| List { | |
| if !self.debugLogsEnabled { | |
| Text("Enable “Discovery Debug Logs” to start collecting events.") | |
| .foregroundStyle(.secondary) | |
| } | |
| if self.gatewayController.discoveryDebugLog.isEmpty { | |
| Text("No log entries yet.") | |
| .foregroundStyle(.secondary) | |
| } else { | |
| ForEach(self.gatewayController.discoveryDebugLog) { entry in | |
| VStack(alignment: .leading, spacing: 2) { | |
| Text(Self.formatTime(entry.ts)) | |
| .font(.caption) | |
| .foregroundStyle(.secondary) | |
| Text(entry.message) | |
| .font(.callout) | |
| .textSelection(.enabled) | |
| } | |
| .padding(.vertical, 4) | |
| } | |
| } | |
| } | |
| .navigationTitle("Discovery Logs") | |
| .toolbar { | |
| ToolbarItem(placement: .topBarTrailing) { | |
| Button("Copy") { | |
| UIPasteboard.general.string = self.formattedLog() | |
| } | |
| .disabled(self.gatewayController.discoveryDebugLog.isEmpty) | |
| } | |
| } | |
| } | |
| private func formattedLog() -> String { | |
| self.gatewayController.discoveryDebugLog | |
| .map { "\(Self.formatISO($0.ts)) \($0.message)" } | |
| .joined(separator: "\n") | |
| } | |
| private static let timeFormatter: DateFormatter = { | |
| let formatter = DateFormatter() | |
| formatter.dateFormat = "HH:mm:ss" | |
| return formatter | |
| }() | |
| private static let isoFormatter: ISO8601DateFormatter = { | |
| let formatter = ISO8601DateFormatter() | |
| formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] | |
| return formatter | |
| }() | |
| private static func formatTime(_ date: Date) -> String { | |
| self.timeFormatter.string(from: date) | |
| } | |
| private static func formatISO(_ date: Date) -> String { | |
| self.isoFormatter.string(from: date) | |
| } | |
| } | |