// // ActiveWorkoutGateView.swift // Workouts Watch App // // Copyright 2025 Rouslan Zenetl. All Rights Reserved. // import SwiftUI import SwiftData /// Root of the watch app. The watch only runs the workout that's currently active /// on the phone — there's no history browsing here. The "active" workout is the most /// recent cached one that isn't finished (`notStarted` or `inProgress`); a workout is /// created on the phone as `notStarted` the moment a split is picked, and flips to /// `completed` once every exercise is done, at which point we fall back to the gate. struct ActiveWorkoutGateView: View { @Environment(WatchConnectivityBridge.self) private var bridge @Environment(WorkoutSessionManager.self) private var sessionManager @Query(sort: \Workout.start, order: .reverse) private var workouts: [Workout] private var activeWorkout: Workout? { workouts.first { $0.status == .inProgress || $0.status == .notStarted } } var body: some View { NavigationStack { if let workout = activeWorkout { WorkoutLogListView(workout: workout) } else { emptyState } } .task { // Nothing to run yet — pull fresh state in case the phone just started one. if activeWorkout == nil { bridge.requestSync() } } .onChange(of: activeWorkout == nil) { _, noActiveWorkout in // The workout finished (or was cleared) — release the HealthKit session that // was keeping the launched app alive. if noActiveWorkout { sessionManager.end() } } } private var emptyState: some View { ContentUnavailableView { Label("Start a Workout", systemImage: "iphone") } description: { Text("Begin a workout on your iPhone to run it here.") } actions: { Button { bridge.requestSync() } label: { Label("Refresh", systemImage: "arrow.triangle.2.circlepath") } } } }