Train status is now coloured coded for your convenience

- Introduced TrainLateness enum to represent on-time, early, late (with minutes), and unknown states, including description text, color, and formatting logic.
- Replaced TrainStatusRow.status String with TrainLateness and update ContentView to render a colored status pill and to return TrainLateness from isOnTime.
This commit is contained in:
Tony Bark 2026-08-23 21:23:45 -04:00
parent 3533e5d4b8
commit 915d0ec2dc
3 changed files with 60 additions and 10 deletions

View file

@ -54,7 +54,15 @@ struct ContentView: View {
TableColumn("Train", value: \TrainStatusRow.routeName)
TableColumn("To", value: \TrainStatusRow.origin)
TableColumn("From", value: \TrainStatusRow.destination)
TableColumn("Status", value: \TrainStatusRow.status)
TableColumn("Status") {
(row: TrainStatusRow) in
ZStack {
RoundedRectangle(cornerRadius: 0)
.fill(row.status.color)
Text(row.status.descrption)
.foregroundColor(Color.white)
}
}
TableColumn("Track", value: \TrainStatusRow.platform)
}.frame(minWidth: 600)
.overlay(alignment: .bottomTrailing) {
@ -129,28 +137,25 @@ struct ContentView: View {
}
}
func isOnTime(arr: String?, schArr: String?) -> String {
func isOnTime(arr: String?, schArr: String?) -> TrainLateness {
let amtrakDate = AmtrakDateFormatting()
guard
let actualDate = amtrakDate.parsedDate(from: arr),
let scheduledDate = amtrakDate.parsedDate(from: schArr)
else {
return "On Time"
return .unknown
}
let differenceInMinutes = Int(actualDate.timeIntervalSince(scheduledDate) / 60)
switch differenceInMinutes {
case -1...1:
return "On Time"
return .onTime
case ..<0:
return "\(-differenceInMinutes) min early"
case 0..<60:
return "\(differenceInMinutes) min late"
return .early(minutes: -differenceInMinutes)
default:
let hours = differenceInMinutes / 60
return "\(hours) hr late"
return .late(minutes: differenceInMinutes)
}
}

View file

@ -97,7 +97,7 @@ struct TrainStatusRow: Identifiable {
var trainID: String
var trainNum: String
var routeName: String
var status: String
var status: TrainLateness
var platform: String
var arrival: String
var departure: String

View file

@ -0,0 +1,45 @@
import Foundation
import SwiftCrossUI
enum TrainLateness {
case onTime
case early(minutes: Int)
case late(minutes: Int)
case unknown
var descrption: String {
switch self {
case .onTime:
return "On Time"
case .early(minutes: let minutes):
return "\(Self.formatted(minutes)) early"
case .late(minutes: let minutes):
return "\(Self.formatted(minutes)) late"
case .unknown:
return ""
}
}
var color: Color {
switch self {
case .onTime:
return .green
case .early:
return .blue
case .late:
return .red
case .unknown:
return .gray
}
}
static func formatted(_ minutes: Int) -> String {
let hours = minutes / 60
let remainder = minutes % 60
guard hours > 0 else {
return "\(minutes) mins"
}
return "\(hours) hr late"
}
}