Compare commits

..

No commits in common. "bf67475107934e743cdafc54bb46966b2ce35adc" and "6f8cca9dc9374ed870ee86bb24bb1bcfd65414e2" have entirely different histories.

3 changed files with 27 additions and 123 deletions

View file

@ -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)
}
}

View file

@ -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
)
}
}

View file

@ -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
}