54 lines
1.6 KiB
Swift
54 lines
1.6 KiB
Swift
import Foundation
|
|
|
|
public struct LogEntry: Identifiable, Equatable, Sendable {
|
|
public let id = UUID()
|
|
public let timestamp: Date
|
|
public let message: String
|
|
public let level: LogLevel
|
|
|
|
public enum LogLevel: Sendable {
|
|
case info
|
|
case success
|
|
case warning
|
|
case error
|
|
|
|
public var icon: String {
|
|
switch self {
|
|
case .info: return "info.circle"
|
|
case .success: return "checkmark.circle"
|
|
case .warning: return "exclamationmark.triangle"
|
|
case .error: return "xmark.circle"
|
|
}
|
|
}
|
|
}
|
|
|
|
public static func == (lhs: LogEntry, rhs: LogEntry) -> Bool {
|
|
lhs.id == rhs.id
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
public class ActivityLog: ObservableObject {
|
|
public static let shared = ActivityLog()
|
|
|
|
@Published public private(set) var entries: [LogEntry] = []
|
|
|
|
private let maxEntries = 50
|
|
|
|
private init() {}
|
|
|
|
public func log(_ message: String, level: LogEntry.LogLevel = .info) {
|
|
let entry = LogEntry(timestamp: Date(), message: message, level: level)
|
|
entries.insert(entry, at: 0)
|
|
if entries.count > maxEntries {
|
|
entries = Array(entries.prefix(maxEntries))
|
|
}
|
|
NSLog("ActivityLog: [\(level)] \(message)")
|
|
}
|
|
|
|
public func info(_ message: String) { log(message, level: .info) }
|
|
public func success(_ message: String) { log(message, level: .success) }
|
|
public func warning(_ message: String) { log(message, level: .warning) }
|
|
public func error(_ message: String) { log(message, level: .error) }
|
|
public func clear() { entries.removeAll() }
|
|
}
|