diff --git a/ios/App/App/CoachWorkoutKit.swift b/ios/App/App/CoachWorkoutKit.swift index 7f1a1a5..ef2ada8 100644 --- a/ios/App/App/CoachWorkoutKit.swift +++ b/ios/App/App/CoachWorkoutKit.swift @@ -151,8 +151,15 @@ public class CoachWorkoutKitPlugin: CAPPlugin, CAPBridgedPlugin { cooldownMin: Double ) async throws { - // 1. Warmup — un WorkoutStep avec un goal time - let warmupStep = WorkoutStep(goal: .time(warmupMin * 60, .seconds)) + // 1. Warmup — un WorkoutStep optionnel. Si warmupMin == 0, on passe + // nil au CustomWorkout (la signature accepte WorkoutStep?). Passer + // un WorkoutStep(goal: .time(0, .seconds)) déclenche un assertion + // failure dans CustomWorkout.init (precondition Apple non + // catchable). Cas d'usage : séances 100% décrites en blockSteps + // (renforcement avec items détaillés warmup+main+aux+cooldown). + let warmupStep: WorkoutStep? = warmupMin > 0 + ? WorkoutStep(goal: .time(warmupMin * 60, .seconds)) + : nil // 2. Construit la liste d'IntervalSteps depuis stepsSpec. // Chaque entrée = (durée min, zone HR optionnelle, isWork bool, label optionnel). @@ -177,8 +184,11 @@ public class CoachWorkoutKitPlugin: CAPPlugin, CAPBridgedPlugin { // se répète repeats fois. let block = IntervalBlock(steps: intervalSteps, iterations: repeats) - // 4. Cooldown - let cooldownStep = WorkoutStep(goal: .time(cooldownMin * 60, .seconds)) + // 4. Cooldown — idem warmup : nil si cooldownMin == 0 pour éviter + // l'assertion failure sur WorkoutStep de durée 0. + let cooldownStep: WorkoutStep? = cooldownMin > 0 + ? WorkoutStep(goal: .time(cooldownMin * 60, .seconds)) + : nil // 6. CustomWorkout — location selon l'activité (indoor pour // strength/yoga/core, outdoor pour cardio extérieur).