Skip to content

Commit

Permalink
Fixed routes view state issues
Browse files Browse the repository at this point in the history
  • Loading branch information
planecore committed Dec 31, 2023
1 parent 0cd7a28 commit 81cd2eb
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 31 deletions.
12 changes: 7 additions & 5 deletions ios/BetterRailWatch/ViewModels/RouteViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ class RouteViewModel: ObservableObject {
private var lastRequest: Date?
private var date: Date?

@Published var trains: Array<Route> = []
@Published var trains: Array<Route> = [] {
didSet {
self.nextTrain = getNextTrain()
}
}
@Published var loading = false
@Published var error: Error? = nil
@Published var nextTrain: Route? = nil
Expand All @@ -33,20 +37,18 @@ class RouteViewModel: ObservableObject {

DispatchQueue.main.async {
self.loading = false
if results.today.status == .failed, overrideIfError {
if (results.today.status == .failed || results.tomorrow.status == .failed) && overrideIfError {
self.error = results.today.error
}

if results.today.status == .success {
if results.today.status == .success, results.tomorrow.status == .success {
self.error = nil
self.lastRequest = Date()

self.trains = (
(results.today.routes ?? []) +
(results.tomorrow.routes ?? [])
).uniq(by: \.id)

self.nextTrain = self.getNextTrain()
}
}
}
Expand Down
12 changes: 6 additions & 6 deletions ios/BetterRailWatch/Views/FavoriteRouteView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -106,12 +106,6 @@ struct FavoriteRouteView: View {
.contentShape(Rectangle())
.setSkeleton(.constant(route.trains.isEmpty), animationType: .gradient(Color.gray.makeGradient().map { $0.opacity(0.2) }))
.skeletonCornerRadius(6)
.onAppear {
route.refreshNextTrainState()
}
.onReceive(minuteTimer.$currentTime) { _ in
route.refreshNextTrainState()
}

NavigationStack {
RoutesView(route: route)
Expand All @@ -123,6 +117,12 @@ struct FavoriteRouteView: View {
}
}
}
.onAppear {
route.refreshNextTrainState()
}
.onReceive(minuteTimer.$currentTime) { _ in
route.refreshNextTrainState()
}
}

var routeName: some View {
Expand Down
42 changes: 22 additions & 20 deletions ios/BetterRailWatch/Views/RoutesView.swift
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
import SwiftUI

func formatDaysDiff(day: Int) -> String {
let formatter = DateFormatter()
formatter.setLocalizedDateFormatFromTemplate("EEE, d/M")

switch day {
case 0:
return String(localized: "UPCOMING").capitalized
case 1:
return String(localized: "TOMORROW").capitalized
default:
let departureDate = Calendar.current.date(byAdding: .day, value: day, to: .now.midnight)!
return formatter.string(from: departureDate)
}
}

struct RoutesView: View {
@ObservedObject var route: RouteViewModel

var grouppedTrains: [String : [Route]] {
var grouppedTrains: [Int : [Route]] {
let futureTrains = route.trains.filter { train in
guard let nextTrain = route.nextTrain else {
return true
Expand All @@ -16,28 +31,18 @@ struct RoutesView: View {
return currentTrainDepartureTime >= nextTrainDepartureTime
}

let formatter = DateFormatter()
formatter.setLocalizedDateFormatFromTemplate("EEE, d/M")

return Dictionary(grouping: futureTrains, by: { train in
let departureDate = isoDateStringToDate(train.departureTime)
let daysDiff = Calendar.current.dateComponents([.day], from: .now.midnight, to: departureDate).day!

switch daysDiff {
case 0:
return "today"
case 1:
return String(localized: "TOMORROW").capitalized
default:
return formatter.string(from: departureDate)
}
return daysDiff
})
}

var body: some View {
ScrollViewReader { proxy in
VStack {
if route.loading {
if route.loading, route.trains.isEmpty {
ProgressView()
.progressViewStyle(.circular)
} else if let requestError = route.error {
Expand All @@ -48,27 +53,24 @@ struct RoutesView: View {
InfoMessage(imageName: "tram", message: String(localized: "no-trains-found"))
} else {
List {
ForEach(Array(grouppedTrains.keys), id: \.self) { key in
ForEach(Array(grouppedTrains.keys.sorted()), id: \.self) { key in
Section {
ForEach(grouppedTrains[key]!) { trainDetails in
RouteListItem(trainDetails: trainDetails)
}
} header: {
if key == "today" {
if key == 0 {
EmptyView()
} else {
Text(key)
Text(formatDaysDiff(day: key))
}
}
}
}
.listStyle(.carousel)
.environment(\.defaultMinListRowHeight, 10)
.environment(\.defaultMinListRowHeight, 50)
}
}
.onAppear {
route.shouldRefetchRoutes()
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions ios/BetterRailWatch/Views/SearchView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ struct SearchView: View {
func getRoutesView() -> some View {
if let origin, let destination {
RoutesView(route: RouteViewModel(origin: origin, destination: destination))
.navigationTitle("Schedule")
} else {
EmptyView()
}
Expand Down

0 comments on commit 81cd2eb

Please sign in to comment.