import React, { useEffect, useState } from 'react'
import { Link, useNavigate, useParams } from 'react-router-dom'
import api from '../utils/api'
import { resolveExerciseMediaFileUrl } from '../utils/exerciseMediaUrl'
import { sanitizeTrainerHtml } from '../utils/htmlUtils'
import { formatSkillLevelSlug } from '../constants/skillLevels'
function HtmlBlock({ html, className = '' }) {
if (!html || !String(html).trim()) return null
const safe = sanitizeTrainerHtml(html)
return (
Bearbeiten
{exercise.title}
{exercise.summary && (
)}
{exercise.visibility}
{exercise.status}
{exercise.club_name && {exercise.club_name}}
{meta.length > 0 &&
{meta.join(' · ')}
}
{exercise.goal && (
)}
{(exercise.equipment || []).length > 0 && (
Material & Aufbau
{exercise.equipment.map((x, i) => (
- {x}
))}
)}
{exercise.preparation && (
)}
{exercise.execution && (
)}
{visibleMedia.length > 0 && (
Medien
{visibleMedia.map((m) => (
{m.title || m.original_filename || m.media_type}
{String(m.asset_lifecycle_state || 'active').toLowerCase() === 'trash_soft' && (
Hinweis: Dieses Medium ist im Papierkorb und steht künftig nicht mehr zur Verfügung.
)}
{m.description &&
{m.description}
}
))}
)}
{exercise.trainer_notes && (
)}
{(exercise.skills || []).length > 0 && (
Fähigkeiten
{exercise.skills.map((s) => {
const rl = formatSkillLevelSlug(s.required_level)
const tl = formatSkillLevelSlug(s.target_level)
const lvl =
rl || tl ? ` (${[rl, tl].filter(Boolean).join(' → ')})` : ''
return (
{s.skill_name}
{s.intensity ? ` · ${s.intensity}` : ''}
{lvl}
)
})}
)}
{(exercise.variants || []).length > 0 && (
Varianten
{exercise.variants.map((v) => {
const dur =
v.duration_min != null || v.duration_max != null
? v.duration_min != null && v.duration_max != null && v.duration_min !== v.duration_max
? `${v.duration_min}–${v.duration_max} Min.`
: v.duration_min != null
? `ca. ${v.duration_min} Min.`
: `bis ca. ${v.duration_max} Min.`
: null
const diffLabel =
v.difficulty_adjustment === 'easier'
? 'einfacher'
: v.difficulty_adjustment === 'harder'
? 'schwerer'
: v.difficulty_adjustment === 'same'
? 'gleiche Schwierigkeit'
: v.difficulty_adjustment === 'adapted'
? 'angepasst'
: null
const equip =
Array.isArray(v.equipment_changes) && v.equipment_changes.length > 0
? v.equipment_changes.join(', ')
: null
return (
{v.variant_name}
{(dur || diffLabel || equip || v.progression_level != null) && (
{[dur, diffLabel, equip && `Material: ${equip}`, v.progression_level != null && `Progression ${v.progression_level}`]
.filter(Boolean)
.join(' · ')}
)}
{v.description &&
{v.description}
}
{v.execution_changes && (
)}
)
})}
)}
)
}
export default ExerciseDetailPage