End the watch session on Discard, plus start-flow UX tweaks
Watch-side follow-through for the End Workout flow: - The phone now pushes an authoritative set (in-progress, not-started, and completed within 24h) instead of the 25 most-recent workouts, and the watch prunes any workout absent from it. So a Discard/Delete (or a completed run aging out) drops off the watch, empties its active list, and ends the HKWorkoutSession — fixing the persistent wrist-raise re-foregrounding. The watch never originates a workout, so pruning can't lose local data; the 24h grace keeps a just-finished run on screen. The gate pops if the run you're viewing is pruned. UX tweaks: - The in-workout ⋯ is now a pull-down Menu (Add Exercise / End Workout) rather than an action sheet. - Starting a split while another workout is still active now prompts to end the current one(s) — keeping their progress — or run in parallel. Wired into both start paths (the split picker and "Start This Split"), via a shared WorkoutDocument.endKeepingProgress() helper. Claude-Session: https://claude.ai/code/session_01SCv7zvGFcKy47KSTnTLxRe
This commit is contained in:
@@ -94,6 +94,19 @@ extension WorkoutDocument {
|
||||
end = nil
|
||||
}
|
||||
}
|
||||
|
||||
/// End the workout now, keeping progress: mark every not-completed log as skipped, then
|
||||
/// recompute so it resolves to `.completed` (with `end` stamped). This is the
|
||||
/// "End Workout → Save" operation, shared by the in-workout menu and the
|
||||
/// start-a-new-split prompt.
|
||||
mutating func endKeepingProgress() {
|
||||
for i in logs.indices where (WorkoutStatus(rawValue: logs[i].status) ?? .notStarted) != .completed {
|
||||
logs[i].status = WorkoutStatus.skipped.rawValue
|
||||
logs[i].completed = false
|
||||
}
|
||||
recomputeStatusFromLogs()
|
||||
updatedAt = Date()
|
||||
}
|
||||
}
|
||||
|
||||
struct WorkoutLogDocument: Codable, Sendable, Equatable, Identifiable {
|
||||
|
||||
Reference in New Issue
Block a user