From 915d0ec2dc9520cd000a72d443df143031384794 Mon Sep 17 00:00:00 2001 From: Tony Bark <35226681+tonytins@users.noreply.github.com> Date: Sun, 23 Aug 2026 21:23:45 -0400 Subject: [PATCH] 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. --- Sources/AmtrakStatus/ContentView.swift | 23 +++++++----- Sources/AmtrakStatus/Models.swift | 2 +- Sources/AmtrakStatus/TrainLateness.swift | 45 ++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 10 deletions(-) create mode 100644 Sources/AmtrakStatus/TrainLateness.swift diff --git a/Sources/AmtrakStatus/ContentView.swift b/Sources/AmtrakStatus/ContentView.swift index 4defdcb..2643cc8 100644 --- a/Sources/AmtrakStatus/ContentView.swift +++ b/Sources/AmtrakStatus/ContentView.swift @@ -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) } } diff --git a/Sources/AmtrakStatus/Models.swift b/Sources/AmtrakStatus/Models.swift index 401b91c..eba059c 100644 --- a/Sources/AmtrakStatus/Models.swift +++ b/Sources/AmtrakStatus/Models.swift @@ -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 diff --git a/Sources/AmtrakStatus/TrainLateness.swift b/Sources/AmtrakStatus/TrainLateness.swift new file mode 100644 index 0000000..7008aec --- /dev/null +++ b/Sources/AmtrakStatus/TrainLateness.swift @@ -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" + } +}