Files
Pulse/Sources/PulseUI/Features/MessageDetails/ConsoleMessageMetadataView.swift
2022-08-12 19:19:39 -04:00

99 lines
2.8 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// The MIT License (MIT)
//
// Copyright (c) 20202022 Alexander Grebenyuk (github.com/kean).
import SwiftUI
import Pulse
struct ConsoleMessageMetadataView: View {
let message: LoggerMessageEntity
@State private var isMetadataRawLinkActive = false
var body: some View {
contents
.background(links)
#if os(iOS)
.navigationBarTitle("Details", displayMode: .inline)
#endif
}
@ViewBuilder
private var contents: some View {
ScrollView {
#if os(iOS) || os(tvOS) || os(macOS)
VStack(spacing: 16) {
stackContents
}.padding()
#elseif os(watchOS)
VStack(spacing: 16) {
stackContents
}
#endif
}
}
@ViewBuilder
private var stackContents: some View {
KeyValueSectionView(viewModel: .init(title: "Summary", color: message.tintColor, items: [
("Date", dateFormatter.string(from: message.createdAt)),
("Level", LoggerStore.Level(rawValue: message.level)?.name),
("Label", message.label.name.nonEmpty)
]))
KeyValueSectionView(viewModel: .init(title: "Details", color: .secondary, items: [
("Session", message.session.uuidString.nonEmpty),
("File", message.file.nonEmpty),
("Function", message.function.nonEmpty),
("Line", message.line == 0 ? nil : "\(message.line)"),
]))
KeyValueSectionView(viewModel: metadataViewModel)
}
private var metadataViewModel: KeyValueSectionViewModel {
KeyValueSectionViewModel(title: "Metadata", color: .indigo, action: .init(action: {
isMetadataRawLinkActive = true
}, title: "View"), items: metadataItems)
}
private var metadataItems: [(String, String?)] {
message.metadata.sorted(by: { $0.key < $1.key }).map { ($0.key, $0.value )}
}
private var links: some View {
InvisibleNavigationLinks {
NavigationLink.programmatic(isActive: $isMetadataRawLinkActive) {
NetworkHeadersDetailsView(viewModel: metadataViewModel)
}
}
}
}
private extension LoggerMessageEntity {
var tintColor: Color {
Color.badgeColor(for: .init(rawValue: level) ?? .debug)
}
}
private extension String {
var nonEmpty: String? {
isEmpty ? nil : self
}
}
private let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US")
formatter.dateFormat = "HH:mm:ss.SSS, yyyy-MM-dd"
return formatter
}()
#if DEBUG
struct ConsoleMessageMetadataView_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
ConsoleMessageMetadataView(message: makeMockMessage())
}
}
}
#endif