Files
workouts/Workouts Watch App/WatchScreenshotRoot.swift
T
rzen 373f812968 Adjust rest time from the watch with the same 1-second stepper
A gear on the watch root opens a small Settings sheet whose stepper
edits the shared restSeconds default (10-180s, 1s steps). Edits ride a
new settingsUpdate message to the phone - debounced per stepper burst,
falling back to transferUserInfo when unreachable - which clamps the
value, writes the shared default, and re-echoes it to every device
through the application context. While an edit is pending on the watch,
an in-flight context's stale rest value is skipped so it can't yank the
stepper back mid-edit.
2026-07-16 20:18:47 -04:00

64 lines
2.2 KiB
Swift

#if DEBUG
import SwiftUI
import SwiftData
/// DEBUG-only root for App Store screenshot capture on the watch. Renders one
/// fully-formed screen (chosen by `--screen`) against the seeded cache so captures are
/// deterministic. Never compiled into release.
struct WatchScreenshotRoot: View {
let services: WatchAppServices
private var activeWorkout: Workout? {
let context = services.container.mainContext
var descriptor = FetchDescriptor<Workout>(sortBy: [SortDescriptor(\.start, order: .reverse)])
descriptor.fetchLimit = 25
let workouts = (try? context.fetch(descriptor)) ?? []
return workouts.first { $0.status == .inProgress } ?? workouts.first
}
var body: some View {
content
.environment(services.bridge)
.modelContainer(services.container)
}
@ViewBuilder
private var content: some View {
if let workout = activeWorkout {
switch ScreenshotSeed.screen(default: "list") {
case "work":
ProgressHost(workout: workout, exerciseName: "Lat Pulldown", page: 0)
case "rest":
ProgressHost(workout: workout, exerciseName: "Lat Pulldown", page: 1)
case "settings":
NavigationStack { WatchSettingsView() }
default:
NavigationStack { WorkoutLogListView(workout: workout) }
}
} else {
Color.black
}
}
}
/// Hosts the progress view with a working-copy binding and a pinned page (which also
/// suppresses the Ready lead-in), so we can capture a specific work or rest phase that
/// the normal resume logic wouldn't land on.
private struct ProgressHost: View {
@State private var doc: WorkoutDocument
private let logID: String
private let page: Int?
init(workout: Workout, exerciseName: String, page: Int?) {
let document = WorkoutDocument(from: workout)
_doc = State(initialValue: document)
logID = document.logs.first { $0.exerciseName == exerciseName }?.id ?? document.logs.first?.id ?? ""
self.page = page
}
var body: some View {
ExerciseProgressView(doc: $doc, logID: logID, onChange: {}, debugInitialPage: page)
}
}
#endif