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" + } +}