mirror of
https://github.com/kean/Pulse.git
synced 2026-05-30 21:07:33 +00:00
76 lines
1.9 KiB
Swift
76 lines
1.9 KiB
Swift
// The MIT License (MIT)
|
||
//
|
||
// Copyright (c) 2020–2023 Alexander Grebenyuk (github.com/kean).
|
||
|
||
import SwiftUI
|
||
import Pulse
|
||
import Combine
|
||
import CoreData
|
||
|
||
final class ConsoleTaskCellViewModel: Pinnable, ObservableObject {
|
||
private(set) lazy var time = ConsoleMessageCellViewModel.timeFormatter.string(from: task.createdAt)
|
||
#if os(iOS)
|
||
private(set) var badgeColor: UIColor = .gray
|
||
#else
|
||
private(set) var badgeColor: Color = .gray
|
||
#endif
|
||
private(set) var state: NetworkTaskEntity.State = .pending
|
||
private(set) lazy var progress = ProgressViewModel(task: task)
|
||
|
||
let task: NetworkTaskEntity
|
||
private var cancellable: AnyCancellable?
|
||
|
||
static let timeFormatter: DateFormatter = {
|
||
let formatter = DateFormatter()
|
||
formatter.locale = Locale(identifier: "en_US")
|
||
formatter.dateFormat = "HH:mm:ss.SSS"
|
||
return formatter
|
||
}()
|
||
|
||
init(task: NetworkTaskEntity) {
|
||
self.task = task
|
||
self.progress = ProgressViewModel(task: task)
|
||
|
||
self.refresh()
|
||
|
||
self.cancellable = task.objectWillChange.sink { [weak self] in
|
||
self?.refresh()
|
||
withAnimation {
|
||
self?.objectWillChange.send()
|
||
}
|
||
}
|
||
}
|
||
|
||
private func refresh() {
|
||
let state = task.state
|
||
|
||
#if os(iOS)
|
||
switch state {
|
||
case .pending: self.badgeColor = .systemYellow
|
||
case .success: self.badgeColor = .systemGreen
|
||
case .failure: self.badgeColor = .systemRed
|
||
}
|
||
#else
|
||
switch state {
|
||
case .pending: self.badgeColor = .yellow
|
||
case .success: self.badgeColor = .green
|
||
case .failure: self.badgeColor = .red
|
||
}
|
||
#endif
|
||
|
||
self.state = task.state
|
||
}
|
||
|
||
// MARK: Pins
|
||
|
||
lazy var pinViewModel = PinButtonViewModel(task)
|
||
|
||
// MARK: Context Menu
|
||
|
||
#if os(iOS) || os(macOS)
|
||
func share(as output: ShareOutput) -> ShareItems {
|
||
ShareService.share(task, as: output)
|
||
}
|
||
#endif
|
||
}
|