Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/loading improvement #22

Merged
merged 13 commits into from
Jun 7, 2024
Merged
100 changes: 51 additions & 49 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.6)
CFPropertyList (3.0.7)
base64
nkf
rexml
addressable (2.8.5)
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.15)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.2.0)
aws-partitions (1.843.0)
aws-sdk-core (3.185.1)
aws-eventstream (~> 1, >= 1.0.2)
aws-eventstream (1.3.0)
aws-partitions (1.937.0)
aws-sdk-core (3.196.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5)
aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.72.0)
aws-sdk-core (~> 3, >= 3.184.0)
aws-sdk-kms (1.82.0)
aws-sdk-core (~> 3, >= 3.193.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.136.0)
aws-sdk-core (~> 3, >= 3.181.0)
aws-sdk-s3 (1.151.0)
aws-sdk-core (~> 3, >= 3.194.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.6)
aws-sigv4 (1.6.1)
aws-sigv4 (~> 1.8)
aws-sigv4 (1.8.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
claide (1.1.0)
colored (1.2)
colored2 (3.1.2)
Expand All @@ -32,11 +35,10 @@ GEM
declarative (0.0.20)
digest-crc (0.6.5)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
domain_name (0.6.20240107)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.104.0)
excon (0.110.0)
faraday (1.10.3)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
Expand Down Expand Up @@ -65,15 +67,15 @@ GEM
faraday-retry (1.0.3)
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.2.7)
fastlane (2.216.0)
fastimage (2.3.1)
fastlane (2.220.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
babosa (>= 1.0.3, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
colored
colored (~> 1.2)
commander (~> 4.6)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
Expand All @@ -85,6 +87,7 @@ GEM
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
Expand All @@ -93,10 +96,10 @@ GEM
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (~> 0.1.1)
optparse (>= 0.1.1, < 1.0.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.3)
security (= 0.1.5)
simctl (~> 1.6.3)
terminal-notifier (>= 2.0.0, < 3.0.0)
terminal-table (~> 3)
Expand All @@ -105,36 +108,35 @@ GEM
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.51.0)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.2)
google-apis-core (0.11.3)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
mini_mime (~> 1.0)
representable (~> 3.0)
retriable (>= 2.0, < 4.a)
rexml
webrick
google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.19.0)
google-apis-core (>= 0.9.0, < 2.a)
google-cloud-core (1.6.0)
google-cloud-env (~> 1.0)
google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.7.0)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.3.1)
google-cloud-storage (1.44.0)
google-cloud-errors (1.4.0)
google-cloud-storage (1.47.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.19.0)
google-apis-storage_v1 (~> 0.31.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
Expand All @@ -149,56 +151,56 @@ GEM
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.2)
json (2.6.3)
jwt (2.7.1)
json (2.7.2)
jwt (2.8.1)
base64
mini_magick (4.12.0)
mini_mime (1.1.5)
multi_json (1.15.0)
multipart-post (2.3.0)
multipart-post (2.4.1)
nanaimo (0.3.0)
naturally (2.2.1)
optparse (0.1.1)
nkf (0.2.0)
optparse (0.5.0)
os (1.1.4)
plist (3.7.0)
public_suffix (5.0.3)
rake (13.1.0)
plist (3.7.1)
public_suffix (5.0.5)
rake (13.2.1)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
rexml (3.2.6)
rexml (3.2.8)
strscan (>= 3.0.9)
rouge (2.0.7)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
security (0.1.3)
signet (0.18.0)
security (0.1.5)
signet (0.19.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
simctl (1.6.10)
CFPropertyList
naturally
strscan (3.1.0)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
trailblazer-option (0.1.2)
tty-cursor (0.7.1)
tty-screen (0.8.1)
tty-screen (0.8.2)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
uber (0.1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.2)
unicode-display_width (2.5.0)
webrick (1.8.1)
word_wrap (1.0.0)
xcode-install (2.8.1)
claide (>= 0.9.1)
fastlane (>= 2.1.0, < 3.0.0)
xcodeproj (1.23.0)
xcodeproj (1.24.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
Expand Down
34 changes: 34 additions & 0 deletions LuasKit/AppMode.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//
// Created by Roland Gropmair on 27/05/2024.
// Copyright © 2024 mApps.ie. All rights reserved.
//

import Foundation

/// The way the user decided how current station should be determined
public enum AppMode: Equatable {

/// need location
case closest
case closestOtherLine

/// no location required, because user selected specific station (via various options)
case favourite(TrainStation)
case nearby(TrainStation)
case specific(TrainStation)
case recents(TrainStation)

public var specificStation: TrainStation? {
switch self {

case .closest, .closestOtherLine:
return nil
case .favourite(let station), .nearby(let station), .specific(let station), .recents(let station):
return station
}
}

public var needsLocation: Bool {
self == .closest || self == .closestOtherLine
}
}
2 changes: 1 addition & 1 deletion LuasKit/AppModel+Codable.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import Foundation

extension AppModel.AppMode: Codable {
extension AppMode: Codable {

// https://stackoverflow.com/questions/69979095/codable-enum-with-arguments-and-fails-at-compile-time

Expand Down
4 changes: 2 additions & 2 deletions LuasKit/AppModel+CustomStringConvertible.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import Foundation

extension AppModel.AppState: CustomStringConvertible {
extension AppState: CustomStringConvertible {

public var description: String {
switch self {
Expand All @@ -30,7 +30,7 @@ extension AppModel.AppState: CustomStringConvertible {
}
}

extension AppModel.AppMode: CustomStringConvertible {
extension AppMode: CustomStringConvertible {

public var description: String {
switch self {
Expand Down
55 changes: 5 additions & 50 deletions LuasKit/AppModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,56 +10,6 @@ import SwiftUI
// @Observable does not work - circular reference?
public class AppModel: ObservableObject {

/// state machine, drives UI
public enum AppState {

case idle

case gettingLocation
case locationAuthorizationUnknown
case errorGettingLocation(String)

case errorGettingStation(String)
/// in case the user is too far away from Dublin area

case loadingDueTimes(TrainStation, TrainsByDirection?)
case errorGettingDueTimes(TrainStation, String)

case foundDueTimes(TrainsByDirection)

public init(_ state: AppState) {
self = state
}
}

/// how user decided how current station should be determined
public enum AppMode: Equatable {

/// need location
case closest
case closestOtherLine

/// no location required, because user selected specific station (via various options)
case favourite(TrainStation)
case nearby(TrainStation)
case specific(TrainStation)
case recents(TrainStation)

public var specificStation: TrainStation? {
switch self {

case .closest, .closestOtherLine:
return nil
case .favourite(let station), .nearby(let station), .specific(let station), .recents(let station):
return station
}
}

public var needsLocation: Bool {
self == .closest || self == .closestOtherLine
}
}

@Published public var appState: AppState = .idle

@Published public var appMode: AppMode = .closest {
Expand Down Expand Up @@ -94,6 +44,11 @@ public class AppModel: ObservableObject {

@Published public var locationDenied: Bool = false

#if DEBUG
// so we can simulate app state in a sequence
public let mockMode = false
#endif

public init() {
if let storedAppModeData = UserDefaults.standard.object(forKey: "AppMode") as? Data,
let storedAppMode = try? JSONDecoder().decode(AppMode.self, from: storedAppModeData)
Expand Down
41 changes: 41 additions & 0 deletions LuasKit/AppState.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//
// Created by Roland Gropmair on 27/05/2024.
// Copyright © 2024 mApps.ie. All rights reserved.
//

import Foundation

/// App's state machine, drives UI
public enum AppState {

case idle

case gettingLocation
case locationAuthorizationUnknown
case errorGettingLocation(String)

/// in case the user is too far away from Dublin area
case errorGettingStation(String)

// cachedTrains is optional because when we load that station for the first time, we won't have any trains cached
case loadingDueTimes(TrainStation, cachedTrains: TrainsByDirection?)

case errorGettingDueTimes(TrainStation, String)

case foundDueTimes(TrainsByDirection)

public init(_ state: AppState) {
self = state
}
}

public extension AppState {

var isLoading: Bool {
if case .loadingDueTimes = self {
return true
} else {
return false
}
}
}
Loading
Loading