diff --git a/Sources/AmtrakStatus/AmtrakDateFormatting.swift b/Sources/AmtrakStatus/AmtrakDateFormatting.swift deleted file mode 100644 index 912c9c7..0000000 --- a/Sources/AmtrakStatus/AmtrakDateFormatting.swift +++ /dev/null @@ -1,37 +0,0 @@ -import Foundation - -struct AmtrakDateFormatting { - static let isoFormatter = ISO8601DateFormatter() - - static let timeFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateStyle = .none - formatter.timeStyle = .short - return formatter - }() - - static let dateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateStyle = .medium - formatter.timeStyle = .none - return formatter - }() - - static func time(from isoString: String?) -> String? { - guard let isoString, !isoString.isEmpty, let date = isoFormatter.date( - from: isoString) else { - return nil - } - - return timeFormatter.string(from: date) - } - - static func date(from isoString: String?) -> String? { - guard let isoString, !isoString.isEmpty, let date = isoFormatter.date( - from: isoString) else { - return nil - } - - return dateFormatter.string(from: date) - } -} diff --git a/Sources/AmtrakStatus/ContentView.swift b/Sources/AmtrakStatus/ContentView.swift index 316a852..01a165f 100644 --- a/Sources/AmtrakStatus/ContentView.swift +++ b/Sources/AmtrakStatus/ContentView.swift @@ -1,9 +1,14 @@ import SwiftCrossUI -import Foundation extension Train { - var serviceDate: String { - AmtrakDateFormatting.date(from: createdAt) ?? "-" + var displayNumber: String { + let parts = trainID.split(separator: "-", maxSplits: 1) + + guard parts.count <= 2 else { + return trainNum + } + + return "\(trainNum) (\(parts[1]))" } } @@ -14,9 +19,6 @@ struct ContentView: View { @State var rows: [TrainStatusRow] = [] @State var isLoading = false @State var errorMessage: String? - @State var currentStation: String = "" - - let unknown = "Unknown" var body: some View { VStack { @@ -54,13 +56,11 @@ struct ContentView: View { } Table(rows) { - TableColumn("Time", value: \TrainStatusRow.arrival) TableColumn("Number", value: \TrainStatusRow.trainNum) - TableColumn("Train", value: \TrainStatusRow.routeName) - TableColumn("To", value: \TrainStatusRow.origin) - TableColumn("From", value: \TrainStatusRow.destination) - TableColumn("Status", value: \TrainStatusRow.status) - TableColumn("Track", value: \TrainStatusRow.platform) + TableColumn("Route", value: \TrainStatusRow.routeName) + TableColumn("Platform", value: \TrainStatusRow.platform) + TableColumn("Origin", value: \TrainStatusRow.origin) + TableColumn("Destination", value: \TrainStatusRow.destination) }.overlay(alignment: .bottomTrailing) { if isLoading { @@ -73,8 +73,6 @@ struct ContentView: View { HStack { if let errorMessage { Text(errorMessage) - } else if !currentStation.isEmpty { - Text(currentStation) } }.padding(10) } @@ -119,7 +117,17 @@ struct ContentView: View { where: { $0.code == code }, )?.platform - newRows.append(trainStatus(for: train, atStationCode: code)) + + newRows.append(TrainStatusRow( + trainID: train.trainID, + trainNum: train.displayNumber, + routeName: train.routeName, + origin: train.origName, + destination: train.destName, + platform: ( + platform?.isEmpty == false, + ) ? platform! : "", + )) } } @@ -133,43 +141,4 @@ struct ContentView: View { rows = [] } } - - func isOnTime(arr: String?, schArr: String?) -> String { - let amtrakDate = AmtrakDateFormatting() - - if AmtrakDateFormatting - .time(from: arr) != AmtrakDateFormatting - .time(from: schArr) { - return "Late" - } - - return "On Time" - } - - func trainStatus(for train: Train, atStationCode code: String) -> TrainStatusRow { - let leg = train.stations?.first { $0.code == code } - let platform = leg?.platform ?? "-" - let stationName = leg?.name ?? unknown - let arrival = AmtrakDateFormatting.time(from: leg?.arr) ?? AmtrakDateFormatting.time( - from: leg?.schArr - ) - let depature = AmtrakDateFormatting.time(from: leg?.dep) ?? AmtrakDateFormatting.time( - from: leg?.schDep - ) - - currentStation = "\(stationName) station" - - return TrainStatusRow( - trainID: train.trainID, - trainNum: train.trainNum, - routeName: train.routeName, - status: isOnTime(arr: leg?.arr, schArr: leg?.schArr), - platform: leg?.platform ?? "", - arrival: arrival ?? "", - departure: depature ?? "", - origin: train.origName, - destination: train.destName, - // serviceDate: train.serviceDate - ) - } } diff --git a/Sources/AmtrakStatus/Models.swift b/Sources/AmtrakStatus/Models.swift index 401b91c..29effcb 100644 --- a/Sources/AmtrakStatus/Models.swift +++ b/Sources/AmtrakStatus/Models.swift @@ -4,33 +4,9 @@ struct TrainAlert: Codable { var message: String } -struct Station: Codable, Sendable { - var name: String +struct Station: Codable { var code: String - var tz: String - var bus: Bool - var schArr: String - var schDep: String - var arr: String - var dep: String - var arrCmnt: String - var depCmnt: String - var status: StationStatus - var stopIconColor: String - var platform: String -} - -enum StationStatus: String, Codable, Sendable { - case enroute = "Enroute" - case station = "Station" - case departed = "Departed" - case unknown = "Unknown" - - init(from decoder: any Decoder) throws { - let container = try decoder.singleValueContainer() - let rawValue = try container.decode(String.self) - self = StationStatus(rawValue: rawValue) ?? .unknown - } + var platform: String? } struct Train: Codable { @@ -93,15 +69,11 @@ struct TrainStatusRow: Identifiable { var id: String { trainID } - + var trainID: String var trainNum: String var routeName: String - var status: String - var platform: String - var arrival: String - var departure: String var origin: String var destination: String - // var serviceDate: String + var platform: String }