diff --git a/app.config.js b/app.config.js index 32ad08b..99f8a9c 100644 --- a/app.config.js +++ b/app.config.js @@ -4,7 +4,7 @@ export default { expo: { name: IS_DEV ? "Muscle Quest (Dev)" : "Muscle Quest", slug: "musclequest", - version: "0.21.04", // MM.mm.pp + version: "0.21.05", // MM.mm.pp orientation: "portrait", icon: "./assets/images/icon.png", scheme: "musclequest", @@ -14,7 +14,7 @@ export default { bundleIdentifier: "com.isotronic.musclequest", }, android: { - versionCode: 2104, // MMmmpp + versionCode: 2105, // MMmmpp googleServicesFile: "./google-services.json", adaptiveIcon: { foregroundImage: "./assets/images/ic_launcher_foreground.png", diff --git a/app/(app)/(create-plan)/exercises.tsx b/app/(app)/(create-plan)/exercises.tsx index 5417d12..0a4a461 100644 --- a/app/(app)/(create-plan)/exercises.tsx +++ b/app/(app)/(create-plan)/exercises.tsx @@ -41,11 +41,19 @@ export default function ExercisesScreen() { newExerciseId, setNewExerciseId, replaceExercise, + createSuperset, } = useWorkoutStore(); - const { index } = useLocalSearchParams(); + const { index, supersetForIndex } = useLocalSearchParams<{ + index: string; + supersetForIndex?: string; + }>(); const currentWorkoutIndex = Number(index); const currentWorkout = workouts[currentWorkoutIndex]; const replacing = replaceExerciseIndex !== undefined; + const supersetMode = supersetForIndex !== undefined; + const supersetForExerciseIndex = supersetMode + ? Number(supersetForIndex) + : undefined; const { data: settings, @@ -67,7 +75,7 @@ export default function ExercisesScreen() { const [selectedExercises, setSelectedExercises] = useState([]); useEffect(() => { - if (currentWorkout?.exercises && !replacing) { + if (currentWorkout?.exercises && !replacing && !supersetMode) { const existingExerciseIds = currentWorkout.exercises.map( (exercise) => exercise.exercise_id, ); @@ -84,7 +92,13 @@ export default function ExercisesScreen() { // Clear the newExerciseId after it's used setNewExerciseId(null); } - }, [currentWorkout, newExerciseId, replacing, setNewExerciseId]); + }, [ + currentWorkout, + newExerciseId, + replacing, + supersetMode, + setNewExerciseId, + ]); const minutes = Math.floor(totalSeconds / 60); const seconds = totalSeconds % 60; @@ -102,13 +116,38 @@ export default function ExercisesScreen() { const handleSelectExercise = useCallback( (exerciseId: number) => { - if (replacing) { - // Check if this exercise already exists in the current workout - const workout = workouts[currentWorkoutIndex]; - const exerciseAlreadyExists = workout.exercises.some( - (e) => e.exercise_id === exerciseId, - ); + const workout = workouts[currentWorkoutIndex]; + const exerciseAlreadyExists = workout?.exercises.some( + (e) => e.exercise_id === exerciseId, + ); + if (supersetMode) { + // Single-select: pair as superset partner + if (exerciseAlreadyExists) { + Alert.alert( + "Exercise Already Added", + "This exercise is already in your workout. Please choose a different one.", + [{ text: "OK" }], + ); + return; + } + const exercise = allExercises.find( + (ex) => ex.exercise_id === exerciseId, + ); + if (exercise && supersetForExerciseIndex !== undefined) { + const newExercise = { + ...exercise, + sets: + exercise.tracking_type === "time" ? defaultTimeSets : defaultSets, + }; + createSuperset( + currentWorkoutIndex, + supersetForExerciseIndex, + newExercise, + ); + router.back(); + } + } else if (replacing) { if (exerciseAlreadyExists) { Alert.alert( "Exercise Already Added", @@ -134,7 +173,7 @@ export default function ExercisesScreen() { defaultSets, defaultTimeSets, ); - router.back(); // Return immediately after replacement + router.back(); } } else { // Normal add mode - allow multiple selections @@ -146,14 +185,17 @@ export default function ExercisesScreen() { } }, [ + supersetMode, + supersetForExerciseIndex, replacing, allExercises, replaceExerciseIndex, defaultTimeSets, defaultSets, replaceExercise, + createSuperset, currentWorkoutIndex, - workouts, // Make sure 'workouts' is included in dependencies + workouts, ], ); @@ -280,7 +322,7 @@ export default function ExercisesScreen() { }); }} /> - {!replacing && ( + {!replacing && !supersetMode && (