46 lines
1.0 KiB
Swift
46 lines
1.0 KiB
Swift
import Foundation
|
|
import Observation
|
|
|
|
@Observable
|
|
@MainActor
|
|
final class GameCenterViewModel {
|
|
var feed: LiveGameFeed?
|
|
var isLoading = false
|
|
var errorMessage: String?
|
|
var lastUpdated: Date?
|
|
|
|
private let statsAPI = MLBStatsAPI()
|
|
|
|
func watch(game: Game) async {
|
|
guard let gamePk = game.gamePk else {
|
|
errorMessage = "No live game feed is available for this matchup."
|
|
return
|
|
}
|
|
|
|
while !Task.isCancelled {
|
|
await refresh(gamePk: gamePk)
|
|
|
|
let liveState = feed?.gameData.status?.abstractGameState == "Live"
|
|
if !liveState {
|
|
break
|
|
}
|
|
|
|
try? await Task.sleep(for: .seconds(12))
|
|
}
|
|
}
|
|
|
|
func refresh(gamePk: String) async {
|
|
isLoading = true
|
|
errorMessage = nil
|
|
|
|
do {
|
|
feed = try await statsAPI.fetchGameFeed(gamePk: gamePk)
|
|
lastUpdated = Date()
|
|
} catch {
|
|
errorMessage = "Failed to load game center."
|
|
}
|
|
|
|
isLoading = false
|
|
}
|
|
}
|