Initial commit
This commit is contained in:
45
mlbTVOS/ViewModels/GameCenterViewModel.swift
Normal file
45
mlbTVOS/ViewModels/GameCenterViewModel.swift
Normal file
@@ -0,0 +1,45 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user