"use client"; import { useState, useEffect } from "react"; import { useQueryState } from "nuqs"; import { useRouter } from "next/navigation"; import Image from "next/image"; import { ExerciseAttributeValueEnum } from "@prisma/client"; 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 [fromSession, setFromSession] = useQueryState("fromSession"); const { currentStep, selectedEquipment, selectedMuscles, exercisesByMuscle, isLoadingExercises, exercisesError, nextStep, prevStep, toggleEquipment, clearEquipment, toggleMuscle, canProceedToStep2, canProceedToStep3, fetchExercises, exercisesOrder, shuffleExercise, pickExercise, isShuffling, } = useWorkoutStepper(); useEffect(() => { loadSessionFromLocal(); }, []); 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]); useEffect(() => { if (currentStep === 3 && !fromSession) { fetchExercises(); } }, [currentStep, selectedEquipment, selectedMuscles, fromSession]); const { isWorkoutActive, session, startWorkout, formatElapsedTime, isTimerRunning, toggleTimer, resetTimer, quitWorkout } = useWorkoutSession(); const canContinue = currentStep === 1 ? canProceedToStep2 : currentStep === 2 ? canProceedToStep3 : exercisesByMuscle.length > 0; const handleShuffleExercise = async (exerciseId: string, muscle: string) => { try { // Convertir le muscle string vers enum const muscleEnum = muscle as ExerciseAttributeValueEnum; await shuffleExercise(exerciseId, muscleEnum); } catch (error) { console.error("Error shuffling exercise:", error); alert("Error shuffling exercise. Please try again."); } }; const handlePickExercise = async (exerciseId: string) => { try { await pickExercise(exerciseId); // Optionnel: afficher un toast de succès console.log("Exercise picked successfully!"); } catch (error) { console.error("Error picking exercise:", error); alert("Error picking exercise. Please try again."); } }; const handleDeleteExercise = (exerciseId: string, muscle: string) => { alert("TODO : Delete exercise"); console.log("Delete exercise:", exerciseId, "for muscle:", muscle); }; const handleAddExercise = () => { alert("TODO : Add exercise 🥶"); 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); const goToProfile = () => { router.push("/profile"); }; const handleToggleEquipment = (equipment: ExerciseAttributeValueEnum) => { toggleEquipment(equipment); if (fromSession) setFromSession(null); }; const handleClearEquipment = () => { clearEquipment(); if (fromSession) setFromSession(null); }; const handleToggleMuscle = (muscle: ExerciseAttributeValueEnum) => { toggleMuscle(muscle); if (fromSession) setFromSession(null); }; if (showCongrats && !isWorkoutActive) { return (
{t("workout_builder.session.congrats_subtitle")}