import { useState, useEffect } from "react"; import { Loader2, Plus } from "lucide-react"; import { arrayMove, SortableContext, verticalListSortingStrategy } from "@dnd-kit/sortable"; import { restrictToVerticalAxis } from "@dnd-kit/modifiers"; import { DndContext, closestCenter, PointerSensor, useSensor, useSensors, DragEndEvent } from "@dnd-kit/core"; import { useWorkoutStepper } from "../model/use-workout-stepper"; import { ExerciseListItem } from "./exercise-list-item"; import type { ExerciseWithAttributes } from "../types"; import type { TFunction } from "../../../../locales/client"; interface ExercisesSelectionProps { isLoading: boolean; exercisesByMuscle: { muscle: string; exercises: ExerciseWithAttributes[] }[]; error: any; onShuffle: (exerciseId: string, muscle: string) => void; onPick: (exerciseId: string) => void; onDelete: (exerciseId: string, muscle: string) => void; onAdd: () => void; onStartWorkout: (exercises: ExerciseWithAttributes[]) => void; t: TFunction; } export const ExercisesSelection = ({ isLoading, exercisesByMuscle, error, onShuffle, onPick, onDelete, onAdd, onStartWorkout, t, }: ExercisesSelectionProps) => { const [flatExercises, setFlatExercises] = useState<{ id: string; muscle: string; exercise: ExerciseWithAttributes }[]>([]); const { setExercisesOrder } = useWorkoutStepper(); const sensors = useSensors( useSensor(PointerSensor, { activationConstraint: { distance: 5, }, }), ); useEffect(() => { if (exercisesByMuscle.length > 0) { const flat = exercisesByMuscle.flatMap((group) => group.exercises.map((exercise) => ({ id: exercise.id, muscle: group.muscle, exercise, })), ); setFlatExercises(flat); } else { setFlatExercises([]); } }, [exercisesByMuscle]); const handleDragEnd = (event: DragEndEvent) => { const { active, over } = event; if (active.id !== over?.id) { setFlatExercises((items) => { const oldIndex = items.findIndex((item) => item.id === active.id); const newIndex = items.findIndex((item) => item.id === over?.id); const newOrder = arrayMove(items, oldIndex, newIndex); setExercisesOrder(newOrder.map((item) => item.id)); return newOrder; }); } }; const handleStartWorkout = () => { const allExercises = flatExercises.map((item) => item.exercise); if (allExercises.length > 0) { onStartWorkout(allExercises); } }; return (
{isLoading ? (

{t("workout_builder.loading.exercises")}

) : flatExercises.length > 0 ? (
{/* Liste des exercices drag and drop */} item.id)} strategy={verticalListSortingStrategy}>
{flatExercises.map((item) => ( ))}
) : error ? (

{t("workout_builder.error.loading_exercises")}

) : (

{t("workout_builder.no_exercises_found")}

)}
); };