Files

102 lines
2.7 KiB
Swift

// The MIT License (MIT)
//
// Copyright (c) 2020-2026 Alexander Grebenyuk (github.com/kean).
import SwiftUI
import Pulse
#if os(iOS) || os(tvOS) || os(macOS) || os(watchOS) || os(visionOS)
@available(iOS 18, tvOS 18, macOS 15, watchOS 11, visionOS 1, *)
package struct ConsoleMessageDetailsView: View {
package let message: LoggerMessageEntity
package init(message: LoggerMessageEntity) {
self.message = message
}
#if os(iOS) || os(visionOS)
package var body: some View {
contents
.inlineNavigationTitle("")
.toolbar {
ToolbarItemGroup(placement: .automatic) {
trailingNavigationBarItems
}
}
}
@ViewBuilder
private var trailingNavigationBarItems: some View {
NavigationLink(destination: ConsoleMessageMetadataView(message: message)) {
Image(systemName: "info.circle")
}
}
#elseif os(watchOS)
package var body: some View {
ScrollView {
VStack(spacing: 8) {
NavigationLink(destination: ConsoleMessageMetadataView(message: message)) {
Label("Details", systemImage: "info.circle")
}
contents
}
}
}
#elseif os(macOS)
package var body: some View {
contents
.inlineNavigationTitle("")
.toolbar {
ToolbarItemGroup(placement: .automatic) {
NavigationLink(destination: ConsoleMessageMetadataView(message: message)) {
Image(systemName: "info.circle")
}
}
}
}
#elseif os(tvOS)
package var body: some View {
contents
}
#endif
private var contents: some View {
VStack {
RichTextView(viewModel: makeTextViewModel())
}.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
}
private func makeTextViewModel() -> RichTextViewModel {
RichTextViewModel(string: TextRenderer().preformatted(message.text))
}
}
#if DEBUG
@available(iOS 18, tvOS 18, macOS 15, watchOS 11, visionOS 1, *)
#Preview {
NavigationView {
ConsoleMessageDetailsView(message: makeMockMessage())
}
}
#endif
#endif
#if DEBUG
package func makeMockMessage() -> LoggerMessageEntity {
let entity = LoggerMessageEntity(context: LoggerStore.mock.viewContext)
entity.text = "test"
entity.createdAt = Date()
entity.label = "auth"
entity.level = LoggerStore.Level.critical.rawValue
entity.file = "LoggerStore.swift"
entity.function = "createMockMessage()"
entity.line = 12
entity.rawMetadata = "customKey: customValue"
return entity
}
#endif