"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import Image from "next/image"; import { useI18n } from "locales/client"; import Trophy from "@public/images/trophy.png"; import { WorkoutSessionSets } from "@/features/workout-session/ui/workout-session-sets"; import { WorkoutSessionHeader } from "@/features/workout-session/ui/workout-session-header"; import { WorkoutBuilderFooter } from "@/features/workout-builder/ui/workout-stepper-footer"; import { Button } from "@/components/ui/button"; import { StepperStepProps } from "../types"; import { useWorkoutStepper } from "../model/use-workout-stepper"; import { useWorkoutSession } from "../../workout-session/model/use-workout-session"; import { StepperHeader } from "./stepper-header"; import { MuscleSelection } from "./muscle-selection"; import { ExercisesSelection } from "./exercises-selection"; import { EquipmentSelection } from "./equipment-selection"; import type { ExerciseWithAttributes } from "../types"; export function WorkoutStepper() { const { loadSessionFromLocal } = useWorkoutSession(); const t = useI18n(); const router = useRouter(); const { currentStep, selectedEquipment, nextStep, prevStep, toggleEquipment, clearEquipment, selectedMuscles, toggleMuscle, canProceedToStep2, canProceedToStep3, isLoadingExercises, exercisesByMuscle, exercisesError, fetchExercises, exercisesOrder, } = useWorkoutStepper(); useEffect(() => { loadSessionFromLocal(); }, []); // dnd-kit et flatExercises doivent être avant tout return/condition const [flatExercises, setFlatExercises] = useState<{ id: string; muscle: string; exercise: ExerciseWithAttributes }[]>([]); useEffect(() => { if (exercisesByMuscle.length > 0) { const flat = exercisesByMuscle.flatMap((group) => group.exercises.map((exercise: ExerciseWithAttributes) => ({ id: exercise.id, muscle: group.muscle, exercise, })), ); setFlatExercises(flat); } }, [exercisesByMuscle]); // Fetch exercises quand on arrive à l'étape 3 useEffect(() => { if (currentStep === 3) { fetchExercises(); } }, [currentStep, selectedEquipment, selectedMuscles]); const { isWorkoutActive, session, startWorkout, currentExercise, formatElapsedTime, isTimerRunning, toggleTimer, resetTimer, quitWorkout, } = useWorkoutSession(); const canContinue = currentStep === 1 ? canProceedToStep2 : currentStep === 2 ? canProceedToStep3 : exercisesByMuscle.length > 0; // Actions pour les exercices const handleShuffleExercise = (exerciseId: string, muscle: string) => { // TODO: Implémenter la logique pour remplacer l'exercice par un autre console.log("Shuffle exercise:", exerciseId, "for muscle:", muscle); }; const handlePickExercise = (exerciseId: string) => { // later console.log("Pick exercise:", exerciseId); }; const handleDeleteExercise = (exerciseId: string, muscle: string) => { // TODO: Implémenter la logique pour supprimer l'exercice console.log("Delete exercise:", exerciseId, "for muscle:", muscle); }; const handleAddExercise = () => { // TODO: Implémenter la logique pour ajouter un exercice console.log("Add exercise"); }; const orderedExercises = exercisesOrder.length ? exercisesOrder .map((id) => flatExercises.find((item) => item.id === id)) .filter(Boolean) .map((item) => item!.exercise) : flatExercises.map((item) => item.exercise); const handleStartWorkout = () => { if (orderedExercises.length > 0) { startWorkout(orderedExercises, selectedEquipment, selectedMuscles); } }; const [showCongrats, setShowCongrats] = useState(false); if (showCongrats && !isWorkoutActive) { return (
{t("workout_builder.session.congrats_subtitle")}