import { useState, useEffect } from 'react'; import { useExerciseStore } from '../../stores/exerciseStore'; import type { TrainingSet, MuscleGroup } from '../../types'; import { MUSCLE_GROUPS, MUSCLE_GROUP_LABELS } from '../../types'; interface SetFormProps { /** Vorhandenes Set beim Bearbeiten; `null`/`undefined` beim Erstellen. */ trainingSet?: TrainingSet | null; onSubmit: (name: string, exerciseIds: number[]) => void; onCancel: () => void; } /** * Formular zum Erstellen und Bearbeiten eines Trainings-Sets. * Übungen können nach Muskelgruppe gefiltert und per Checkbox ausgewählt werden. * Die Reihenfolge der ausgewählten Übungen ist per Pfeil-Buttons sortierbar. */ export function SetForm({ trainingSet, onSubmit, onCancel }: SetFormProps) { const { exercises, fetchExercises } = useExerciseStore(); const [name, setName] = useState(''); const [selectedIds, setSelectedIds] = useState([]); const [filterMg, setFilterMg] = useState(''); useEffect(() => { // Alle Übungen ohne aktiven Filter laden useExerciseStore.getState().setFilter({ muscleGroup: '', query: '' }); fetchExercises(); }, [fetchExercises]); useEffect(() => { if (trainingSet) { setName(trainingSet.name); setSelectedIds(trainingSet.exercises?.map((e) => e.id) || []); } else { setName(''); setSelectedIds([]); } }, [trainingSet]); const toggleExercise = (id: number) => { setSelectedIds((prev) => prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id], ); }; const moveUp = (index: number) => { if (index === 0) return; setSelectedIds((prev) => { const next = [...prev]; [next[index - 1], next[index]] = [next[index], next[index - 1]]; return next; }); }; const moveDown = (index: number) => { if (index >= selectedIds.length - 1) return; setSelectedIds((prev) => { const next = [...prev]; [next[index], next[index + 1]] = [next[index + 1], next[index]]; return next; }); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onSubmit(name.trim(), selectedIds); }; const filteredExercises = filterMg ? exercises.filter((e) => e.muscle_group === filterMg) : exercises; const isValid = name.trim().length > 0 && selectedIds.length > 0; /** Map für effizienten Zugriff auf Übungsnamen in der Reihenfolge-Ansicht. */ const exerciseMap = new Map(exercises.map((e) => [e.id, e])); return (

{trainingSet ? 'Set bearbeiten' : 'Neues Set'}

setName(e.target.value)} className="w-full bg-gray-800 border border-gray-700 rounded-lg px-3 py-2 text-gray-100 focus:outline-none focus:border-blue-500 min-h-[44px]" placeholder="Set-Name" maxLength={100} />
{filteredExercises.length === 0 ? (

Keine Übungen gefunden

) : ( filteredExercises.map((ex) => ( )) )}
{selectedIds.length > 0 && (
{selectedIds.map((id, index) => { const ex = exerciseMap.get(id); return (
{index + 1}. {ex?.name || `Übung #${id}`}
); })}
)}
); }