| import SwiftUI |
| import UIKit |
|
|
| struct GatewayDiscoveryDebugLogView: View { |
| @Environment(GatewayConnectionController.self) private var gatewayController |
| @AppStorage("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) |
| } |
| } |
|
|