mirror of
https://github.com/kean/Pulse.git
synced 2026-05-30 21:07:33 +00:00
99 lines
2.8 KiB
Swift
99 lines
2.8 KiB
Swift
// The MIT License (MIT)
|
||
//
|
||
// Copyright (c) 2020–2022 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
|