49 lines
1.4 KiB
Swift
49 lines
1.4 KiB
Swift
import Foundation
|
|
import Observation
|
|
import VelodyDomain
|
|
import VelodyNetworking
|
|
import VelodyPersistence
|
|
import VelodySync
|
|
import VelodyUtilities
|
|
|
|
@MainActor
|
|
@Observable
|
|
final class iPhoneLibraryViewModel {
|
|
var tracks: [LibraryTrack] = []
|
|
var syncStatus = "Offline library not synced yet"
|
|
|
|
private let store = InMemoryLocalLibraryStore()
|
|
private let keychainService = MemoryKeychainService()
|
|
private let syncCoordinator: PlaceholderSyncCoordinator
|
|
private var hasLoaded = false
|
|
|
|
init() {
|
|
let environment = ServerEnvironment(
|
|
baseURL: URL(string: "http://localhost:3000")!,
|
|
appVersion: "0.1.0"
|
|
)
|
|
let apiClient = StubVelodyAPIClient(environment: environment)
|
|
self.syncCoordinator = PlaceholderSyncCoordinator(
|
|
apiClient: apiClient,
|
|
store: store
|
|
)
|
|
}
|
|
|
|
func loadIfNeeded() async {
|
|
guard !hasLoaded else { return }
|
|
hasLoaded = true
|
|
await keychainService.save("placeholder-bootstrap-token", forKey: "bootstrap-token")
|
|
await refreshSync()
|
|
}
|
|
|
|
func refreshSync() async {
|
|
do {
|
|
let result = try await syncCoordinator.performInitialSync()
|
|
tracks = result.tracks
|
|
syncStatus = result.statusMessage
|
|
} catch {
|
|
syncStatus = "Sync placeholder failed: \(error.localizedDescription)"
|
|
}
|
|
}
|
|
}
|