55// Created by Harold Serrano on 8/10/25.
66//
77
8- import Foundation
98import Combine
9+ import Foundation
1010import SwiftUI
1111
12-
1312public final class LogStore : ObservableObject , LoggerSink {
1413 public static let shared = LogStore ( )
1514 @Published public private( set) var entries : [ LogEvent ] = [ ]
@@ -21,15 +20,13 @@ public final class LogStore: ObservableObject, LoggerSink {
2120
2221 public func didLog( _ event: LogEvent ) {
2322 DispatchQueue . main. async { [ weak self] in
24- guard let self = self else { return }
23+ guard let self else { return }
2524 self . entries. append ( event)
2625 if self . entries. count > self . maxEntries {
2726 self . entries. removeFirst ( self . entries. count - self . maxEntries)
2827 }
2928 }
3029 }
31-
32-
3330}
3431
3532struct LogConsoleView : View {
@@ -40,9 +37,9 @@ struct LogConsoleView: View {
4037
4138 private func passes( _ e: LogEvent ) -> Bool {
4239 ( selectedLevel == nil || e. level == selectedLevel!) &&
43- ( search. isEmpty ||
44- e. message. localizedCaseInsensitiveContains ( search) ||
45- e. category. localizedCaseInsensitiveContains ( search) )
40+ ( search. isEmpty ||
41+ e. message. localizedCaseInsensitiveContains ( search) ||
42+ e. category. localizedCaseInsensitiveContains ( search) )
4643 }
4744
4845 var body : some View {
@@ -64,27 +61,27 @@ struct LogConsoleView: View {
6461
6562 Toggle ( " Auto‑scroll " , isOn: $autoScroll)
6663 . toggleStyle ( . checkbox)
67- /* //Disabling Buttons for now
68- Spacer()
69-
70- Button("Copy") {
71- let text = store.entries.filter(passes).map {
72- "[\($0.level)] \($0.message)"
73- }.joined(separator: "\n")
74- #if os(macOS)
75- NSPasteboard.general.clearContents()
76- NSPasteboard.general.setString(text, forType: .string)
77- #endif
78- }
79-
80- Button("Export") {
81- //exportLog(store.entries.filter(passes))
82- }
83-
84- Button("Clear") {
85- // optional: expose a clear API on Logger/LogStore if you want
86- }
87- */
64+ /* //Disabling Buttons for now
65+ Spacer()
66+
67+ Button("Copy") {
68+ let text = store.entries.filter(passes).map {
69+ "[\($0.level)] \($0.message)"
70+ }.joined(separator: "\n")
71+ #if os(macOS)
72+ NSPasteboard.general.clearContents()
73+ NSPasteboard.general.setString(text, forType: .string)
74+ #endif
75+ }
76+
77+ Button("Export") {
78+ //exportLog(store.entries.filter(passes))
79+ }
80+
81+ Button("Clear") {
82+ // optional: expose a clear API on Logger/LogStore if you want
83+ }
84+ */
8885 }
8986 . padding ( . horizontal, 8 )
9087
@@ -125,6 +122,7 @@ struct LogConsoleView: View {
125122 f. dateFormat = " HH:mm:ss.SSS "
126123 return f. string ( from: d)
127124 }
125+
128126 private func tag( for level: LogLevel ) -> String {
129127 switch level {
130128 case . error: return " ERROR "
@@ -135,6 +133,7 @@ struct LogConsoleView: View {
135133 case . none: return " "
136134 }
137135 }
136+
138137 private func badgeColor( for level: LogLevel ) -> Color {
139138 switch level {
140139 case . error: return . red
@@ -158,7 +157,7 @@ private func exportLog(_ entries: [LogEvent]) {
158157 do {
159158 try text. data ( using: . utf8) ? . write ( to: url)
160159 #if os(macOS)
161- NSWorkspace . shared. activateFileViewerSelecting ( [ url] )
160+ NSWorkspace . shared. activateFileViewerSelecting ( [ url] )
162161 #endif
163162 } catch {
164163 Logger . logError ( message: " Failed to export log: \( error) " , category: " Logger " )
0 commit comments