mirror of
https://github.com/kean/Pulse.git
synced 2026-05-30 21:07:33 +00:00
82 lines
2.3 KiB
Swift
82 lines
2.3 KiB
Swift
// The MIT License (MIT)
|
||
//
|
||
// Copyright (c) 2020–2023 Alexander Grebenyuk (github.com/kean).
|
||
|
||
import SwiftUI
|
||
import Pulse
|
||
import CoreData
|
||
import Combine
|
||
|
||
final class ConsoleMessageCellViewModel: Pinnable {
|
||
let message: LoggerMessageEntity
|
||
|
||
private let searchCriteriaViewModel: ConsoleSearchCriteriaViewModel?
|
||
|
||
// TODO: Trim whitespaces and remove newlines?
|
||
var preprocessedText: String { message.text }
|
||
|
||
private(set) lazy var time = ConsoleMessageCellViewModel.timeFormatter.string(from: message.createdAt)
|
||
|
||
static let timeFormatter: DateFormatter = {
|
||
let formatter = DateFormatter()
|
||
formatter.locale = Locale(identifier: "en_US")
|
||
formatter.dateFormat = "HH:mm:ss.SSS"
|
||
return formatter
|
||
}()
|
||
|
||
private(set) lazy var pinViewModel = PinButtonViewModel(message)
|
||
|
||
init(message: LoggerMessageEntity, searchCriteriaViewModel: ConsoleSearchCriteriaViewModel? = nil) {
|
||
self.message = message
|
||
self.searchCriteriaViewModel = searchCriteriaViewModel
|
||
}
|
||
|
||
// MARK: Context Menu
|
||
|
||
#if os(iOS) || os(macOS)
|
||
func share() -> ShareItems {
|
||
ShareItems([message.text])
|
||
}
|
||
|
||
func focus() {
|
||
searchCriteriaViewModel?.criteria.messages.labels.isEnabled = true
|
||
searchCriteriaViewModel?.criteria.messages.labels.focused = message.label.name
|
||
}
|
||
|
||
func hide() {
|
||
searchCriteriaViewModel?.criteria.messages.labels.isEnabled = true
|
||
searchCriteriaViewModel?.criteria.messages.labels.hidden.insert(message.label.name)
|
||
}
|
||
#endif
|
||
}
|
||
|
||
extension UXColor {
|
||
static func textColor(for level: LoggerStore.Level) -> UXColor {
|
||
switch level {
|
||
case .trace: return .secondaryLabel
|
||
case .debug, .info: return .label
|
||
case .notice, .warning: return .systemOrange
|
||
#if os(macOS)
|
||
case .error, .critical: return Palette.red
|
||
#else
|
||
case .error, .critical: return .red
|
||
#endif
|
||
}
|
||
}
|
||
}
|
||
|
||
extension Color {
|
||
static func textColor(for level: LoggerStore.Level) -> Color {
|
||
switch level {
|
||
case .trace: return .secondary
|
||
case .debug, .info: return .primary
|
||
case .notice, .warning: return .orange
|
||
#if os(macOS)
|
||
case .error, .critical: return Color(Palette.red)
|
||
#else
|
||
case .error, .critical: return .red
|
||
#endif
|
||
}
|
||
}
|
||
}
|