import React, { useEffect, useState, useRef, useMemo } from 'react' import { useNavigate, useParams, Link } from 'react-router-dom' import api, { buildExerciseApiPayload } from '../utils/api' import { resolveExerciseMediaFileUrl, resolveMediaAssetFileUrl } from '../utils/exerciseMediaUrl' import RichTextEditor from '../components/RichTextEditor' import ExerciseProgressionGraphPanel from '../components/ExerciseProgressionGraphPanel' import ExerciseMediaThumbTile from '../components/ExerciseMediaThumbTile' import MediaPreviewModal from '../components/MediaPreviewModal' import ReportContentModal from '../components/ReportContentModal' import { SHINKAN_EXERCISE_MEDIA_DRAG_MIME, buildExerciseMediaDragPayload, } from '../utils/exerciseInlineMediaRefs' import { autoScrollForDragNearEdges } from '../utils/dragAutoScroll' import { SKILL_LEVEL_OPTIONS, normalizeSkillLevelSlug } from '../constants/skillLevels' import { useAuth } from '../context/AuthContext' const INTENSITY_OPTIONS = [ { value: '', label: '—' }, { value: 'niedrig', label: 'niedrig' }, { value: 'mittel', label: 'mittel' }, { value: 'hoch', label: 'hoch' }, ] const VARIANT_DIFFICULTY = [ { value: '', label: '—' }, { value: 'easier', label: 'Einfacher' }, { value: 'same', label: 'Gleich' }, { value: 'harder', label: 'Schwerer' }, { value: 'adapted', label: 'Angepasst' }, ] function emptyVariantDraft() { return { variant_name: '', description: '', execution_changes: '', duration_min: '', duration_max: '', equipment_lines: '', difficulty_adjustment: '', progression_level: 1, prerequisite_variant_id: '', } } function apiVariantToRow(v) { let lines = '' const eq = v.equipment_changes if (Array.isArray(eq)) { lines = eq.join('\n') } else if (typeof eq === 'string' && eq.trim()) { try { const p = JSON.parse(eq) lines = Array.isArray(p) ? p.join('\n') : eq } catch { lines = eq } } return { ...v, duration_min: v.duration_min ?? '', duration_max: v.duration_max ?? '', equipment_lines: lines, progression_level: v.progression_level ?? 1, prerequisite_variant_id: v.prerequisite_variant_id ?? '', difficulty_adjustment: v.difficulty_adjustment ?? '', } } function buildVariantPayloadFromRow(row) { const lines = (row.equipment_lines || '') .split(/[\n,]+/) .map((s) => s.trim()) .filter(Boolean) const pl = row.progression_level === '' || row.progression_level == null ? 1 : parseInt(row.progression_level, 10) const so = row.sequence_order === '' || row.sequence_order == null ? null : parseInt(row.sequence_order, 10) return { variant_name: (row.variant_name || '').trim(), description: (row.description || '').trim() || null, execution_changes: (row.execution_changes || '').trim() || null, duration_min: row.duration_min === '' || row.duration_min == null ? null : parseInt(row.duration_min, 10), duration_max: row.duration_max === '' || row.duration_max == null ? null : parseInt(row.duration_max, 10), equipment_changes: lines, difficulty_adjustment: row.difficulty_adjustment || null, progression_level: Number.isNaN(pl) ? 1 : pl, sequence_order: so !== null && Number.isNaN(so) ? null : so, prerequisite_variant_id: row.prerequisite_variant_id === '' || row.prerequisite_variant_id == null ? null : parseInt(row.prerequisite_variant_id, 10), } } /** Gemeinsame Felder für „Variante bearbeiten“ und „Neue Variante“. */ function ExerciseVariantFields({ row, onPatch, prerequisiteOthers, rteMinHeight = '110px', inlineExerciseId, linkedExerciseMedia = [], onExerciseMediaListChanged, }) { return ( <>
onPatch({ variant_name: e.target.value })} minLength={3} />